From b28baed7d308d36d0a330c1087e5f9dd95071a33 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Sat, 10 Oct 2020 23:48:37 +0200 Subject: [PATCH 001/275] Create a safer variant of BlockTransferAllowCreateFB, enable for FF Type 0 Performance improvement by avoiding unnecessary readbacks. New one is called IntraVRAMBlockTransferAllowCreateFB. This one only allows intra-VRAM block transfers to happen on-GPU, such as the one this game uses for bloom. Good chances to avoid missing stuff that actually requires real readback, if there's any. --- Core/Compatibility.cpp | 1 + Core/Compatibility.h | 1 + GPU/Common/FramebufferManagerCommon.cpp | 42 +++++++++++++++---------- assets/compat.ini | 4 +++ 4 files changed, 31 insertions(+), 17 deletions(-) diff --git a/Core/Compatibility.cpp b/Core/Compatibility.cpp index f2738b48ad..475ffd8e8f 100644 --- a/Core/Compatibility.cpp +++ b/Core/Compatibility.cpp @@ -62,6 +62,7 @@ void Compatibility::CheckSettings(IniFile &iniFile, const std::string &gameID) { CheckSetting(iniFile, gameID, "MGS2AcidHack", &flags_.MGS2AcidHack); CheckSetting(iniFile, gameID, "SonicRivalsHack", &flags_.SonicRivalsHack); CheckSetting(iniFile, gameID, "BlockTransferAllowCreateFB", &flags_.BlockTransferAllowCreateFB); + CheckSetting(iniFile, gameID, "IntraVRAMBlockTransferAllowCreateFB", &flags_.IntraVRAMBlockTransferAllowCreateFB); CheckSetting(iniFile, gameID, "YugiohSaveFix", &flags_.YugiohSaveFix); CheckSetting(iniFile, gameID, "ForceUMDDelay", &flags_.ForceUMDDelay); CheckSetting(iniFile, gameID, "ForceMax60FPS", &flags_.ForceMax60FPS); diff --git a/Core/Compatibility.h b/Core/Compatibility.h index c44c64d673..e1f596f8bd 100644 --- a/Core/Compatibility.h +++ b/Core/Compatibility.h @@ -60,6 +60,7 @@ struct CompatFlags { bool MGS2AcidHack; bool SonicRivalsHack; bool BlockTransferAllowCreateFB; + bool IntraVRAMBlockTransferAllowCreateFB; bool YugiohSaveFix; bool ForceUMDDelay; bool ForceMax60FPS; diff --git a/GPU/Common/FramebufferManagerCommon.cpp b/GPU/Common/FramebufferManagerCommon.cpp index 93a6c3c2c9..5ecc84dd88 100644 --- a/GPU/Common/FramebufferManagerCommon.cpp +++ b/GPU/Common/FramebufferManagerCommon.cpp @@ -1180,9 +1180,13 @@ bool FramebufferManagerCommon::NotifyFramebufferCopy(u32 src, u32 dst, int size, } } - if (!dstBuffer && srcBuffer && PSP_CoreParameter().compat.flags().BlockTransferAllowCreateFB) { - dstBuffer = CreateRAMFramebuffer(dst, srcBuffer->width, srcBuffer->height, srcBuffer->fb_stride, srcBuffer->format); - dstY = 0; + if (!dstBuffer && srcBuffer) { + // Note - if we're here, we're in a memcpy, not a block transfer. Not allowing IntraVRAMBlockTransferAllowCreateFB. + // Technically, that makes BlockTransferAllowCreateFB a bit of a misnomer. + if (PSP_CoreParameter().compat.flags().BlockTransferAllowCreateFB) { + dstBuffer = CreateRAMFramebuffer(dst, srcBuffer->width, srcBuffer->height, srcBuffer->fb_stride, srcBuffer->format); + dstY = 0; + } } if (dstBuffer) { dstBuffer->last_frame_used = gpuStats.numFlips; @@ -1308,21 +1312,25 @@ void FramebufferManagerCommon::FindTransferFramebuffers(VirtualFramebuffer *&dst } } - if (srcBuffer && !dstBuffer && PSP_CoreParameter().compat.flags().BlockTransferAllowCreateFB) { - GEBufferFormat ramFormat; - // Try to guess the appropriate format. We only know the bpp from the block transfer command (16 or 32 bit). - if (bpp == 4) { - // Only one possibility unless it's doing split pixel tricks (which we could detect through stride maybe). - ramFormat = GE_FORMAT_8888; - } else if (srcBuffer->format != GE_FORMAT_8888) { - // We guess that the game will interpret the data the same as it was in the source of the copy. - // Seems like a likely good guess, and works in Test Drive Unlimited. - ramFormat = srcBuffer->format; - } else { - // No info left - just fall back to something. But this is definitely split pixel tricks. - ramFormat = GE_FORMAT_5551; + if (srcBuffer && !dstBuffer) { + if (PSP_CoreParameter().compat.flags().BlockTransferAllowCreateFB || + (PSP_CoreParameter().compat.flags().IntraVRAMBlockTransferAllowCreateFB && + Memory::IsVRAMAddress(srcBuffer->fb_address) && Memory::IsVRAMAddress(dstBasePtr))) { + GEBufferFormat ramFormat; + // Try to guess the appropriate format. We only know the bpp from the block transfer command (16 or 32 bit). + if (bpp == 4) { + // Only one possibility unless it's doing split pixel tricks (which we could detect through stride maybe). + ramFormat = GE_FORMAT_8888; + } else if (srcBuffer->format != GE_FORMAT_8888) { + // We guess that the game will interpret the data the same as it was in the source of the copy. + // Seems like a likely good guess, and works in Test Drive Unlimited. + ramFormat = srcBuffer->format; + } else { + // No info left - just fall back to something. But this is definitely split pixel tricks. + ramFormat = GE_FORMAT_5551; + } + dstBuffer = CreateRAMFramebuffer(dstBasePtr, dstWidth, dstHeight, dstStride, ramFormat); } - dstBuffer = CreateRAMFramebuffer(dstBasePtr, dstWidth, dstHeight, dstStride, ramFormat); } if (dstBuffer) diff --git a/assets/compat.ini b/assets/compat.ini index 6fd290455b..e6d8d85d6e 100644 --- a/assets/compat.ini +++ b/assets/compat.ini @@ -552,6 +552,10 @@ ULUS10249 = true ULES00637 = true ULKS46126 = true +[IntraVRAMBlockTransferAllowCreateFB] +# Final Fantasy - Type 0 +NPJH50443 = true + # Note! This whole flag is disabled temporarily by appending "Disabled" to its name). See 7914 [YugiohSaveFixDisabled] # The cause of Yu-gi-oh series 's bad save (cannot save) are load "save status" and use cwcheat, From 59e2bab7ec6b98c76a230e5ed92ab571249c7bbb Mon Sep 17 00:00:00 2001 From: ANR2ME Date: Sun, 11 Oct 2020 09:57:56 +0700 Subject: [PATCH 002/275] Added some network-related missing error codes. --- Core/HLE/proAdhoc.h | 28 ++++++++---- Core/HLE/sceNet.cpp | 2 + Core/HLE/sceNet.h | 96 ++++++++++++++++++++++++++++++++++++++-- Core/HLE/sceNetAdhoc.cpp | 28 +++++++----- 4 files changed, 131 insertions(+), 23 deletions(-) diff --git a/Core/HLE/proAdhoc.h b/Core/HLE/proAdhoc.h index d3848cfcd1..9993a28574 100644 --- a/Core/HLE/proAdhoc.h +++ b/Core/HLE/proAdhoc.h @@ -118,7 +118,7 @@ inline bool isDisconnected(int errcode) { return (errcode == EPIPE || errcode == #define ADHOCCTL_MODE_GAMEMODE 1 // Event Types for Event Handler -#define ADHOCCTL_EVENT_ERROR 0 +#define ADHOCCTL_EVENT_ERROR 0 // Used to pass error code to Adhocctl Handler? #define ADHOCCTL_EVENT_CONNECT 1 #define ADHOCCTL_EVENT_DISCONNECT 2 #define ADHOCCTL_EVENT_SCAN 3 @@ -557,19 +557,24 @@ typedef struct SceNetAdhocMatchingContext { // End of psp definitions enum { + // pspnet_adhoc_auth + ERROR_NET_ADHOC_AUTH_ALREADY_INITIALIZED = 0x80410601, + + // pspnet_adhoc ERROR_NET_ADHOC_INVALID_SOCKET_ID = 0x80410701, ERROR_NET_ADHOC_INVALID_ADDR = 0x80410702, ERROR_NET_ADHOC_INVALID_PORT = 0x80410703, + ERROR_NET_ADHOC_INVALID_BUFLEN = 0x80410704, ERROR_NET_ADHOC_INVALID_DATALEN = 0x80410705, - ERROR_NET_ADHOC_NOT_ENOUGH_SPACE = 0x80400706, + ERROR_NET_ADHOC_NOT_ENOUGH_SPACE = 0x80400706, // not a typo ERROR_NET_ADHOC_SOCKET_DELETED = 0x80410707, ERROR_NET_ADHOC_SOCKET_ALERTED = 0x80410708, ERROR_NET_ADHOC_WOULD_BLOCK = 0x80410709, //ERROR_NET_ADHOC_NO_DATA_AVAILABLE ERROR_NET_ADHOC_PORT_IN_USE = 0x8041070a, ERROR_NET_ADHOC_NOT_CONNECTED = 0x8041070B, ERROR_NET_ADHOC_DISCONNECTED = 0x8041070c, - ERROR_NET_ADHOC_NOT_OPENED = 0x8040070D, - ERROR_NET_ADHOC_NOT_LISTENED = 0x8040070E, + ERROR_NET_ADHOC_NOT_OPENED = 0x8040070D, // not a typo + ERROR_NET_ADHOC_NOT_LISTENED = 0x8040070E, // not a typo ERROR_NET_ADHOC_SOCKET_ID_NOT_AVAIL = 0x8041070F, ERROR_NET_ADHOC_PORT_NOT_AVAIL = 0x80410710, ERROR_NET_ADHOC_INVALID_ARG = 0x80410711, @@ -585,7 +590,9 @@ enum { ERROR_NET_ADHOC_NOT_IN_GAMEMODE = 0x8041071B, ERROR_NET_ADHOC_NOT_CREATED = 0x8041071C, + // pspnet_adhoc_matching ERROR_NET_ADHOC_MATCHING_INVALID_MODE = 0x80410801, + ERROR_NET_ADHOC_MATCHING_INVALID_PORT = 0x80410802, ERROR_NET_ADHOC_MATCHING_INVALID_MAXNUM = 0x80410803, ERROR_NET_ADHOC_MATCHING_RXBUF_TOO_SHORT = 0x80410804, ERROR_NET_ADHOC_MATCHING_INVALID_OPTLEN = 0x80410805, @@ -609,21 +616,26 @@ enum { ERROR_NET_ADHOC_MATCHING_NOT_ESTABLISHED = 0x80410817, ERROR_NET_ADHOC_MATCHING_DATA_BUSY = 0x80410818, + // pspnet_adhocctl + ERROR_NET_ADHOCCTL_NOT_LEFT_IBSS = 0x80410b01, + ERROR_NET_ADHOCCTL_ALREADY_CONNECTED = 0x80410b02, ERROR_NET_ADHOCCTL_WLAN_SWITCH_OFF = 0x80410b03, ERROR_NET_ADHOCCTL_INVALID_ARG = 0x80410B04, + ERROR_NET_ADHOCCTL_TIMEOUT = 0x80410b05, ERROR_NET_ADHOCCTL_ID_NOT_FOUND = 0x80410B06, ERROR_NET_ADHOCCTL_ALREADY_INITIALIZED = 0x80410b07, ERROR_NET_ADHOCCTL_NOT_INITIALIZED = 0x80410b08, ERROR_NET_ADHOCCTL_DISCONNECTED = 0x80410b09, + ERROR_NET_ADHOCCTL_NO_SCAN_INFO = 0x80410b0a, + ERROR_NET_ADHOCCTL_INVALID_IBSS = 0x80410b0b, ERROR_NET_ADHOCCTL_NOT_ENTER_GAMEMODE = 0x80410B0C, ERROR_NET_ADHOCCTL_CHANNEL_NOT_AVAILABLE = 0x80410B0D, + ERROR_NET_ADHOCCTL_WLAN_BEACON_LOST = 0x80410b0e, + ERROR_NET_ADHOCCTL_WLAN_SUSPENDED = 0x80410b0f, ERROR_NET_ADHOCCTL_BUSY = 0x80410b10, + ERROR_NET_ADHOCCTL_CHANNEL_NOT_MATCH = 0x80410b11, ERROR_NET_ADHOCCTL_TOO_MANY_HANDLERS = 0x80410b12, ERROR_NET_ADHOCCTL_STACKSIZE_TOO_SHORT = 0x80410B13, - - ERROR_NET_WLAN_INVALID_ARG = 0x80410D13, - - ERROR_NET_NO_SPACE = 0x80410001 }; const size_t MAX_ADHOCCTL_HANDLERS = 32; //4 diff --git a/Core/HLE/sceNet.cpp b/Core/HLE/sceNet.cpp index 2de660cc5e..499fd1acbd 100644 --- a/Core/HLE/sceNet.cpp +++ b/Core/HLE/sceNet.cpp @@ -674,6 +674,8 @@ static u32 sceWlanGetEtherAddr(u32 addrAddr) { return hleLogError(SCENET, SCE_KERNEL_ERROR_ILLEGAL_ADDR, "illegal address"); } + // FIXME: Return 0x80410180 (pspnet[_core] error code?) when Adhocctl not connected to a group (ie. ADHOCCTL_STATE_DISCONNECTED)? + u8 *addr = Memory::GetPointer(addrAddr); if (PPSSPP_ID > 1) { Memory::Memset(addrAddr, PPSSPP_ID, 6); diff --git a/Core/HLE/sceNet.h b/Core/HLE/sceNet.h index 3ea8b9811d..a1ba8285c3 100644 --- a/Core/HLE/sceNet.h +++ b/Core/HLE/sceNet.h @@ -49,14 +49,80 @@ const size_t MAX_APCTL_HANDLERS = 32; enum { - ERROR_NET_BUFFER_TOO_SMALL = 0x80400706, + // net common errors + ERROR_NET_NO_SPACE = 0x80410001, + ERROR_NET_INTERNAL = 0x80410002, + ERROR_NET_INVALID_ARG = 0x80410003, + ERROR_NET_NO_ENTRY = 0x80410004, + // pspnet_core + ERROR_NET_CORE_NOT_TERMINATED = 0x80410101, + ERROR_NET_CORE_INTERFACE_BUSY = 0x80410102, + ERROR_NET_CORE_INVALID_ARG = 0x80410103, + ERROR_NET_CORE_THREAD_NOT_FOUND = 0x80410104, + ERROR_NET_CORE_THREAD_BUSY = 0x80410105, + ERROR_NET_CORE_80211_NO_BSS = 0x80410106, + ERROR_NET_CORE_80211_NO_AVAIL_BSS = 0x80410107, + + // pspnet_inet ERROR_NET_INET_ALREADY_INITIALIZED = 0x80410201, + ERROR_NET_INET_SOCKET_BUSY = 0x80410202, + ERROR_NET_INET_CONFIG_INVALID_ARG = 0x80410203, + ERROR_NET_INET_GET_IFADDR = 0x80410204, + ERROR_NET_INET_SET_IFADDR = 0x80410205, + ERROR_NET_INET_DEL_IFADDR = 0x80410206, + ERROR_NET_INET_NO_DEFAULT_ROUTE = 0x80410207, + ERROR_NET_INET_GET_ROUTE = 0x80410208, + ERROR_NET_INET_SET_ROUTE = 0x80410209, + ERROR_NET_INET_FLUSH_ROUTE = 0x8041020a, + ERROR_NET_INET_INVALID_ARG = 0x8041020b, - ERROR_NET_RESOLVER_BAD_ID = 0x80410408, + // pspnet_poeclient + ERROR_NET_POECLIENT_INIT = 0x80410301, + ERROR_NET_POECLIENT_NO_PADO = 0x80410302, + ERROR_NET_POECLIENT_NO_PADS = 0x80410303, + ERROR_NET_POECLIENT_GET_PADT = 0x80410304, + ERROR_NET_POECLIENT_SERVICE_NAME = 0x80410305, + ERROR_NET_POECLIENT_AC_SYSTEM = 0x80410306, + ERROR_NET_POECLIENT_GENERIC = 0x80410307, + ERROR_NET_POECLIENT_AUTH = 0x80410308, + ERROR_NET_POECLIENT_NETWORK = 0x80410309, + ERROR_NET_POECLIENT_TERMINATE = 0x8041030a, + ERROR_NET_POECLIENT_NOT_STARTED = 0x8041030b, + + // pspnet_resolver + ERROR_NET_RESOLVER_NOT_TERMINATED = 0x80410401, + ERROR_NET_RESOLVER_NO_DNS_SERVER = 0x80410402, + ERROR_NET_RESOLVER_INVALID_PTR = 0x80410403, + ERROR_NET_RESOLVER_INVALID_BUFLEN = 0x80410404, + ERROR_NET_RESOLVER_INVALID_ID = 0x80410405, + ERROR_NET_RESOLVER_ID_MAX = 0x80410406, + ERROR_NET_RESOLVER_NO_MEM = 0x80410407, + ERROR_NET_RESOLVER_BAD_ID = 0x80410408, // ERROR_NET_RESOLVER_ID_NOT_FOUND + ERROR_NET_RESOLVER_CTX_BUSY = 0x80410409, ERROR_NET_RESOLVER_ALREADY_STOPPED = 0x8041040a, - ERROR_NET_RESOLVER_INVALID_HOST = 0x80410414, + ERROR_NET_RESOLVER_NOT_SUPPORTED = 0x8041040b, + ERROR_NET_RESOLVER_BUF_NO_SPACE = 0x8041040c, + ERROR_NET_RESOLVER_INVALID_PACKET = 0x8041040d, + ERROR_NET_RESOLVER_STOPPED = 0x8041040e, + ERROR_NET_RESOLVER_SOCKET = 0x8041040f, + ERROR_NET_RESOLVER_TIMEOUT = 0x80410410, + ERROR_NET_RESOLVER_NO_RECORD = 0x80410411, + ERROR_NET_RESOLVER_RES_PACKET_FORMAT = 0x80410412, + ERROR_NET_RESOLVER_RES_SERVER_FAILURE = 0x80410413, + ERROR_NET_RESOLVER_INVALID_HOST = 0x80410414, // ERROR_NET_RESOLVER_NO_HOST + ERROR_NET_RESOLVER_RES_NOT_IMPLEMENTED = 0x80410415, + ERROR_NET_RESOLVER_RES_SERVER_REFUSED = 0x80410416, + ERROR_NET_RESOLVER_INTERNAL = 0x80410417, + // pspnet_dhcp + ERROR_NET_DHCP_INVALID_PACKET = 0x80410501, + ERROR_NET_DHCP_NO_SERVER = 0x80410502, + ERROR_NET_DHCP_SENT_DECLINE = 0x80410503, + ERROR_NET_DHCP_LEASE_TIME = 0x80410504, + ERROR_NET_DHCP_GET_NAK = 0x80410505, + + // pspnet_apctl ERROR_NET_APCTL_ALREADY_INITIALIZED = 0x80410a01, ERROR_NET_APCTL_INVALID_CODE = 0x80410a02, ERROR_NET_APCTL_INVALID_IP = 0x80410a03, @@ -68,6 +134,30 @@ enum { ERROR_NET_APCTL_INVALID_ID = 0x80410a09, ERROR_NET_APCTL_WLAN_SUSPENDED = 0x80410a0a, ERROR_NET_APCTL_TIMEOUT = 0x80410a0b, + + // wlan errors + ERROR_NET_WLAN_ALREADY_JOINED = 0x80410d01, + ERROR_NET_WLAN_TRY_JOIN = 0x80410d02, + ERROR_NET_WLAN_SCANNING = 0x80410d03, + ERROR_NET_WLAN_INVALID_PARAMETER = 0x80410d04, + ERROR_NET_WLAN_NOT_SUPPORTED = 0x80410d05, + ERROR_NET_WLAN_NOT_JOIN_BSS = 0x80410d06, + ERROR_NET_WLAN_ASSOC_TIMEOUT = 0x80410d07, + ERROR_NET_WLAN_ASSOC_REFUSED = 0x80410d08, + ERROR_NET_WLAN_ASSOC_FAIL = 0x80410d09, + ERROR_NET_WLAN_DISASSOC_FAIL = 0x80410d0a, + ERROR_NET_WLAN_JOIN_FAIL = 0x80410d0b, + ERROR_NET_WLAN_POWER_OFF = 0x80410d0c, + ERROR_NET_WLAN_INTERNAL_FAIL = 0x80410d0d, + ERROR_NET_WLAN_DEVICE_NOT_READY = 0x80410d0e, + ERROR_NET_WLAN_ALREADY_ATTACHED = 0x80410d0f, + ERROR_NET_WLAN_NOT_SET_WEP = 0x80410d10, + ERROR_NET_WLAN_TIMEOUT = 0x80410d11, + ERROR_NET_WLAN_NO_SPACE = 0x80410d12, + ERROR_NET_WLAN_INVALID_ARG = 0x80410D13, + ERROR_NET_WLAN_NOT_IN_GAMEMODE = 0x80410d14, + ERROR_NET_WLAN_LEAVE_FAIL = 0x80410d15, + ERROR_NET_WLAN_SUSPENDED = 0x80410d16, }; enum { diff --git a/Core/HLE/sceNetAdhoc.cpp b/Core/HLE/sceNetAdhoc.cpp index f52b486cb6..f61decf477 100644 --- a/Core/HLE/sceNetAdhoc.cpp +++ b/Core/HLE/sceNetAdhoc.cpp @@ -1022,6 +1022,9 @@ u32 sceNetAdhocInit() { static u32 sceNetAdhocctlInit(int stackSize, int prio, u32 productAddr) { INFO_LOG(SCENET, "sceNetAdhocctlInit(%i, %i, %08x) at %08x", stackSize, prio, productAddr, currentMIPS->pc); + // FIXME: Returning 0x8002013a (SCE_KERNEL_ERROR_LIBRARY_NOT_YET_LINKED) without adhoc module loaded first? + // FIXME: Sometimes returning 0x80410601 (ERROR_NET_ADHOC_AUTH_ALREADY_INITIALIZED / Library module is already initialized ?) when AdhocctlTerm is not fully done? + if (netAdhocctlInited) return ERROR_NET_ADHOCCTL_ALREADY_INITIALIZED; @@ -1913,7 +1916,7 @@ static int sceNetAdhocPdpDelete(int id, int unknown) { } static int sceNetAdhocctlGetAdhocId(u32 productStructAddr) { - ERROR_LOG(SCENET, "UNIMPL sceNetAdhocctlGetAdhocId(%08x)", productStructAddr); + INFO_LOG(SCENET, "sceNetAdhocctlGetAdhocId(%08x) at %08x", productStructAddr, currentMIPS->pc); // Library initialized if (netAdhocctlInited) @@ -1921,21 +1924,19 @@ static int sceNetAdhocctlGetAdhocId(u32 productStructAddr) { // Valid Arguments if (Memory::IsValidAddress(productStructAddr)) { - SceNetAdhocctlAdhocId * adhoc_id = (SceNetAdhocctlAdhocId *)Memory::GetPointer(productStructAddr); // Copy Product ID - *adhoc_id = product_code; - //Memory::WriteStruct(productStructAddr, &product_code); + Memory::WriteStruct(productStructAddr, &product_code); // Return Success - return 0; + return hleLogDebug(SCENET, 0, "type = %d, code = %s", product_code.type, product_code.data); } // Invalid Arguments - return ERROR_NET_ADHOCCTL_INVALID_ARG; + return hleLogDebug(SCENET, ERROR_NET_ADHOCCTL_INVALID_ARG, "invalid arg"); } // Library uninitialized - return ERROR_NET_ADHOCCTL_NOT_INITIALIZED; + return hleLogDebug(SCENET, ERROR_NET_ADHOCCTL_NOT_INITIALIZED, "not initialized"); } // FIXME: Scan probably not a blocking function since there is ADHOCCTL_STATE_SCANNING state that can be polled by the game, right? But apparently it need to be delayed for Naruto Shippuden Ultimate Ninja Heroes 3 @@ -1989,8 +1990,8 @@ int sceNetAdhocctlScan() { return ERROR_NET_ADHOCCTL_BUSY; // Already connected to a group. Should we fake a success? - // We need to notify the handler on success, even if it was faked - notifyAdhocctlHandlers(ADHOCCTL_EVENT_SCAN, 0); + // We need to notify the handler on success, even if it was faked. Using flag = 0/ADHOCCTL_EVENT_ERROR for error? + notifyAdhocctlHandlers(ADHOCCTL_EVENT_ERROR, ERROR_NET_ADHOCCTL_ALREADY_CONNECTED); // FIXME: returning ERROR_NET_ADHOCCTL_BUSY may trigger the game (ie. Ford Street Racing) to call sceNetAdhocctlDisconnect, But Not returning a Success(0) will cause Valhalla Knights 2 not working properly hleEatMicro(us); return 0; @@ -5256,7 +5257,8 @@ void __NetTriggerCallbacks() newState = ADHOCCTL_STATE_WOL; break; case ADHOCCTL_EVENT_ERROR: - newState = ADHOCCTL_STATE_DISCONNECTED; + // FIXME: Should we change the state on error or leave it alone? for example after Creating/Joining a group, doing Scan could trigger an error through handler, what about the AdhocctlState after this error? + //newState = ADHOCCTL_STATE_DISCONNECTED; break; } @@ -5413,6 +5415,8 @@ static int sceNetAdhocctlGetPeerList(u32 sizeAddr, u32 bufAddr) { if (netAdhocctlInited) { // Minimum Arguments if (buflen != NULL) { + // FIXME: Sometimes returing 0x80410682 before AdhocctlGetState became ADHOCCTL_STATE_CONNECTED or related to Auth/Library ? + // Multithreading Lock peerlock.lock(); @@ -5481,11 +5485,11 @@ static int sceNetAdhocctlGetPeerList(u32 sizeAddr, u32 bufAddr) { } // Invalid Arguments - return ERROR_NET_ADHOCCTL_INVALID_ARG; + return hleLogDebug(SCENET, ERROR_NET_ADHOCCTL_INVALID_ARG, "invalid arg"); } // Uninitialized Library - return ERROR_NET_ADHOCCTL_NOT_INITIALIZED; + return hleLogDebug(SCENET, ERROR_NET_ADHOCCTL_NOT_INITIALIZED, "not initialized"); } static int sceNetAdhocctlGetAddrByName(const char *nickName, u32 sizeAddr, u32 bufAddr) { From 00b11115bb2917cb3a93f0c4e4ff1bafa10e60b4 Mon Sep 17 00:00:00 2001 From: ANR2ME Date: Sun, 11 Oct 2020 12:40:34 +0700 Subject: [PATCH 003/275] Fixed timeout issue due to the latest CoreTiming::GetGlobalTimeUsScaled() have a possibility to get smaller number than the previous one. --- Core/HLE/proAdhoc.cpp | 10 +++++----- Core/HLE/sceNetAdhoc.cpp | 24 ++++++++++++------------ 2 files changed, 17 insertions(+), 17 deletions(-) diff --git a/Core/HLE/proAdhoc.cpp b/Core/HLE/proAdhoc.cpp index 34fafd6f4a..994b781194 100644 --- a/Core/HLE/proAdhoc.cpp +++ b/Core/HLE/proAdhoc.cpp @@ -983,8 +983,8 @@ void handleTimeout(SceNetAdhocMatchingContext * context) SceNetAdhocMatchingMemberInternal * next = peer->next; u64_le now = CoreTiming::GetGlobalTimeUsScaled(); //time_now_d()*1000000.0 - // Timeout! - if (peer->state != 0 && (now - peer->lastping) > context->timeout) + // Timeout! Apparently the latest GetGlobalTimeUsScaled (ie. now) have a possibility to be smaller than previous GetGlobalTimeUsScaled (ie. lastping) thus resulting a negative number when subtracted :( + if (peer->state != 0 && static_cast(now - peer->lastping) > static_cast(context->timeout)) { // Spawn Timeout Event if ((context->mode == PSP_ADHOC_MATCHING_MODE_CHILD && peer->state == PSP_ADHOC_MATCHING_PEER_PARENT) || @@ -993,7 +993,7 @@ void handleTimeout(SceNetAdhocMatchingContext * context) // FIXME: TIMEOUT event should only be triggered on Parent/P2P mode and for Parent/P2P peer? spawnLocalEvent(context, PSP_ADHOC_MATCHING_EVENT_TIMEOUT, &peer->mac, 0, NULL); - INFO_LOG(SCENET, "TimedOut Member Peer %s (%lldms)", mac2str(&peer->mac).c_str(), (context->timeout / 1000)); + INFO_LOG(SCENET, "TimedOut Member Peer %s (%lld - %lld = %lld > %lld us)", mac2str(&peer->mac).c_str(), now, peer->lastping, (now - peer->lastping), context->timeout); if (context->mode == PSP_ADHOC_MATCHING_MODE_PARENT) sendDeathMessage(context, peer); @@ -1348,7 +1348,7 @@ int friendFinder(){ // Ping Server now = time_now_d() * 1000000.0; // Use time_now_d()*1000000.0 instead of CoreTiming::GetGlobalTimeUsScaled() if the game gets disconnected from AdhocServer too soon when FPS wasn't stable // original code : ((sceKernelGetSystemTimeWide() - lastping) >= ADHOCCTL_PING_TIMEOUT) - if (now - lastping >= PSP_ADHOCCTL_PING_TIMEOUT) { // We may need to use lower interval to prevent getting timeout at Pro Adhoc Server through internet + if (static_cast(now - lastping) >= PSP_ADHOCCTL_PING_TIMEOUT) { // We may need to use lower interval to prevent getting timeout at Pro Adhoc Server through internet // Prepare Packet uint8_t opcode = OPCODE_PING; @@ -2064,7 +2064,7 @@ int initNetwork(SceNetAdhocctlAdhocId *adhoc_id){ parameter.channel = g_Config.iWlanAdhocChannel; // Assign a Valid Channel when connected to AP/Adhoc if it's Auto. JPCSP use 11 as default for Auto (Commonly for Auto: 1, 6, 11) if (parameter.channel == PSP_SYSTEMPARAM_ADHOC_CHANNEL_AUTOMATIC) parameter.channel = defaultWlanChannel; // Faked Active channel to default channel - getLocalMac(¶meter.bssid.mac_addr); + //getLocalMac(¶meter.bssid.mac_addr); // Default ProductId product_code.type = adhoc_id->type; diff --git a/Core/HLE/sceNetAdhoc.cpp b/Core/HLE/sceNetAdhoc.cpp index f61decf477..d14ed27a35 100644 --- a/Core/HLE/sceNetAdhoc.cpp +++ b/Core/HLE/sceNetAdhoc.cpp @@ -1108,7 +1108,7 @@ static int sceNetAdhocPdpCreate(const char *mac, int port, int bufferSize, u32 f return hleLogDebug(SCENET, ERROR_NET_ADHOC_PORT_IN_USE, "port in use"); //sport 0 should be shifted back to 0 when using offset Phantasy Star Portable 2 use this - if (port == 0) port = -(int)portOffset; + if (port == 0) port = -static_cast(portOffset); // Some games (ie. DBZ Shin Budokai 2) might be getting the saddr/srcmac content from SaveState and causing problems :( So we try to fix it here if (saddr != NULL) { getLocalMac(saddr); @@ -1736,7 +1736,7 @@ int PollAdhocSocket(SceNetAdhocPollSd* sds, int count, int timeout, int nonblock } // Fate Unlimited Codes and Carnage Heart EXA relies on AdhocPollSocket in order to retry a failed PtpConnect, but the interval must not be too long (about 1 frame before state became Established by GetPtpStat) for Bleach Heat the Soul 7 to work properly. else if ((sds[i].events & ADHOC_EV_CONNECT) && ((sock->data.ptp.state == ADHOC_PTP_STATE_CLOSED && sock->attemptCount == 0) || - (sock->data.ptp.state == ADHOC_PTP_STATE_SYN_SENT && (CoreTiming::GetGlobalTimeUsScaled() - sock->lastAttempt > 1000/*std::max(1000, sock->retry_interval - 60000)*/)))) { + (sock->data.ptp.state == ADHOC_PTP_STATE_SYN_SENT && (static_cast(CoreTiming::GetGlobalTimeUsScaled() - sock->lastAttempt) > 1000/*std::max(1000, sock->retry_interval - 60000)*/)))) { sds[i].revents |= ADHOC_EV_CONNECT; } @@ -2384,7 +2384,7 @@ int sceNetAdhocctlGetPeerInfo(const char *mac, int size, u32 peerInfoAddr) { buf->mac_addr = *maddr; buf->flags = 0x0400; buf->padding = 0; - buf->last_recv = CoreTiming::GetGlobalTimeUsScaled() - defaultLastRecvDelta; + buf->last_recv = std::max(0LL, static_cast(CoreTiming::GetGlobalTimeUsScaled() - defaultLastRecvDelta)); // Success retval = 0; @@ -2834,7 +2834,7 @@ static int sceNetAdhocGetPtpStat(u32 structSize, u32 structAddr) { if ( sock != NULL && sock->type == SOCK_PTP) { // Update connection state. // GvG Next Plus relies on GetPtpStat to determine if Connection has been Established or not, but should not be updated too long for GvG to work, and should not be updated too fast(need to be 1 frame after PollSocket checking for ADHOC_EV_CONNECT) for Bleach Heat the Soul 7 to work properly. - if ((sock->data.ptp.state == ADHOC_PTP_STATE_SYN_SENT || sock->data.ptp.state == ADHOC_PTP_STATE_SYN_RCVD) && (CoreTiming::GetGlobalTimeUsScaled() - sock->lastAttempt > 35000/*sock->retry_interval*/)) { + if ((sock->data.ptp.state == ADHOC_PTP_STATE_SYN_SENT || sock->data.ptp.state == ADHOC_PTP_STATE_SYN_RCVD) && (static_cast(CoreTiming::GetGlobalTimeUsScaled() - sock->lastAttempt) > 35000/*sock->retry_interval*/)) { // FIXME: May be we should poll all of them together on a single poll call instead of each socket separately? if (IsSocketReady(sock->data.ptp.id, true, true) > 0) { sock->data.ptp.state = ADHOC_PTP_STATE_ESTABLISHED; @@ -2917,7 +2917,7 @@ static int sceNetAdhocPtpOpen(const char *srcmac, int sport, const char *dstmac, if (sport == 0) { isClient = true; //sport 0 should be shifted back to 0 when using offset Phantasy Star Portable 2 use this - sport = -(int)portOffset; + sport = -static_cast(portOffset); } // Valid Arguments @@ -3436,7 +3436,7 @@ static int sceNetAdhocPtpListen(const char *srcmac, int sport, int bufsize, int // Random Port required if (sport == 0) { //sport 0 should be shifted back to 0 when using offset Phantasy Star Portable 2 use this - sport = -(int)portOffset; + sport = -static_cast(portOffset); } // Valid Arguments @@ -5548,7 +5548,7 @@ static int sceNetAdhocctlGetAddrByName(const char *nickName, u32 sizeAddr, u32 b getLocalMac(&mac); buf[discovered].mac_addr = mac; buf[discovered].flags = 0x0400; - u64 lastrecv = CoreTiming::GetGlobalTimeUsScaled() - defaultLastRecvDelta; + u64 lastrecv = std::max(0LL, static_cast(CoreTiming::GetGlobalTimeUsScaled() - defaultLastRecvDelta)); buf[discovered++].last_recv = lastrecv; DEBUG_LOG(SCENET, "Peer [%s][%s][%s][%llu]", mac2str(&mac).c_str(), inet_ntoa(addr.sin_addr), nickName, lastrecv); @@ -6846,7 +6846,7 @@ int matchingInputThread(int matchingId) // TODO: The MatchingInput thread is usi { // Hello Message Broadcast necessary because of Hello Interval if (context->hello_int > 0) - if ((now - lasthello) >= context->hello_int) + if (static_cast(now - lasthello) >= static_cast(context->hello_int)) { // Broadcast Hello Message broadcastHelloMessage(context); @@ -6858,7 +6858,7 @@ int matchingInputThread(int matchingId) // TODO: The MatchingInput thread is usi // Ping Required if (context->keepalive_int > 0) - if ((now - lastping) >= context->keepalive_int) + if (static_cast(now - lastping) >= static_cast(context->keepalive_int)) { // Broadcast Ping Message broadcastPingMessage(context); @@ -6939,9 +6939,9 @@ int matchingInputThread(int matchingId) // TODO: The MatchingInput thread is usi SceNetAdhocctlPeerInfo* peer = findFriend(&sendermac); if (peer != NULL) { now = CoreTiming::GetGlobalTimeUsScaled(); - u64_le delta = now - peer->last_recv; - DEBUG_LOG(SCENET, "Timestamp Delta: %llu (%llu - %llu) from %s", delta, now, peer->last_recv, mac2str(&sendermac).c_str()); - if (peer->last_recv != 0) peer->last_recv = now - defaultLastRecvDelta; + s64 delta = now - peer->last_recv; + DEBUG_LOG(SCENET, "Timestamp LastRecv Delta: %lld (%llu - %llu) from %s", delta, now, peer->last_recv, mac2str(&sendermac).c_str()); + if (peer->last_recv != 0) peer->last_recv = std::max(peer->last_recv, now - defaultLastRecvDelta); } else { WARN_LOG(SCENET, "InputLoop[%d]: Unknown Peer[%s:%u] (Recved=%i, Length=%i)", matchingId, mac2str(&sendermac).c_str(), senderport, recvresult, rxbuflen); From 2d68dc1c160b6430b0946547f278aec7ec25b212 Mon Sep 17 00:00:00 2001 From: shenweip <1037567878@qq.com> Date: Sun, 11 Oct 2020 16:19:06 +0800 Subject: [PATCH 004/275] Workaround for date bug in Car Jack Streets. --- Core/Compatibility.cpp | 1 + Core/Compatibility.h | 1 + Core/HLE/sceKernelTime.cpp | 9 +++++++++ assets/compat.ini | 4 ++++ 4 files changed, 15 insertions(+) diff --git a/Core/Compatibility.cpp b/Core/Compatibility.cpp index 475ffd8e8f..c607c0a076 100644 --- a/Core/Compatibility.cpp +++ b/Core/Compatibility.cpp @@ -72,6 +72,7 @@ void Compatibility::CheckSettings(IniFile &iniFile, const std::string &gameID) { CheckSetting(iniFile, gameID, "ForceSoftwareRenderer", &flags_.ForceSoftwareRenderer); CheckSetting(iniFile, gameID, "DarkStalkersPresentHack", &flags_.DarkStalkersPresentHack); CheckSetting(iniFile, gameID, "ReportSmallMemstick", &flags_.ReportSmallMemstick); + CheckSetting(iniFile, gameID, "DateLimited", &flags_.DateLimited); } void Compatibility::CheckSetting(IniFile &iniFile, const std::string &gameID, const char *option, bool *flag) { diff --git a/Core/Compatibility.h b/Core/Compatibility.h index e1f596f8bd..626d4f816c 100644 --- a/Core/Compatibility.h +++ b/Core/Compatibility.h @@ -70,6 +70,7 @@ struct CompatFlags { bool ForceSoftwareRenderer; bool DarkStalkersPresentHack; bool ReportSmallMemstick; + bool DateLimited; }; class IniFile; diff --git a/Core/HLE/sceKernelTime.cpp b/Core/HLE/sceKernelTime.cpp index 8bfa812e30..67fe49189f 100644 --- a/Core/HLE/sceKernelTime.cpp +++ b/Core/HLE/sceKernelTime.cpp @@ -32,6 +32,7 @@ #include "Core/HLE/sceKernelThread.h" #include "Core/HLE/sceRtc.h" #include "Core/MemMap.h" +#include "Core/System.h" #include "StringUtils.h" // The time when the game started. @@ -40,6 +41,14 @@ static time_t start_time; void __KernelTimeInit() { time(&start_time); + if (PSP_CoreParameter().compat.flags().DateLimited) { + // Car Jack Streets(NPUZ00043) requires that the date cannot exceed a certain time. + // 2011 year makes it work fine. + tm *tm; + tm = localtime(&start_time); + tm->tm_year = 111;// 2011 year. + start_time = mktime(tm); + } } void __KernelTimeDoState(PointerWrap &p) diff --git a/assets/compat.ini b/assets/compat.ini index e6d8d85d6e..d036ffcff3 100644 --- a/assets/compat.ini +++ b/assets/compat.ini @@ -783,3 +783,7 @@ ULES00235 = true ULJM05225 = true CPCS01043 = true ULUS10062 = true + +[DateLimited] +# Car Jack Streets - issue #12698 +NPUZ00043 = true From dc0f7ca8ee49db4c225c2f8a93d3f8af5827c2e5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Sun, 11 Oct 2020 10:52:55 +0200 Subject: [PATCH 005/275] VK: Copy depth buffer if we can't blit. Some GPUs can't blit to depth. Fixes some recent issues with Intel GPUs on Vulkan. --- Common/GPU/Vulkan/VulkanContext.cpp | 10 +++++++--- Common/GPU/Vulkan/VulkanContext.h | 1 + GPU/Common/FramebufferManagerCommon.cpp | 2 +- GPU/GPUState.h | 1 + GPU/Vulkan/GPU_Vulkan.cpp | 4 ++++ 5 files changed, 14 insertions(+), 4 deletions(-) diff --git a/Common/GPU/Vulkan/VulkanContext.cpp b/Common/GPU/Vulkan/VulkanContext.cpp index ef139e4ca7..9435c988d3 100644 --- a/Common/GPU/Vulkan/VulkanContext.cpp +++ b/Common/GPU/Vulkan/VulkanContext.cpp @@ -537,9 +537,13 @@ void VulkanContext::ChooseDevice(int physical_device) { break; } } - if (deviceInfo_.preferredDepthStencilFormat == VK_FORMAT_UNDEFINED) { - // WTF? This is bad. - ERROR_LOG(G3D, "Could not find a usable depth stencil format."); + + _assert_msg_(deviceInfo_.preferredDepthStencilFormat != VK_FORMAT_UNDEFINED, "Could not find a usable depth stencil format."); + VkFormatProperties preferredProps; + vkGetPhysicalDeviceFormatProperties(physical_devices_[physical_device_], deviceInfo_.preferredDepthStencilFormat, &preferredProps); + if ((preferredProps.optimalTilingFeatures & VK_FORMAT_FEATURE_BLIT_SRC_BIT) && + (preferredProps.optimalTilingFeatures & VK_FORMAT_FEATURE_BLIT_DST_BIT)) { + deviceInfo_.canBlitToPreferredDepthStencilFormat = true; } // This is as good a place as any to do this. diff --git a/Common/GPU/Vulkan/VulkanContext.h b/Common/GPU/Vulkan/VulkanContext.h index a14f96bdd7..ec2fa44beb 100644 --- a/Common/GPU/Vulkan/VulkanContext.h +++ b/Common/GPU/Vulkan/VulkanContext.h @@ -52,6 +52,7 @@ enum WindowSystem { struct VulkanPhysicalDeviceInfo { VkFormat preferredDepthStencilFormat; + bool canBlitToPreferredDepthStencilFormat; }; // This is a bit repetitive... diff --git a/GPU/Common/FramebufferManagerCommon.cpp b/GPU/Common/FramebufferManagerCommon.cpp index 5ecc84dd88..cb656a35ef 100644 --- a/GPU/Common/FramebufferManagerCommon.cpp +++ b/GPU/Common/FramebufferManagerCommon.cpp @@ -471,7 +471,7 @@ void FramebufferManagerCommon::BlitFramebufferDepth(VirtualFramebuffer *src, Vir int h = std::min(src->renderHeight, dst->renderHeight); // Note: We prefer Blit ahead of Copy here, since at least on GL, Copy will always also copy stencil which we don't want. See #9740. - if (gstate_c.Supports(GPU_SUPPORTS_FRAMEBUFFER_BLIT)) { + if (gstate_c.Supports(GPU_SUPPORTS_FRAMEBUFFER_BLIT_TO_DEPTH)) { draw_->BlitFramebuffer(src->fbo, 0, 0, w, h, dst->fbo, 0, 0, w, h, Draw::FB_DEPTH_BIT, Draw::FB_BLIT_NEAREST, "BlitFramebufferDepth"); RebindFramebuffer("BlitFramebufferDepth"); } else if (gstate_c.Supports(GPU_SUPPORTS_COPY_IMAGE)) { diff --git a/GPU/GPUState.h b/GPU/GPUState.h index f012e023bc..b23b6fd1fb 100644 --- a/GPU/GPUState.h +++ b/GPU/GPUState.h @@ -490,6 +490,7 @@ enum { GPU_ROUND_DEPTH_TO_16BIT = FLAG_BIT(23), // Can be disabled either per game or if we use a real 16-bit depth buffer GPU_SUPPORTS_TEXTURE_LOD_CONTROL = FLAG_BIT(24), GPU_SUPPORTS_FRAMEBUFFER_BLIT = FLAG_BIT(26), + GPU_SUPPORTS_FRAMEBUFFER_BLIT_TO_DEPTH = FLAG_BIT(27), GPU_SUPPORTS_OES_TEXTURE_NPOT = FLAG_BIT(28), GPU_NEEDS_Z_EQUAL_W_HACK = FLAG_BIT(29), GPU_PREFER_CPU_DOWNLOAD = FLAG_BIT(30), diff --git a/GPU/Vulkan/GPU_Vulkan.cpp b/GPU/Vulkan/GPU_Vulkan.cpp index 197774e8d5..caa979b8b8 100644 --- a/GPU/Vulkan/GPU_Vulkan.cpp +++ b/GPU/Vulkan/GPU_Vulkan.cpp @@ -233,6 +233,10 @@ void GPU_Vulkan::CheckGPUFeatures() { features |= GPU_SUPPORTS_TEXTURE_FLOAT; features |= GPU_PREFER_CPU_DOWNLOAD; + if (vulkan_->GetDeviceInfo().canBlitToPreferredDepthStencilFormat) { + features |= GPU_SUPPORTS_FRAMEBUFFER_BLIT_TO_DEPTH; + } + if (vulkan_->GetDeviceFeatures().enabled.wideLines) { features |= GPU_SUPPORTS_WIDE_LINES; } From 940611fe654489000b9f9e57e1b510cef54556b9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Sun, 11 Oct 2020 09:19:06 +0200 Subject: [PATCH 006/275] Remove the USE_GENERAL_LAYOUT_FOR* debug defines. --- Common/GPU/Vulkan/VulkanContext.cpp | 18 -------- Common/GPU/Vulkan/VulkanContext.h | 6 --- Common/GPU/Vulkan/VulkanQueueRunner.cpp | 55 ------------------------- Common/GPU/Vulkan/thin3d_vulkan.cpp | 4 -- GPU/Vulkan/DrawEngineVulkan.cpp | 12 ------ GPU/Vulkan/VulkanUtil.cpp | 8 ---- 6 files changed, 103 deletions(-) diff --git a/Common/GPU/Vulkan/VulkanContext.cpp b/Common/GPU/Vulkan/VulkanContext.cpp index 9435c988d3..0a572cf8ac 100644 --- a/Common/GPU/Vulkan/VulkanContext.cpp +++ b/Common/GPU/Vulkan/VulkanContext.cpp @@ -1126,24 +1126,6 @@ void TransitionImageLayout2(VkCommandBuffer cmd, VkImage image, int baseMip, int VkImageLayout oldImageLayout, VkImageLayout newImageLayout, VkPipelineStageFlags srcStageMask, VkPipelineStageFlags dstStageMask, VkAccessFlags srcAccessMask, VkAccessFlags dstAccessMask) { -#ifdef VULKAN_USE_GENERAL_LAYOUT_FOR_COLOR - if (aspectMask == VK_IMAGE_ASPECT_COLOR_BIT) { - // Hack to disable transaction elimination on ARM Mali. - if (oldImageLayout == VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL || oldImageLayout == VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL) - oldImageLayout = VK_IMAGE_LAYOUT_GENERAL; - if (newImageLayout == VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL || newImageLayout == VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL) - newImageLayout = VK_IMAGE_LAYOUT_GENERAL; - } -#endif -#ifdef VULKAN_USE_GENERAL_LAYOUT_FOR_DEPTH_STENCIL - if (aspectMask != VK_IMAGE_ASPECT_COLOR_BIT) { - // Hack to disable transaction elimination on ARM Mali. - if (oldImageLayout == VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL || oldImageLayout == VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL) - oldImageLayout = VK_IMAGE_LAYOUT_GENERAL; - if (newImageLayout == VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL || newImageLayout == VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL) - newImageLayout = VK_IMAGE_LAYOUT_GENERAL; - } -#endif VkImageMemoryBarrier image_memory_barrier{ VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER }; image_memory_barrier.srcAccessMask = srcAccessMask; image_memory_barrier.dstAccessMask = dstAccessMask; diff --git a/Common/GPU/Vulkan/VulkanContext.h b/Common/GPU/Vulkan/VulkanContext.h index ec2fa44beb..db467eff93 100644 --- a/Common/GPU/Vulkan/VulkanContext.h +++ b/Common/GPU/Vulkan/VulkanContext.h @@ -107,12 +107,6 @@ private: std::vector callbacks_; }; -// Useful for debugging on ARM Mali. This eliminates transaction elimination -// which can cause artifacts if you get barriers wrong (or if there are driver bugs). -// Cost is reduced performance on some GPU architectures. -// #define VULKAN_USE_GENERAL_LAYOUT_FOR_COLOR -// #define VULKAN_USE_GENERAL_LAYOUT_FOR_DEPTH_STENCIL - // VulkanContext manages the device and swapchain, and deferred deletion of objects. class VulkanContext { public: diff --git a/Common/GPU/Vulkan/VulkanQueueRunner.cpp b/Common/GPU/Vulkan/VulkanQueueRunner.cpp index ff5fb56d2f..a8fd7925a0 100644 --- a/Common/GPU/Vulkan/VulkanQueueRunner.cpp +++ b/Common/GPU/Vulkan/VulkanQueueRunner.cpp @@ -126,22 +126,13 @@ void VulkanQueueRunner::InitBackbufferRenderPass() { attachments[1].storeOp = VK_ATTACHMENT_STORE_OP_DONT_CARE; // Don't care about storing backbuffer Z - we clear it anyway. attachments[1].stencilLoadOp = VK_ATTACHMENT_LOAD_OP_CLEAR; attachments[1].stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE; -#ifdef VULKAN_USE_GENERAL_LAYOUT_FOR_DEPTH_STENCIL - attachments[1].initialLayout = VK_IMAGE_LAYOUT_GENERAL; - attachments[1].finalLayout = VK_IMAGE_LAYOUT_GENERAL; -#else attachments[1].initialLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL; attachments[1].finalLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL; -#endif attachments[1].flags = 0; VkAttachmentReference color_reference{}; color_reference.attachment = 0; -#ifdef VULKAN_USE_GENERAL_LAYOUT_FOR_COLOR - color_reference.layout = VK_IMAGE_LAYOUT_GENERAL; -#else color_reference.layout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL; -#endif VkAttachmentReference depth_reference{}; depth_reference.attachment = 1; @@ -204,13 +195,8 @@ VkRenderPass VulkanQueueRunner::GetRenderPass(const RPKey &key) { attachments[0].storeOp = VK_ATTACHMENT_STORE_OP_STORE; attachments[0].stencilLoadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE; attachments[0].stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE; -#ifdef VULKAN_USE_GENERAL_LAYOUT_FOR_COLOR - attachments[0].initialLayout = VK_IMAGE_LAYOUT_GENERAL; - attachments[0].finalLayout = VK_IMAGE_LAYOUT_GENERAL; -#else attachments[0].initialLayout = key.prevColorLayout; attachments[0].finalLayout = key.finalColorLayout; -#endif attachments[0].flags = 0; attachments[1].format = vulkan_->GetDeviceInfo().preferredDepthStencilFormat; @@ -239,13 +225,8 @@ VkRenderPass VulkanQueueRunner::GetRenderPass(const RPKey &key) { } attachments[1].storeOp = VK_ATTACHMENT_STORE_OP_STORE; attachments[1].stencilStoreOp = VK_ATTACHMENT_STORE_OP_STORE; -#ifdef VULKAN_USE_GENERAL_LAYOUT_FOR_DEPTH_STENCIL - attachments[1].initialLayout = VK_IMAGE_LAYOUT_GENERAL; - attachments[1].finalLayout = VK_IMAGE_LAYOUT_GENERAL; -#else attachments[1].initialLayout = key.prevDepthStencilLayout; attachments[1].finalLayout = key.finalDepthStencilLayout; -#endif attachments[1].flags = 0; VkAttachmentReference color_reference{}; @@ -1580,24 +1561,6 @@ void VulkanQueueRunner::SetupTransitionToTransferSrc(VKRImage &img, VkImageMemor barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED; barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED; img.layout = barrier.newLayout; - - // NOTE: Must do this AFTER updating img.layout to avoid behaviour differences. -#ifdef VULKAN_USE_GENERAL_LAYOUT_FOR_COLOR - if (aspect == VK_IMAGE_ASPECT_COLOR_BIT) { - if (barrier.oldLayout == VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL || barrier.oldLayout == VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL) - barrier.oldLayout = VK_IMAGE_LAYOUT_GENERAL; - if (barrier.newLayout == VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL || barrier.newLayout == VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL) - barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL; - } -#endif -#ifdef VULKAN_USE_GENERAL_LAYOUT_FOR_DEPTH_STENCIL - if (aspect != VK_IMAGE_ASPECT_COLOR_BIT) { - if (barrier.oldLayout == VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL || barrier.oldLayout == VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL) - barrier.oldLayout = VK_IMAGE_LAYOUT_GENERAL; - if (barrier.newLayout == VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL || barrier.newLayout == VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL) - barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL; - } -#endif } void VulkanQueueRunner::SetupTransitionToTransferDst(VKRImage &img, VkImageMemoryBarrier &barrier, VkPipelineStageFlags &stage, VkImageAspectFlags aspect) { @@ -1639,24 +1602,6 @@ void VulkanQueueRunner::SetupTransitionToTransferDst(VKRImage &img, VkImageMemor barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED; barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED; img.layout = barrier.newLayout; - - // NOTE: Must do this AFTER updating img.layout to avoid behaviour differences. -#ifdef VULKAN_USE_GENERAL_LAYOUT_FOR_COLOR - if (aspect == VK_IMAGE_ASPECT_COLOR_BIT) { - if (barrier.oldLayout == VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL || barrier.oldLayout == VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL) - barrier.oldLayout = VK_IMAGE_LAYOUT_GENERAL; - if (barrier.newLayout == VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL || barrier.newLayout == VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL) - barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL; - } -#endif -#ifdef VULKAN_USE_GENERAL_LAYOUT_FOR_DEPTH_STENCIL - if (aspect != VK_IMAGE_ASPECT_COLOR_BIT) { - if (barrier.oldLayout == VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL || barrier.oldLayout == VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL) - barrier.oldLayout = VK_IMAGE_LAYOUT_GENERAL; - if (barrier.newLayout == VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL || barrier.newLayout == VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL) - barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL; - } -#endif } void VulkanQueueRunner::PerformReadback(const VKRStep &step, VkCommandBuffer cmd) { diff --git a/Common/GPU/Vulkan/thin3d_vulkan.cpp b/Common/GPU/Vulkan/thin3d_vulkan.cpp index 502a5194f5..6fab2a9841 100644 --- a/Common/GPU/Vulkan/thin3d_vulkan.cpp +++ b/Common/GPU/Vulkan/thin3d_vulkan.cpp @@ -993,11 +993,7 @@ VkDescriptorSet VKContext::GetOrCreateDescriptorSet(VkBuffer buf) { if (key.imageViews_[i] && key.samplers_[i] && key.samplers_[i]->GetSampler()) { imageDesc[i].imageView = key.imageViews_[i]; imageDesc[i].sampler = key.samplers_[i]->GetSampler(); -#ifdef VULKAN_USE_GENERAL_LAYOUT_FOR_COLOR - imageDesc[i].imageLayout = VK_IMAGE_LAYOUT_GENERAL; -#else imageDesc[i].imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL; -#endif writes[numWrites].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET; writes[numWrites].dstSet = descSet; writes[numWrites].dstArrayElement = 0; diff --git a/GPU/Vulkan/DrawEngineVulkan.cpp b/GPU/Vulkan/DrawEngineVulkan.cpp index 04d48db348..0033521449 100644 --- a/GPU/Vulkan/DrawEngineVulkan.cpp +++ b/GPU/Vulkan/DrawEngineVulkan.cpp @@ -446,11 +446,7 @@ VkDescriptorSet DrawEngineVulkan::GetOrCreateDescriptorSet(VkImageView imageView if (imageView) { _dbg_assert_(sampler != VK_NULL_HANDLE); -#ifdef VULKAN_USE_GENERAL_LAYOUT_FOR_COLOR - tex[0].imageLayout = VK_IMAGE_LAYOUT_GENERAL; -#else tex[0].imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL; -#endif tex[0].imageView = imageView; tex[0].sampler = sampler; writes[n].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET; @@ -464,11 +460,7 @@ VkDescriptorSet DrawEngineVulkan::GetOrCreateDescriptorSet(VkImageView imageView } if (boundSecondary_) { -#ifdef VULKAN_USE_GENERAL_LAYOUT_FOR_COLOR - tex[1].imageLayout = VK_IMAGE_LAYOUT_GENERAL; -#else tex[1].imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL; -#endif tex[1].imageView = boundSecondary_; tex[1].sampler = samplerSecondary_; writes[n].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET; @@ -482,11 +474,7 @@ VkDescriptorSet DrawEngineVulkan::GetOrCreateDescriptorSet(VkImageView imageView } if (boundDepal_) { -#ifdef VULKAN_USE_GENERAL_LAYOUT_FOR_COLOR - tex[2].imageLayout = VK_IMAGE_LAYOUT_GENERAL; -#else tex[2].imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL; -#endif tex[2].imageView = boundDepal_; tex[2].sampler = samplerSecondary_; // doesn't matter, we use load writes[n].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET; diff --git a/GPU/Vulkan/VulkanUtil.cpp b/GPU/Vulkan/VulkanUtil.cpp index bcf6f655f9..bb39dff229 100644 --- a/GPU/Vulkan/VulkanUtil.cpp +++ b/GPU/Vulkan/VulkanUtil.cpp @@ -196,11 +196,7 @@ VkDescriptorSet Vulkan2D::GetDescriptorSet(VkImageView tex1, VkSampler sampler1, VkDescriptorImageInfo image1{}; VkDescriptorImageInfo image2{}; if (tex1 && sampler1) { -#ifdef VULKAN_USE_GENERAL_LAYOUT_FOR_COLOR - image1.imageLayout = VK_IMAGE_LAYOUT_GENERAL; -#else image1.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL; -#endif image1.imageView = tex1; image1.sampler = sampler1; writes[n].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET; @@ -213,11 +209,7 @@ VkDescriptorSet Vulkan2D::GetDescriptorSet(VkImageView tex1, VkSampler sampler1, } if (tex2 && sampler2) { // TODO: Also support LAYOUT_GENERAL to be able to texture from framebuffers without transitioning them? -#ifdef VULKAN_USE_GENERAL_LAYOUT_FOR_COLOR - image2.imageLayout = VK_IMAGE_LAYOUT_GENERAL; -#else image2.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL; -#endif image2.imageView = tex2; image2.sampler = sampler2; writes[n].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET; From 692048fb8bdebe67a113ba40bca2dc25ebe2f917 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Sun, 11 Oct 2020 10:21:50 +0200 Subject: [PATCH 007/275] VK: Separate layout transitions from renderpasses again. According to sage advice from themaister, this is just unnecessary overengineering. Having them separate reduces the size of the renderpass key - we might be able to just change that to an array lookup again. Will also make it easier to in the future add depth-less render passes. --- Common/GPU/Vulkan/VulkanQueueRunner.cpp | 340 ++++++++++++++---------- Common/GPU/Vulkan/VulkanQueueRunner.h | 11 +- 2 files changed, 205 insertions(+), 146 deletions(-) diff --git a/Common/GPU/Vulkan/VulkanQueueRunner.cpp b/Common/GPU/Vulkan/VulkanQueueRunner.cpp index a8fd7925a0..c2a6c6aa0e 100644 --- a/Common/GPU/Vulkan/VulkanQueueRunner.cpp +++ b/Common/GPU/Vulkan/VulkanQueueRunner.cpp @@ -12,8 +12,7 @@ void VulkanQueueRunner::CreateDeviceObjects() { INFO_LOG(G3D, "VulkanQueueRunner::CreateDeviceObjects"); InitBackbufferRenderPass(); - framebufferRenderPass_ = GetRenderPass(VKRRenderPassAction::CLEAR, VKRRenderPassAction::CLEAR, VKRRenderPassAction::CLEAR, - VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL); + framebufferRenderPass_ = GetRenderPass(VKRRenderPassAction::CLEAR, VKRRenderPassAction::CLEAR, VKRRenderPassAction::CLEAR); #if 0 // Just to check whether it makes sense to split some of these. drawidx is way bigger than the others... @@ -195,8 +194,8 @@ VkRenderPass VulkanQueueRunner::GetRenderPass(const RPKey &key) { attachments[0].storeOp = VK_ATTACHMENT_STORE_OP_STORE; attachments[0].stencilLoadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE; attachments[0].stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE; - attachments[0].initialLayout = key.prevColorLayout; - attachments[0].finalLayout = key.finalColorLayout; + attachments[0].initialLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL; + attachments[0].finalLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL; attachments[0].flags = 0; attachments[1].format = vulkan_->GetDeviceInfo().preferredDepthStencilFormat; @@ -225,8 +224,8 @@ VkRenderPass VulkanQueueRunner::GetRenderPass(const RPKey &key) { } attachments[1].storeOp = VK_ATTACHMENT_STORE_OP_STORE; attachments[1].stencilStoreOp = VK_ATTACHMENT_STORE_OP_STORE; - attachments[1].initialLayout = key.prevDepthStencilLayout; - attachments[1].finalLayout = key.finalDepthStencilLayout; + attachments[1].initialLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL; + attachments[1].finalLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL; attachments[1].flags = 0; VkAttachmentReference color_reference{}; @@ -249,136 +248,12 @@ VkRenderPass VulkanQueueRunner::GetRenderPass(const RPKey &key) { subpass.preserveAttachmentCount = 0; subpass.pPreserveAttachments = nullptr; - VkSubpassDependency deps[2]{}; - int numDeps = 0; - switch (key.prevColorLayout) { - case VK_IMAGE_LAYOUT_UNDEFINED: - // No need to specify stage or access. - break; - case VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL: - // Already the right color layout. Unclear that we need to do a lot here.. - break; - case VK_IMAGE_LAYOUT_GENERAL: - // We came from the Mali workaround, and are transitioning back to COLOR_ATTACHMENT_OPTIMAL. - deps[numDeps].srcAccessMask |= VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT; - deps[numDeps].srcStageMask |= VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT; - break; - case VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL: - deps[numDeps].srcAccessMask |= VK_ACCESS_SHADER_READ_BIT; - deps[numDeps].srcStageMask |= VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT; - break; - case VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL: - deps[numDeps].srcAccessMask |= VK_ACCESS_TRANSFER_WRITE_BIT; - deps[numDeps].srcStageMask |= VK_PIPELINE_STAGE_TRANSFER_BIT; - break; - case VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL: - deps[numDeps].srcAccessMask |= VK_ACCESS_TRANSFER_READ_BIT; - deps[numDeps].srcStageMask |= VK_PIPELINE_STAGE_TRANSFER_BIT; - break; - default: - _dbg_assert_msg_(false, "GetRenderPass: Unexpected color layout %d", (int)key.prevColorLayout); - break; - } - - switch (key.prevDepthStencilLayout) { - case VK_IMAGE_LAYOUT_UNDEFINED: - // No need to specify stage or access. - break; - case VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL: - // Already the right depth layout. Unclear that we need to do a lot here.. - break; - case VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL: - deps[numDeps].srcAccessMask |= VK_ACCESS_SHADER_READ_BIT; - deps[numDeps].srcStageMask |= VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT; - break; - case VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL: - deps[numDeps].srcAccessMask |= VK_ACCESS_TRANSFER_READ_BIT; - deps[numDeps].srcStageMask |= VK_PIPELINE_STAGE_TRANSFER_BIT; - break; - case VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL: - deps[numDeps].srcAccessMask |= VK_ACCESS_TRANSFER_WRITE_BIT; - deps[numDeps].srcStageMask |= VK_PIPELINE_STAGE_TRANSFER_BIT; - break; - default: - _dbg_assert_msg_(false, "GetRenderPass: Unexpected depth layout %d", (int)key.prevDepthStencilLayout); - break; - } - - if (deps[numDeps].srcAccessMask) { - deps[numDeps].srcSubpass = VK_SUBPASS_EXTERNAL; - deps[numDeps].dstSubpass = 0; - deps[numDeps].dependencyFlags = 0; - deps[numDeps].dstStageMask = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT | VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT | VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT; - deps[numDeps].dstAccessMask = VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT | VK_ACCESS_COLOR_ATTACHMENT_READ_BIT | VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT; - numDeps++; - } - - // And the final transition. - // Don't need to transition it if VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL. - switch (key.finalColorLayout) { - case VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL: - deps[numDeps].dstAccessMask = VK_ACCESS_SHADER_READ_BIT; - deps[numDeps].dstStageMask = VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT; - break; - case VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL: - deps[numDeps].dstAccessMask = VK_ACCESS_TRANSFER_READ_BIT; - deps[numDeps].dstStageMask = VK_PIPELINE_STAGE_TRANSFER_BIT; - break; - case VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL: - deps[numDeps].dstAccessMask = VK_ACCESS_TRANSFER_READ_BIT; - deps[numDeps].dstStageMask = VK_PIPELINE_STAGE_TRANSFER_BIT; - break; - case VK_IMAGE_LAYOUT_UNDEFINED: - case VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL: - // Nothing to do. - break; - default: - _dbg_assert_msg_(false, "GetRenderPass: Unexpected final color layout %d", (int)key.finalColorLayout); - break; - } - - switch (key.finalDepthStencilLayout) { - case VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL: - deps[numDeps].dstAccessMask |= VK_ACCESS_SHADER_READ_BIT; - deps[numDeps].dstStageMask |= VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT; - break; - case VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL: - deps[numDeps].dstAccessMask |= VK_ACCESS_TRANSFER_READ_BIT; - deps[numDeps].dstStageMask |= VK_PIPELINE_STAGE_TRANSFER_BIT; - break; - case VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL: - deps[numDeps].dstAccessMask |= VK_ACCESS_TRANSFER_READ_BIT; - deps[numDeps].dstStageMask |= VK_PIPELINE_STAGE_TRANSFER_BIT; - break; - case VK_IMAGE_LAYOUT_UNDEFINED: - case VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL: - // Nothing to do. - break; - default: - _dbg_assert_msg_(false, "GetRenderPass: Unexpected final depth layout %d", (int)key.finalDepthStencilLayout); - break; - } - - if (deps[numDeps].dstAccessMask) { - deps[numDeps].srcSubpass = 0; - deps[numDeps].dstSubpass = VK_SUBPASS_EXTERNAL; - deps[numDeps].dependencyFlags = 0; - deps[numDeps].srcStageMask = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT | VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT | VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT; - deps[numDeps].srcAccessMask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT; - numDeps++; - } - VkRenderPassCreateInfo rp{ VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO }; rp.attachmentCount = 2; rp.pAttachments = attachments; rp.subpassCount = 1; rp.pSubpasses = &subpass; - if (numDeps) { - rp.dependencyCount = numDeps; - rp.pDependencies = deps; - } - VkResult res = vkCreateRenderPass(vulkan_->GetDevice(), &rp, nullptr, &pass); _assert_(res == VK_SUCCESS); _assert_(pass != VK_NULL_HANDLE); @@ -997,6 +872,194 @@ void VulkanQueueRunner::LogReadbackImage(const VKRStep &step) { INFO_LOG(G3D, "%s", StepToString(step).c_str()); } +void TransitionToOptimal(VkCommandBuffer cmd, VkImage colorImage, VkImageLayout colorLayout, VkImage depthStencilImage, VkImageLayout depthStencilLayout) { + VkPipelineStageFlags srcStageMask = 0; + VkPipelineStageFlags dstStageMask = 0; + int barrierCount = 0; + VkImageMemoryBarrier barrier[2]{}; + + if (colorLayout != VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL) { + barrier[0].sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER; + barrier[0].pNext = nullptr; + switch (colorLayout) { + case VK_IMAGE_LAYOUT_UNDEFINED: + // No need to specify stage or access. + break; + case VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL: + // Already the right color layout. Unclear that we need to do a lot here.. + break; + case VK_IMAGE_LAYOUT_GENERAL: + // We came from the Mali workaround, and are transitioning back to COLOR_ATTACHMENT_OPTIMAL. + barrier[0].srcAccessMask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT; + srcStageMask |= VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT; + break; + case VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL: + barrier[0].srcAccessMask |= VK_ACCESS_SHADER_READ_BIT; + srcStageMask |= VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT; + break; + case VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL: + barrier[0].srcAccessMask |= VK_ACCESS_TRANSFER_WRITE_BIT; + srcStageMask |= VK_PIPELINE_STAGE_TRANSFER_BIT; + break; + case VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL: + barrier[0].srcAccessMask |= VK_ACCESS_TRANSFER_READ_BIT; + srcStageMask |= VK_PIPELINE_STAGE_TRANSFER_BIT; + break; + default: + _dbg_assert_msg_(false, "GetRenderPass: Unexpected color layout %d", (int)colorLayout); + break; + } + dstStageMask |= VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT; + barrier[0].dstAccessMask = VK_ACCESS_COLOR_ATTACHMENT_READ_BIT | VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT; + barrier[0].oldLayout = colorLayout; + barrier[0].newLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL; + barrier[0].image = colorImage; + barrier[0].subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT; + barrier[0].subresourceRange.baseMipLevel = 0; + barrier[0].subresourceRange.levelCount = 1; + barrier[0].subresourceRange.layerCount = 1; + barrier[0].srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED; + barrier[0].dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED; + barrierCount++; + } + + if (depthStencilImage != VK_NULL_HANDLE && depthStencilLayout != VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL) { + barrier[1].sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER; + barrier[1].pNext = nullptr; + switch (depthStencilLayout) { + case VK_IMAGE_LAYOUT_UNDEFINED: + // No need to specify stage or access. + break; + case VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL: + // Already the right depth layout. Unclear that we need to do a lot here.. + break; + case VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL: + barrier[1].srcAccessMask |= VK_ACCESS_SHADER_READ_BIT; + srcStageMask |= VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT; + break; + case VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL: + barrier[1].srcAccessMask |= VK_ACCESS_TRANSFER_READ_BIT; + srcStageMask |= VK_PIPELINE_STAGE_TRANSFER_BIT; + break; + case VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL: + barrier[1].srcAccessMask |= VK_ACCESS_TRANSFER_WRITE_BIT; + srcStageMask |= VK_PIPELINE_STAGE_TRANSFER_BIT; + break; + default: + _dbg_assert_msg_(false, "GetRenderPass: Unexpected depth layout %d", (int)depthStencilLayout); + break; + } + dstStageMask |= VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT | VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT; + barrier[1].dstAccessMask = VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT; + barrier[1].oldLayout = depthStencilLayout; + barrier[1].newLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL; + barrier[1].image = depthStencilImage; + barrier[1].subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT; + barrier[1].subresourceRange.baseMipLevel = 0; + barrier[1].subresourceRange.levelCount = 1; + barrier[1].subresourceRange.layerCount = 1; + barrier[1].srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED; + barrier[1].dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED; + + barrierCount++; + } + + if (barrierCount) { + vkCmdPipelineBarrier(cmd, srcStageMask, dstStageMask, VK_DEPENDENCY_BY_REGION_BIT, 0, nullptr, 0, nullptr, barrierCount, barrier); + } +} + +void TransitionFromOptimal(VkCommandBuffer cmd, VkImage colorImage, VkImageLayout colorLayout, VkImage depthStencilImage, VkImageLayout depthStencilLayout) { + VkPipelineStageFlags srcStageMask = 0; + VkPipelineStageFlags dstStageMask = 0; + + // If layouts aren't optimal, transition them. + VkImageMemoryBarrier barrier[2]{}; + + int barrierCount = 0; + if (colorLayout != VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL) { + barrier[0].sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER; + barrier[0].pNext = nullptr; + srcStageMask |= VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT; + barrier[0].srcAccessMask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT; + // And the final transition. + // Don't need to transition it if VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL. + switch (colorLayout) { + case VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL: + barrier[0].dstAccessMask = VK_ACCESS_SHADER_READ_BIT; + dstStageMask |= VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT; + break; + case VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL: + barrier[0].dstAccessMask = VK_ACCESS_TRANSFER_READ_BIT; + dstStageMask |= VK_PIPELINE_STAGE_TRANSFER_BIT; + break; + case VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL: + barrier[0].dstAccessMask = VK_ACCESS_TRANSFER_READ_BIT; + dstStageMask |= VK_PIPELINE_STAGE_TRANSFER_BIT; + break; + case VK_IMAGE_LAYOUT_UNDEFINED: + case VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL: + // Nothing to do. + break; + default: + _dbg_assert_msg_(false, "GetRenderPass: Unexpected final color layout %d", (int)colorLayout); + break; + } + barrier[0].oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL; + barrier[0].newLayout = colorLayout; + barrier[0].image = colorImage; + barrier[0].subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT; + barrier[0].subresourceRange.baseMipLevel = 0; + barrier[0].subresourceRange.levelCount = 1; + barrier[0].subresourceRange.layerCount = 1; + barrier[0].srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED; + barrier[0].dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED; + barrierCount++; + } + + if (depthStencilImage && depthStencilLayout != VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL) { + barrier[1].sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER; + barrier[1].pNext = nullptr; + + srcStageMask |= VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT | VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT; + barrier[1].srcAccessMask = VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT; + switch (depthStencilLayout) { + case VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL: + barrier[1].dstAccessMask |= VK_ACCESS_SHADER_READ_BIT; + dstStageMask |= VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT; + break; + case VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL: + barrier[1].dstAccessMask |= VK_ACCESS_TRANSFER_READ_BIT; + dstStageMask |= VK_PIPELINE_STAGE_TRANSFER_BIT; + break; + case VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL: + barrier[1].dstAccessMask |= VK_ACCESS_TRANSFER_READ_BIT; + dstStageMask |= VK_PIPELINE_STAGE_TRANSFER_BIT; + break; + case VK_IMAGE_LAYOUT_UNDEFINED: + case VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL: + // Nothing to do. + break; + default: + _dbg_assert_msg_(false, "GetRenderPass: Unexpected final depth layout %d", (int)depthStencilLayout); + break; + } + barrier[1].oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL; + barrier[1].newLayout = depthStencilLayout; + barrier[1].image = depthStencilImage; + barrier[1].subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT; + barrier[1].subresourceRange.baseMipLevel = 0; + barrier[1].subresourceRange.levelCount = 1; + barrier[1].subresourceRange.layerCount = 1; + barrier[1].srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED; + barrier[1].dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED; + barrierCount++; + } + if (barrierCount) { + vkCmdPipelineBarrier(cmd, srcStageMask, dstStageMask, VK_DEPENDENCY_BY_REGION_BIT, 0, nullptr, 0, nullptr, barrierCount, barrier); + } +} + void VulkanQueueRunner::PerformRenderPass(const VKRStep &step, VkCommandBuffer cmd) { // TODO: If there are multiple, we can transition them together. @@ -1292,8 +1355,10 @@ void VulkanQueueRunner::PerformRenderPass(const VKRStep &step, VkCommandBuffer c } vkCmdEndRenderPass(cmd); - // The renderpass handles the layout transition. if (fb) { + // If the desired final layout aren't the optimal layout for rendering, transition. + TransitionFromOptimal(cmd, fb->color.image, step.render.finalColorLayout, fb->depth.image, step.render.finalDepthStencilLayout); + fb->color.layout = step.render.finalColorLayout; fb->depth.layout = step.render.finalDepthStencilLayout; } @@ -1331,15 +1396,12 @@ void VulkanQueueRunner::PerformBindFramebufferAsRenderTarget(const VKRStep &step fb->color.layout = VK_IMAGE_LAYOUT_GENERAL; } - renderPass = GetRenderPass( - step.render.color, step.render.depth, step.render.stencil, - fb->color.layout, fb->depth.layout, - step.render.finalColorLayout, - step.render.finalDepthStencilLayout); + TransitionToOptimal(cmd, fb->color.image, fb->color.layout, fb->depth.image, fb->depth.layout); - // We now do any layout pretransitions as part of the render pass. - fb->color.layout = step.render.finalColorLayout; - fb->depth.layout = step.render.finalDepthStencilLayout; + renderPass = GetRenderPass(step.render.color, step.render.depth, step.render.stencil); + + // The transition from the optimal format happens after EndRenderPass, now that we don't + // do it as part of the renderpass itself anymore. if (step.render.color == VKRRenderPassAction::CLEAR) { Uint8x4ToFloat4(clearVal[0].color.float32, step.render.clearColor); diff --git a/Common/GPU/Vulkan/VulkanQueueRunner.h b/Common/GPU/Vulkan/VulkanQueueRunner.h index ada7cc49e2..59ee054845 100644 --- a/Common/GPU/Vulkan/VulkanQueueRunner.h +++ b/Common/GPU/Vulkan/VulkanQueueRunner.h @@ -209,17 +209,12 @@ public: VKRRenderPassAction colorLoadAction; VKRRenderPassAction depthLoadAction; VKRRenderPassAction stencilLoadAction; - VkImageLayout prevColorLayout; - VkImageLayout prevDepthStencilLayout; - VkImageLayout finalColorLayout; - VkImageLayout finalDepthStencilLayout; }; // Only call this from the render thread! Also ok during initialization (LoadCache). VkRenderPass GetRenderPass( - VKRRenderPassAction colorLoadAction, VKRRenderPassAction depthLoadAction, VKRRenderPassAction stencilLoadAction, - VkImageLayout prevColorLayout, VkImageLayout prevDepthStencilLayout, VkImageLayout finalColorLayout, VkImageLayout finalDepthStencilLayout) { - RPKey key{ colorLoadAction, depthLoadAction, stencilLoadAction, prevColorLayout, prevDepthStencilLayout, finalColorLayout, finalDepthStencilLayout }; + VKRRenderPassAction colorLoadAction, VKRRenderPassAction depthLoadAction, VKRRenderPassAction stencilLoadAction) { + RPKey key{ colorLoadAction, depthLoadAction, stencilLoadAction }; return GetRenderPass(key); } @@ -271,6 +266,8 @@ private: VkImage backbufferImage_ = VK_NULL_HANDLE; VkRenderPass backbufferRenderPass_ = VK_NULL_HANDLE; + + // The "Compatible" render pass. Used when creating pipelines that render to "normal" framebuffers. VkRenderPass framebufferRenderPass_ = VK_NULL_HANDLE; // Renderpasses, all combinations of preserving or clearing or dont-care-ing fb contents. From 9d78ba93e0e9a332931f8a0f40a81aaee486c5bf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Sun, 11 Oct 2020 11:17:43 +0200 Subject: [PATCH 008/275] Bugfix --- Common/GPU/Vulkan/VulkanQueueRunner.cpp | 60 ++++++++++++------------- 1 file changed, 30 insertions(+), 30 deletions(-) diff --git a/Common/GPU/Vulkan/VulkanQueueRunner.cpp b/Common/GPU/Vulkan/VulkanQueueRunner.cpp index c2a6c6aa0e..a1c117932c 100644 --- a/Common/GPU/Vulkan/VulkanQueueRunner.cpp +++ b/Common/GPU/Vulkan/VulkanQueueRunner.cpp @@ -924,8 +924,8 @@ void TransitionToOptimal(VkCommandBuffer cmd, VkImage colorImage, VkImageLayout } if (depthStencilImage != VK_NULL_HANDLE && depthStencilLayout != VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL) { - barrier[1].sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER; - barrier[1].pNext = nullptr; + barrier[barrierCount].sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER; + barrier[barrierCount].pNext = nullptr; switch (depthStencilLayout) { case VK_IMAGE_LAYOUT_UNDEFINED: // No need to specify stage or access. @@ -934,15 +934,15 @@ void TransitionToOptimal(VkCommandBuffer cmd, VkImage colorImage, VkImageLayout // Already the right depth layout. Unclear that we need to do a lot here.. break; case VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL: - barrier[1].srcAccessMask |= VK_ACCESS_SHADER_READ_BIT; + barrier[barrierCount].srcAccessMask |= VK_ACCESS_SHADER_READ_BIT; srcStageMask |= VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT; break; case VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL: - barrier[1].srcAccessMask |= VK_ACCESS_TRANSFER_READ_BIT; + barrier[barrierCount].srcAccessMask |= VK_ACCESS_TRANSFER_READ_BIT; srcStageMask |= VK_PIPELINE_STAGE_TRANSFER_BIT; break; case VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL: - barrier[1].srcAccessMask |= VK_ACCESS_TRANSFER_WRITE_BIT; + barrier[barrierCount].srcAccessMask |= VK_ACCESS_TRANSFER_WRITE_BIT; srcStageMask |= VK_PIPELINE_STAGE_TRANSFER_BIT; break; default: @@ -950,16 +950,16 @@ void TransitionToOptimal(VkCommandBuffer cmd, VkImage colorImage, VkImageLayout break; } dstStageMask |= VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT | VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT; - barrier[1].dstAccessMask = VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT; - barrier[1].oldLayout = depthStencilLayout; - barrier[1].newLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL; - barrier[1].image = depthStencilImage; - barrier[1].subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT; - barrier[1].subresourceRange.baseMipLevel = 0; - barrier[1].subresourceRange.levelCount = 1; - barrier[1].subresourceRange.layerCount = 1; - barrier[1].srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED; - barrier[1].dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED; + barrier[barrierCount].dstAccessMask = VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT; + barrier[barrierCount].oldLayout = depthStencilLayout; + barrier[barrierCount].newLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL; + barrier[barrierCount].image = depthStencilImage; + barrier[barrierCount].subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT; + barrier[barrierCount].subresourceRange.baseMipLevel = 0; + barrier[barrierCount].subresourceRange.levelCount = 1; + barrier[barrierCount].subresourceRange.layerCount = 1; + barrier[barrierCount].srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED; + barrier[barrierCount].dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED; barrierCount++; } @@ -1018,22 +1018,22 @@ void TransitionFromOptimal(VkCommandBuffer cmd, VkImage colorImage, VkImageLayou } if (depthStencilImage && depthStencilLayout != VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL) { - barrier[1].sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER; - barrier[1].pNext = nullptr; + barrier[barrierCount].sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER; + barrier[barrierCount].pNext = nullptr; srcStageMask |= VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT | VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT; - barrier[1].srcAccessMask = VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT; + barrier[barrierCount].srcAccessMask = VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT; switch (depthStencilLayout) { case VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL: - barrier[1].dstAccessMask |= VK_ACCESS_SHADER_READ_BIT; + barrier[barrierCount].dstAccessMask |= VK_ACCESS_SHADER_READ_BIT; dstStageMask |= VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT; break; case VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL: - barrier[1].dstAccessMask |= VK_ACCESS_TRANSFER_READ_BIT; + barrier[barrierCount].dstAccessMask |= VK_ACCESS_TRANSFER_READ_BIT; dstStageMask |= VK_PIPELINE_STAGE_TRANSFER_BIT; break; case VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL: - barrier[1].dstAccessMask |= VK_ACCESS_TRANSFER_READ_BIT; + barrier[barrierCount].dstAccessMask |= VK_ACCESS_TRANSFER_READ_BIT; dstStageMask |= VK_PIPELINE_STAGE_TRANSFER_BIT; break; case VK_IMAGE_LAYOUT_UNDEFINED: @@ -1044,15 +1044,15 @@ void TransitionFromOptimal(VkCommandBuffer cmd, VkImage colorImage, VkImageLayou _dbg_assert_msg_(false, "GetRenderPass: Unexpected final depth layout %d", (int)depthStencilLayout); break; } - barrier[1].oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL; - barrier[1].newLayout = depthStencilLayout; - barrier[1].image = depthStencilImage; - barrier[1].subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT; - barrier[1].subresourceRange.baseMipLevel = 0; - barrier[1].subresourceRange.levelCount = 1; - barrier[1].subresourceRange.layerCount = 1; - barrier[1].srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED; - barrier[1].dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED; + barrier[barrierCount].oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL; + barrier[barrierCount].newLayout = depthStencilLayout; + barrier[barrierCount].image = depthStencilImage; + barrier[barrierCount].subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT; + barrier[barrierCount].subresourceRange.baseMipLevel = 0; + barrier[barrierCount].subresourceRange.levelCount = 1; + barrier[barrierCount].subresourceRange.layerCount = 1; + barrier[barrierCount].srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED; + barrier[barrierCount].dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED; barrierCount++; } if (barrierCount) { From 5ece3de8bac81db13e69820a4d522bada0f15e60 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Sun, 11 Oct 2020 11:47:24 +0200 Subject: [PATCH 009/275] Track and accumulate pipeline flags for render passes. (Information that will later let us make some interesting optimizations) --- Common/GPU/Vulkan/VulkanQueueRunner.h | 9 ++++ Common/GPU/Vulkan/VulkanRenderManager.cpp | 51 ++++++++++++++++------- Common/GPU/Vulkan/VulkanRenderManager.h | 7 +++- Common/GPU/Vulkan/thin3d_vulkan.cpp | 17 ++++++-- GPU/Vulkan/DrawEngineVulkan.cpp | 4 +- GPU/Vulkan/FramebufferManagerVulkan.cpp | 2 +- GPU/Vulkan/PipelineManagerVulkan.cpp | 6 ++- GPU/Vulkan/PipelineManagerVulkan.h | 9 ++-- GPU/Vulkan/StencilBufferVulkan.cpp | 2 +- GPU/Vulkan/TextureCacheVulkan.cpp | 2 +- 10 files changed, 75 insertions(+), 34 deletions(-) diff --git a/Common/GPU/Vulkan/VulkanQueueRunner.h b/Common/GPU/Vulkan/VulkanQueueRunner.h index 59ee054845..4353a32981 100644 --- a/Common/GPU/Vulkan/VulkanQueueRunner.h +++ b/Common/GPU/Vulkan/VulkanQueueRunner.h @@ -32,11 +32,19 @@ enum class VKRRenderCommand : uint8_t { NUM_RENDER_COMMANDS, }; +enum PipelineFlags { + PIPELINE_FLAG_NONE = 0, + PIPELINE_FLAG_USES_LINES = (1 << 2), + PIPELINE_FLAG_USES_BLEND_CONSTANT = (1 << 3), + PIPELINE_FLAG_USES_DEPTH_STENCIL = (1 << 4), // Reads or writes the depth buffer. +}; + struct VkRenderData { VKRRenderCommand cmd; union { struct { VkPipeline pipeline; + PipelineFlags flags; } pipeline; struct { VkPipelineLayout pipelineLayout; @@ -143,6 +151,7 @@ struct VKRStep { int numReads; VkImageLayout finalColorLayout; VkImageLayout finalDepthStencilLayout; + u32 pipelineFlags; } render; struct { VKRFramebuffer *src; diff --git a/Common/GPU/Vulkan/VulkanRenderManager.cpp b/Common/GPU/Vulkan/VulkanRenderManager.cpp index df224391a3..8dcdcd969d 100644 --- a/Common/GPU/Vulkan/VulkanRenderManager.cpp +++ b/Common/GPU/Vulkan/VulkanRenderManager.cpp @@ -524,6 +524,18 @@ VkCommandBuffer VulkanRenderManager::GetInitCmd() { return frameData_[curFrame].initCmd; } +void VulkanRenderManager::EndCurRenderStep() { + // Save the accumulated pipeline flags so we can use that to configure the render pass. + // We'll often be able to avoid loading/saving the depth/stencil buffer. + if (curRenderStep_) { + curRenderStep_->render.pipelineFlags = curPipelineFlags_; + + // We no longer have a current render step. + curRenderStep_ = nullptr; + curPipelineFlags_ = 0; + } +} + void VulkanRenderManager::BindFramebufferAsRenderTarget(VKRFramebuffer *fb, VKRRenderPassAction color, VKRRenderPassAction depth, VKRRenderPassAction stencil, uint32_t clearColor, float clearDepth, uint8_t clearStencil, const char *tag) { _dbg_assert_(insideFrame_); // Eliminate dupes, instantly convert to a clear if possible. @@ -568,15 +580,19 @@ void VulkanRenderManager::BindFramebufferAsRenderTarget(VKRFramebuffer *fb, VKRR } // More redundant bind elimination. - if (curRenderStep_ && curRenderStep_->commands.size() == 0 && curRenderStep_->render.color != VKRRenderPassAction::CLEAR && curRenderStep_->render.depth != VKRRenderPassAction::CLEAR && curRenderStep_->render.stencil != VKRRenderPassAction::CLEAR) { - // Can trivially kill the last empty render step. - _dbg_assert_(steps_.back() == curRenderStep_); - delete steps_.back(); - steps_.pop_back(); - curRenderStep_ = nullptr; - } - if (curRenderStep_ && curRenderStep_->commands.size() == 0) { - VLOG("Empty render step. Usually happens after uploading pixels.."); + if (curRenderStep_) { + if (curRenderStep_->commands.empty()) { + if (curRenderStep_->render.color != VKRRenderPassAction::CLEAR && curRenderStep_->render.depth != VKRRenderPassAction::CLEAR && curRenderStep_->render.stencil != VKRRenderPassAction::CLEAR) { + // Can trivially kill the last empty render step. + _dbg_assert_(steps_.back() == curRenderStep_); + delete steps_.back(); + steps_.pop_back(); + curRenderStep_ = nullptr; + } + VLOG("Empty render step. Usually happens after uploading pixels.."); + } + + EndCurRenderStep(); } // Older Mali drivers have issues with depth and stencil don't match load/clear/etc. @@ -649,6 +665,8 @@ bool VulkanRenderManager::CopyFramebufferToMemorySync(VKRFramebuffer *src, VkIma } } + EndCurRenderStep(); + VKRStep *step = new VKRStep{ VKRStepType::READBACK }; step->readback.aspectMask = aspectBits; step->readback.src = src; @@ -658,8 +676,6 @@ bool VulkanRenderManager::CopyFramebufferToMemorySync(VKRFramebuffer *src, VkIma step->tag = tag; steps_.push_back(step); - curRenderStep_ = nullptr; - FlushSync(); Draw::DataFormat srcFormat = Draw::DataFormat::UNDEFINED; @@ -704,6 +720,9 @@ bool VulkanRenderManager::CopyFramebufferToMemorySync(VKRFramebuffer *src, VkIma void VulkanRenderManager::CopyImageToMemorySync(VkImage image, int mipLevel, int x, int y, int w, int h, Draw::DataFormat destFormat, uint8_t *pixels, int pixelStride, const char *tag) { _dbg_assert_(insideFrame_); + + EndCurRenderStep(); + VKRStep *step = new VKRStep{ VKRStepType::READBACK_IMAGE }; step->readback_image.image = image; step->readback_image.srcRect.offset = { x, y }; @@ -712,8 +731,6 @@ void VulkanRenderManager::CopyImageToMemorySync(VkImage image, int mipLevel, int step->tag = tag; steps_.push_back(step); - curRenderStep_ = nullptr; - FlushSync(); // Need to call this after FlushSync so the pixels are guaranteed to be ready in CPU-accessible VRAM. @@ -975,6 +992,8 @@ void VulkanRenderManager::CopyFramebuffer(VKRFramebuffer *src, VkRect2D srcRect, } } + EndCurRenderStep(); + VKRStep *step = new VKRStep{ VKRStepType::COPY }; step->copy.aspectMask = aspectMask; @@ -990,7 +1009,6 @@ void VulkanRenderManager::CopyFramebuffer(VKRFramebuffer *src, VkRect2D srcRect, std::unique_lock lock(mutex_); steps_.push_back(step); - curRenderStep_ = nullptr; } void VulkanRenderManager::BlitFramebuffer(VKRFramebuffer *src, VkRect2D srcRect, VKRFramebuffer *dst, VkRect2D dstRect, VkImageAspectFlags aspectMask, VkFilter filter, const char *tag) { @@ -1019,6 +1037,8 @@ void VulkanRenderManager::BlitFramebuffer(VKRFramebuffer *src, VkRect2D srcRect, } } + EndCurRenderStep(); + VKRStep *step = new VKRStep{ VKRStepType::BLIT }; step->blit.aspectMask = aspectMask; @@ -1035,7 +1055,6 @@ void VulkanRenderManager::BlitFramebuffer(VKRFramebuffer *src, VkRect2D srcRect, std::unique_lock lock(mutex_); steps_.push_back(step); - curRenderStep_ = nullptr; } VkImageView VulkanRenderManager::BindFramebufferAsTexture(VKRFramebuffer *fb, int binding, VkImageAspectFlags aspectBit, int attachment) { @@ -1078,7 +1097,7 @@ VkImageView VulkanRenderManager::BindFramebufferAsTexture(VKRFramebuffer *fb, in } void VulkanRenderManager::Finish() { - curRenderStep_ = nullptr; + EndCurRenderStep(); // Let's do just a bit of cleanup on render commands now. for (auto &step : steps_) { diff --git a/Common/GPU/Vulkan/VulkanRenderManager.h b/Common/GPU/Vulkan/VulkanRenderManager.h index d1a781c7b3..1aa2dc515b 100644 --- a/Common/GPU/Vulkan/VulkanRenderManager.h +++ b/Common/GPU/Vulkan/VulkanRenderManager.h @@ -104,11 +104,12 @@ public: void CopyFramebuffer(VKRFramebuffer *src, VkRect2D srcRect, VKRFramebuffer *dst, VkOffset2D dstPos, VkImageAspectFlags aspectMask, const char *tag); void BlitFramebuffer(VKRFramebuffer *src, VkRect2D srcRect, VKRFramebuffer *dst, VkRect2D dstRect, VkImageAspectFlags aspectMask, VkFilter filter, const char *tag); - void BindPipeline(VkPipeline pipeline) { + void BindPipeline(VkPipeline pipeline, PipelineFlags flags) { _dbg_assert_(curRenderStep_ && curRenderStep_->stepType == VKRStepType::RENDER); _dbg_assert_(pipeline != VK_NULL_HANDLE); VkRenderData data{ VKRRenderCommand::BIND_PIPELINE }; data.pipeline.pipeline = pipeline; + curPipelineFlags_ |= flags; curRenderStep_->commands.push_back(data); } @@ -265,6 +266,8 @@ public: private: bool InitBackbufferFramebuffers(int width, int height); bool InitDepthStencilBuffer(VkCommandBuffer cmd); // Used for non-buffered rendering. + void EndCurRenderStep(); + void BeginSubmitFrame(int frame); void EndSubmitFrame(int frame); void Submit(int frame, bool triggerFence); @@ -328,6 +331,8 @@ private: VKRStep *curRenderStep_ = nullptr; bool curStepHasViewport_ = false; bool curStepHasScissor_ = false; + u32 curPipelineFlags_ = 0; + std::vector steps_; bool splitSubmit_ = false; diff --git a/Common/GPU/Vulkan/thin3d_vulkan.cpp b/Common/GPU/Vulkan/thin3d_vulkan.cpp index 6fab2a9841..a27ebec428 100644 --- a/Common/GPU/Vulkan/thin3d_vulkan.cpp +++ b/Common/GPU/Vulkan/thin3d_vulkan.cpp @@ -245,7 +245,7 @@ public: class VKPipeline : public Pipeline { public: - VKPipeline(VulkanContext *vulkan, size_t size) : vulkan_(vulkan) { + VKPipeline(VulkanContext *vulkan, size_t size, PipelineFlags _flags) : vulkan_(vulkan), flags(_flags) { uboSize_ = (int)size; ubo_ = new uint8_t[uboSize_]; } @@ -274,6 +274,8 @@ public: VkPipeline backbufferPipeline = VK_NULL_HANDLE; VkPipeline framebufferPipeline = VK_NULL_HANDLE; + + PipelineFlags flags; int stride[4]{}; int dynamicUniformSize = 0; @@ -1014,11 +1016,18 @@ VkDescriptorSet VKContext::GetOrCreateDescriptorSet(VkBuffer buf) { } Pipeline *VKContext::CreateGraphicsPipeline(const PipelineDesc &desc) { - VKPipeline *pipeline = new VKPipeline(vulkan_, desc.uniformDesc ? desc.uniformDesc->uniformBufferSize : 16 * sizeof(float)); VKInputLayout *input = (VKInputLayout *)desc.inputLayout; VKBlendState *blend = (VKBlendState *)desc.blend; VKDepthStencilState *depth = (VKDepthStencilState *)desc.depthStencil; VKRasterState *raster = (VKRasterState *)desc.raster; + + u32 pipelineFlags = 0; + if (depth->info.depthTestEnable || depth->info.stencilTestEnable) { + pipelineFlags |= PIPELINE_FLAG_USES_DEPTH_STENCIL; + } + + VKPipeline *pipeline = new VKPipeline(vulkan_, desc.uniformDesc ? desc.uniformDesc->uniformBufferSize : 16 * sizeof(float), (PipelineFlags)pipelineFlags); + for (int i = 0; i < (int)input->bindings.size(); i++) { pipeline->stride[i] = input->bindings[i].stride; } @@ -1336,9 +1345,9 @@ void VKContext::DrawUP(const void *vdata, int vertexCount) { void VKContext::BindCompatiblePipeline() { VkRenderPass renderPass = renderManager_.GetCompatibleRenderPass(); if (renderPass == renderManager_.GetBackbufferRenderPass()) { - renderManager_.BindPipeline(curPipeline_->backbufferPipeline); + renderManager_.BindPipeline(curPipeline_->backbufferPipeline, curPipeline_->flags); } else { - renderManager_.BindPipeline(curPipeline_->framebufferPipeline); + renderManager_.BindPipeline(curPipeline_->framebufferPipeline, curPipeline_->flags); } } diff --git a/GPU/Vulkan/DrawEngineVulkan.cpp b/GPU/Vulkan/DrawEngineVulkan.cpp index 0033521449..25ed57ffbe 100644 --- a/GPU/Vulkan/DrawEngineVulkan.cpp +++ b/GPU/Vulkan/DrawEngineVulkan.cpp @@ -839,7 +839,7 @@ void DrawEngineVulkan::DoFlush() { lastRenderStepId_ = curRenderStepId; } - renderManager->BindPipeline(pipeline->pipeline); + renderManager->BindPipeline(pipeline->pipeline, (PipelineFlags)pipeline->flags); if (pipeline != lastPipeline_) { if (lastPipeline_ && !(lastPipeline_->UsesBlendConstant() && pipeline->UsesBlendConstant())) { gstate_c.Dirty(DIRTY_BLEND_STATE); @@ -964,7 +964,7 @@ void DrawEngineVulkan::DoFlush() { lastRenderStepId_ = curRenderStepId; } - renderManager->BindPipeline(pipeline->pipeline); + renderManager->BindPipeline(pipeline->pipeline, (PipelineFlags)pipeline->flags); if (pipeline != lastPipeline_) { if (lastPipeline_ && !lastPipeline_->UsesBlendConstant() && pipeline->UsesBlendConstant()) { gstate_c.Dirty(DIRTY_BLEND_STATE); diff --git a/GPU/Vulkan/FramebufferManagerVulkan.cpp b/GPU/Vulkan/FramebufferManagerVulkan.cpp index 399aa3cd87..31ba520907 100644 --- a/GPU/Vulkan/FramebufferManagerVulkan.cpp +++ b/GPU/Vulkan/FramebufferManagerVulkan.cpp @@ -225,7 +225,7 @@ void FramebufferManagerVulkan::DrawActiveTexture(float x, float y, float w, floa VkDescriptorSet descSet = vulkan2D_->GetDescriptorSet(view, (flags & DRAWTEX_LINEAR) ? linearSampler_ : nearestSampler_, VK_NULL_HANDLE, VK_NULL_HANDLE); VkBuffer vbuffer; VkDeviceSize offset = push_->Push(vtx, sizeof(vtx), &vbuffer); - renderManager->BindPipeline(cur2DPipeline_); + renderManager->BindPipeline(cur2DPipeline_, (PipelineFlags)0); renderManager->Draw(vulkan2D_->GetPipelineLayout(), descSet, 0, nullptr, vbuffer, offset, 4); } diff --git a/GPU/Vulkan/PipelineManagerVulkan.cpp b/GPU/Vulkan/PipelineManagerVulkan.cpp index 2aa0546a8e..8533e10b7d 100644 --- a/GPU/Vulkan/PipelineManagerVulkan.cpp +++ b/GPU/Vulkan/PipelineManagerVulkan.cpp @@ -325,6 +325,9 @@ static VulkanPipeline *CreateVulkanPipeline(VkDevice device, VkPipelineCache pip vulkanPipeline->flags |= PIPELINE_FLAG_USES_BLEND_CONSTANT; if (key.topology == VK_PRIMITIVE_TOPOLOGY_LINE_LIST || key.topology == VK_PRIMITIVE_TOPOLOGY_LINE_STRIP) vulkanPipeline->flags |= PIPELINE_FLAG_USES_LINES; + if (dss.depthTestEnable || dss.stencilTestEnable) { + vulkanPipeline->flags |= PIPELINE_FLAG_USES_DEPTH_STENCIL; + } return vulkanPipeline; } @@ -550,7 +553,7 @@ void PipelineManagerVulkan::SetLineWidth(float lineWidth) { // Wipe all line-drawing pipelines. pipelines_.Iterate([&](const VulkanPipelineKey &key, VulkanPipeline *value) { - if (value->UsesLines()) { + if (value->flags & PIPELINE_FLAG_USES_LINES) { if (value->pipeline) vulkan_->Delete().QueueDeletePipeline(value->pipeline); delete value; @@ -619,7 +622,6 @@ void PipelineManagerVulkan::SaveCache(FILE *file, bool saveRawPipelineCache, Sha // Make sure the set of pipelines we write is "unique". std::set keys; - // TODO: Use derivative pipelines when possible, helps Mali driver pipeline creation speed at least. pipelines_.Iterate([&](const VulkanPipelineKey &pkey, VulkanPipeline *value) { if (failed) return; diff --git a/GPU/Vulkan/PipelineManagerVulkan.h b/GPU/Vulkan/PipelineManagerVulkan.h index d7d47fd0ef..bb747bd29b 100644 --- a/GPU/Vulkan/PipelineManagerVulkan.h +++ b/GPU/Vulkan/PipelineManagerVulkan.h @@ -25,6 +25,8 @@ #include "GPU/Vulkan/VulkanUtil.h" #include "GPU/Vulkan/StateMappingVulkan.h" +#include "GPU/Vulkan/VulkanQueueRunner.h" + // PSP vertex format. enum class PspAttributeLocation { POSITION = 0, @@ -56,19 +58,14 @@ struct VulkanPipelineKey { std::string GetDescription(DebugShaderStringType stringType) const; }; -enum PipelineFlags { - PIPELINE_FLAG_USES_LINES = (1 << 2), - PIPELINE_FLAG_USES_BLEND_CONSTANT = (1 << 3), -}; - // Simply wraps a Vulkan pipeline, providing some metadata. struct VulkanPipeline { VkPipeline pipeline; int flags; // PipelineFlags enum above. - // Convenience. bool UsesBlendConstant() const { return (flags & PIPELINE_FLAG_USES_BLEND_CONSTANT) != 0; } bool UsesLines() const { return (flags & PIPELINE_FLAG_USES_LINES) != 0; } + bool UsesDepthStencil() const { return (flags & PIPELINE_FLAG_USES_DEPTH_STENCIL) != 0; } }; class VulkanContext; diff --git a/GPU/Vulkan/StencilBufferVulkan.cpp b/GPU/Vulkan/StencilBufferVulkan.cpp index faaba54836..95baef8a59 100644 --- a/GPU/Vulkan/StencilBufferVulkan.cpp +++ b/GPU/Vulkan/StencilBufferVulkan.cpp @@ -180,7 +180,7 @@ bool FramebufferManagerVulkan::NotifyStencilUpload(u32 addr, int size, StencilUp } VkPipeline pipeline = vulkan2D_->GetPipeline(rp, stencilVs_, stencilFs_, false, Vulkan2D::VK2DDepthStencilMode::STENCIL_REPLACE_ALWAYS); - renderManager->BindPipeline(pipeline); + renderManager->BindPipeline(pipeline, PIPELINE_FLAG_USES_DEPTH_STENCIL); renderManager->SetViewport({ 0.0f, 0.0f, (float)w, (float)h, 0.0f, 1.0f }); renderManager->SetScissor({ { 0, 0, },{ (uint32_t)w, (uint32_t)h } }); diff --git a/GPU/Vulkan/TextureCacheVulkan.cpp b/GPU/Vulkan/TextureCacheVulkan.cpp index db328b4349..7acd871dd2 100644 --- a/GPU/Vulkan/TextureCacheVulkan.cpp +++ b/GPU/Vulkan/TextureCacheVulkan.cpp @@ -635,7 +635,7 @@ void TextureCacheVulkan::ApplyTextureFramebuffer(VirtualFramebuffer *framebuffer VkDescriptorSet descSet = vulkan2D_->GetDescriptorSet(fbo, samplerNearest_, clutTexture->GetImageView(), samplerNearest_); VulkanRenderManager *renderManager = (VulkanRenderManager *)draw_->GetNativeObject(Draw::NativeObject::RENDER_MANAGER); - renderManager->BindPipeline(depalShader->pipeline); + renderManager->BindPipeline(depalShader->pipeline, (PipelineFlags)0); if (depth) { DepthScaleFactors scaleFactors = GetDepthScaleFactors(); From 91cb1a4861035a2438aed1346c05db13fe9f671b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Sun, 11 Oct 2020 13:08:44 +0200 Subject: [PATCH 010/275] compat.ini: Add ID for European version of Car Jack Streets --- assets/compat.ini | 1 + 1 file changed, 1 insertion(+) diff --git a/assets/compat.ini b/assets/compat.ini index d036ffcff3..13b91e253a 100644 --- a/assets/compat.ini +++ b/assets/compat.ini @@ -787,3 +787,4 @@ ULUS10062 = true [DateLimited] # Car Jack Streets - issue #12698 NPUZ00043 = true +NPEZ00198 = true From afb35c3be3c7c4a6ac4b8a737f424b7097f25d91 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Sun, 11 Oct 2020 19:04:35 +0200 Subject: [PATCH 011/275] Fix GPU profile display on notched screens --- GPU/Vulkan/DebugVisVulkan.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/GPU/Vulkan/DebugVisVulkan.cpp b/GPU/Vulkan/DebugVisVulkan.cpp index 78616e86c5..7d74f571d9 100644 --- a/GPU/Vulkan/DebugVisVulkan.cpp +++ b/GPU/Vulkan/DebugVisVulkan.cpp @@ -19,6 +19,8 @@ #include "Common/GPU/thin3d.h" #include "Common/UI/Context.h" #include "Common/UI/View.h" +#include "Common/System/System.h" +#include "Common/System/Display.h" #include "DebugVisVulkan.h" #include "Common/GPU/Vulkan/VulkanMemory.h" @@ -103,12 +105,10 @@ void DrawProfilerVis(UIContext *ui, GPUInterface *gpu) { return; } using namespace Draw; - const int padding = 10; - const int columnWidth = 256; - const int starty = padding * 8; + const int padding = 10 + System_GetPropertyFloat(SYSPROP_DISPLAY_SAFE_INSET_LEFT); + const int starty = 50 + System_GetPropertyFloat(SYSPROP_DISPLAY_SAFE_INSET_TOP); int x = padding; int y = starty; - int w = columnWidth; // We will double this when actually drawing to make the pixels visible. ui->Begin(); @@ -118,7 +118,7 @@ void DrawProfilerVis(UIContext *ui, GPUInterface *gpu) { Draw::DrawContext *draw = ui->GetDrawContext(); ui->SetFontScale(0.4f, 0.4f); - ui->DrawTextShadow(text.c_str(), 10, 50, 0xFFFFFFFF, FLAG_DYNAMIC_ASCII); + ui->DrawTextShadow(text.c_str(), x, y, 0xFFFFFFFF, FLAG_DYNAMIC_ASCII); ui->SetFontScale(1.0f, 1.0f); ui->Flush(); } From ced83b47850dd44f75294c5439313fc6d54fb887 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Sun, 23 Aug 2020 18:20:58 +0200 Subject: [PATCH 012/275] Libretro/VK: Add a README for debugging, so I don't forget. Minor cleanups. --- GPU/D3D11/TextureCacheD3D11.cpp | 1 + libretro/README_WINDOWS.txt | 31 ++++++++++++++++++++++++++++++ libretro/libretro_vulkan.cpp | 34 ++++++++++++++++----------------- 3 files changed, 49 insertions(+), 17 deletions(-) create mode 100644 libretro/README_WINDOWS.txt diff --git a/GPU/D3D11/TextureCacheD3D11.cpp b/GPU/D3D11/TextureCacheD3D11.cpp index 5dd5e50bf4..c04b353aa7 100644 --- a/GPU/D3D11/TextureCacheD3D11.cpp +++ b/GPU/D3D11/TextureCacheD3D11.cpp @@ -17,6 +17,7 @@ #include #include +#include #include diff --git a/libretro/README_WINDOWS.txt b/libretro/README_WINDOWS.txt new file mode 100644 index 0000000000..5f95e29844 --- /dev/null +++ b/libretro/README_WINDOWS.txt @@ -0,0 +1,31 @@ +Install msys. + +Follow the guide here to set up your MSYS installation for retroarch compilation: + +https://docs.libretro.com/development/retroarch/compilation/windows/ + +You can probably really skip most of the packages but you need make: + +pacman -S make + +"Install" the plugin in Retroarch. + +Then use the following in msys: + +cd libretro + +make platform=windows_msvc2019_desktop_x64 -j32 && cp ppsspp_libretro.* /d/retroarch/cores + +Note that the latter part copies the DLL/PDB into wherever retroarch reads it from. Might need to adjust the path, +and adjust -j32 depending on your number of logical CPUs - might not need that many threads (or you might need more...). + +(plain make without a platform parameter doesn't work - g++ isn't able to build the D3D11 stuff, or at least it fails to link). + +To debug from within MSVC, open retroarch.exe (or retroarch_debug.exe) as a Project/Solution, then open a few of the cpp files, +set some breakpoints and just launch using F5. + + + +Useful libretro/vulkan sample code: + +https://github.com/libretro/libretro-samples/blob/master/video/vulkan/vk_rendering/libretro-test.c diff --git a/libretro/libretro_vulkan.cpp b/libretro/libretro_vulkan.cpp index 09e08703fe..78789d3250 100644 --- a/libretro/libretro_vulkan.cpp +++ b/libretro/libretro_vulkan.cpp @@ -48,24 +48,24 @@ struct VkSwapchainKHR_T { }; static VkSwapchainKHR_T chain; -#define LIBRETRO_VK_WARP_LIST() \ - LIBRETRO_VK_WARP_FUNC(vkDestroyInstance); \ - LIBRETRO_VK_WARP_FUNC(vkCreateDevice); \ - LIBRETRO_VK_WARP_FUNC(vkDestroyDevice); \ - LIBRETRO_VK_WARP_FUNC(vkGetPhysicalDeviceSurfaceCapabilitiesKHR); \ - LIBRETRO_VK_WARP_FUNC(vkDestroySurfaceKHR); \ - LIBRETRO_VK_WARP_FUNC(vkCreateSwapchainKHR); \ - LIBRETRO_VK_WARP_FUNC(vkGetSwapchainImagesKHR); \ - LIBRETRO_VK_WARP_FUNC(vkAcquireNextImageKHR); \ - LIBRETRO_VK_WARP_FUNC(vkQueuePresentKHR); \ - LIBRETRO_VK_WARP_FUNC(vkDestroySwapchainKHR); \ - LIBRETRO_VK_WARP_FUNC(vkQueueSubmit); \ - LIBRETRO_VK_WARP_FUNC(vkQueueWaitIdle); \ - LIBRETRO_VK_WARP_FUNC(vkCmdPipelineBarrier); \ - LIBRETRO_VK_WARP_FUNC(vkCreateRenderPass) +#define LIBRETRO_VK_WARP_LIST() \ + LIBRETRO_VK_WARP_FUNC(vkDestroyInstance); \ + LIBRETRO_VK_WARP_FUNC(vkCreateDevice); \ + LIBRETRO_VK_WARP_FUNC(vkDestroyDevice); \ + LIBRETRO_VK_WARP_FUNC(vkGetPhysicalDeviceSurfaceCapabilitiesKHR); \ + LIBRETRO_VK_WARP_FUNC(vkDestroySurfaceKHR); \ + LIBRETRO_VK_WARP_FUNC(vkCreateSwapchainKHR); \ + LIBRETRO_VK_WARP_FUNC(vkGetSwapchainImagesKHR); \ + LIBRETRO_VK_WARP_FUNC(vkAcquireNextImageKHR); \ + LIBRETRO_VK_WARP_FUNC(vkQueuePresentKHR); \ + LIBRETRO_VK_WARP_FUNC(vkDestroySwapchainKHR); \ + LIBRETRO_VK_WARP_FUNC(vkQueueSubmit); \ + LIBRETRO_VK_WARP_FUNC(vkQueueWaitIdle); \ + LIBRETRO_VK_WARP_FUNC(vkCmdPipelineBarrier); \ + LIBRETRO_VK_WARP_FUNC(vkCreateRenderPass); -#define LIBRETRO_VK_WARP_FUNC(x) \ - extern PFN_##x x; \ +#define LIBRETRO_VK_WARP_FUNC(x) \ + extern PFN_##x x; \ PFN_##x x##_org LIBRETRO_VK_WARP_FUNC(vkGetInstanceProcAddr); From dffc36b8545253a752d4b6f34cf5fea4fac8a2c7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Sun, 23 Aug 2020 18:52:16 +0200 Subject: [PATCH 013/275] Get Vulkan going again with libretro. Rendering is the wrong size and crashes on exit, but it's a start. Only tested on Windows. --- Common/GPU/Vulkan/VulkanContext.cpp | 4 ++ libretro/LibretroVulkanContext.cpp | 65 ++++++++++++++++------------- libretro/LibretroVulkanContext.h | 3 ++ libretro/Makefile | 8 ++++ libretro/README_WINDOWS.txt | 10 ++++- libretro/libretro_vulkan.cpp | 33 ++++++++++----- 6 files changed, 81 insertions(+), 42 deletions(-) diff --git a/Common/GPU/Vulkan/VulkanContext.cpp b/Common/GPU/Vulkan/VulkanContext.cpp index 0a572cf8ac..10a98517ad 100644 --- a/Common/GPU/Vulkan/VulkanContext.cpp +++ b/Common/GPU/Vulkan/VulkanContext.cpp @@ -146,10 +146,14 @@ VkResult VulkanContext::CreateInstance(const CreateInfo &info) { } } + // Temporary hack for libretro. For some reason, when we try to load the functions from this extension, + // we get null pointers when running libretro. Quite strange. +#if !defined(__LIBRETRO__) if (IsInstanceExtensionAvailable(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME)) { instance_extensions_enabled_.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME); extensionsLookup_.KHR_get_physical_device_properties2 = true; } +#endif // Validate that all the instance extensions we ask for are actually available. for (auto ext : instance_extensions_enabled_) { diff --git a/libretro/LibretroVulkanContext.cpp b/libretro/LibretroVulkanContext.cpp index 5d62a54b45..2b9e944360 100644 --- a/libretro/LibretroVulkanContext.cpp +++ b/libretro/LibretroVulkanContext.cpp @@ -31,16 +31,15 @@ static bool create_device(retro_vulkan_context *context, VkInstance instance, Vk init_glslang(); if (!VulkanLoad()) { - // TODO: In the context of RetroArch, someone has already loaded the functions - - // we shouldn't need to load them again. On the other hand, it can't really hurt, we're gonna - // get the same pointers. + // TODO: In the context of RetroArch, someone has already loaded the functions. + // But grabbing the pointers for ourselves can't really be a bad thing. ERROR_LOG(G3D, "RetroArch called the Vulkan entry point without Vulkan available???"); return false; } vk = new VulkanContext(); - vk_libretro_init(instance, gpu, surface, get_instance_proc_addr, required_device_extensions, num_required_device_extensions, required_device_layers, num_required_device_layers, required_features); + vk_libretro_init(instance, gpu, surface, get_instance_proc_addr, required_device_extensions, num_required_device_extensions, required_device_layers, num_required_device_layers, required_features); // TODO: Here we'll inject the instance and all of the stuff into the VulkanContext. @@ -69,10 +68,6 @@ static bool create_device(retro_vulkan_context *context, VkInstance instance, Vk vk->InitSurface(WINDOWSYSTEM_WAYLAND, nullptr, nullptr); #endif - if (!vk->InitSwapchain()) { - return false; - } - context->gpu = vk->GetPhysicalDevice(physical_device); context->device = vk->GetDevice(); context->queue = vk->GetGraphicsQueue(); @@ -100,13 +95,44 @@ bool LibretroVulkanContext::Init() { return false; } - static const struct retro_hw_render_context_negotiation_interface_vulkan iface = { RETRO_HW_RENDER_CONTEXT_NEGOTIATION_INTERFACE_VULKAN, RETRO_HW_RENDER_CONTEXT_NEGOTIATION_INTERFACE_VULKAN_VERSION, GetApplicationInfo, create_device, nullptr }; + static const struct retro_hw_render_context_negotiation_interface_vulkan iface = { + RETRO_HW_RENDER_CONTEXT_NEGOTIATION_INTERFACE_VULKAN, + RETRO_HW_RENDER_CONTEXT_NEGOTIATION_INTERFACE_VULKAN_VERSION, + GetApplicationInfo, + create_device, // Callback above. + nullptr, + }; Libretro::environ_cb(RETRO_ENVIRONMENT_SET_HW_RENDER_CONTEXT_NEGOTIATION_INTERFACE, (void *)&iface); g_Config.iGPUBackend = (int)GPUBackend::VULKAN; return true; } +void LibretroVulkanContext::ContextReset() { + retro_hw_render_interface *vulkan; + if (!Libretro::environ_cb(RETRO_ENVIRONMENT_GET_HW_RENDER_INTERFACE, (void **)&vulkan) || !vulkan) { + ERROR_LOG(G3D, "Failed to get HW rendering interface!\n"); + return; + } + if (vulkan->interface_version != RETRO_HW_RENDER_INTERFACE_VULKAN_VERSION) { + ERROR_LOG(G3D, "HW render interface mismatch, expected %u, got %u!\n", RETRO_HW_RENDER_INTERFACE_VULKAN_VERSION, vulkan->interface_version); + return; + } + vk_libretro_set_hwrender_interface(vulkan); + + LibretroHWRenderContext::ContextReset(); +} + +void LibretroVulkanContext::CreateDrawContext() { + vk->ReinitSurface(); + + if (!vk->InitSwapchain()) { + return; + } + + draw_ = Draw::T3DCreateVulkanContext(vk, false); +} + void LibretroVulkanContext::Shutdown() { LibretroHWRenderContext::Shutdown(); @@ -128,24 +154,3 @@ void LibretroVulkanContext::Shutdown() { } void *LibretroVulkanContext::GetAPIContext() { return vk; } - -void LibretroVulkanContext::CreateDrawContext() { - retro_hw_render_interface *vulkan; - if (!Libretro::environ_cb(RETRO_ENVIRONMENT_GET_HW_RENDER_INTERFACE, (void **)&vulkan) || !vulkan) { - ERROR_LOG(G3D, "Failed to get HW rendering interface!\n"); - return; - } - if (vulkan->interface_version != RETRO_HW_RENDER_INTERFACE_VULKAN_VERSION) { - ERROR_LOG(G3D, "HW render interface mismatch, expected %u, got %u!\n", RETRO_HW_RENDER_INTERFACE_VULKAN_VERSION, vulkan->interface_version); - return; - } - vk_libretro_set_hwrender_interface(vulkan); - - vk->ReinitSurface(); - - if (!vk->InitSwapchain()) { - return; - } - - draw_ = Draw::T3DCreateVulkanContext(vk, false); -} diff --git a/libretro/LibretroVulkanContext.h b/libretro/LibretroVulkanContext.h index e7386a43d0..1da32aec6c 100644 --- a/libretro/LibretroVulkanContext.h +++ b/libretro/LibretroVulkanContext.h @@ -12,6 +12,9 @@ public: void *GetAPIContext() override; void CreateDrawContext() override; + + void ContextReset() override; + GPUCore GetGPUCore() override { return GPUCORE_VULKAN; } const char *Ident() override { return "Vulkan"; } }; diff --git a/libretro/Makefile b/libretro/Makefile index 8b2d15fa49..a047d9a2e8 100644 --- a/libretro/Makefile +++ b/libretro/Makefile @@ -284,6 +284,10 @@ else ifneq (,$(findstring windows_msvc2017,$(platform))) LDFLAGS += -APPCONTAINER -NXCOMPAT -DYNAMICBASE -MANIFEST:NO -OPT:REF -SUBSYSTEM:CONSOLE -MANIFESTUAC:NO -OPT:ICF -ERRORREPORT:PROMPT -NOLOGO -TLBID:1 -DEBUG:FULL -WINMD:NO LIBS += WindowsApp.lib endif + + ifeq ($(DEBUG), 1) + MSVC2017CompileFlags += -DEBUG + endif CFLAGS += $(MSVC2017CompileFlags) -nologo CXXFLAGS += $(MSVC2017CompileFlags) -nologo -EHsc @@ -392,6 +396,10 @@ else ifneq (,$(findstring windows_msvc2019,$(platform))) LIBS += WindowsApp.lib endif + ifeq ($(DEBUG), 1) + MSVC2019CompileFlags += -DEBUG + endif + CFLAGS += $(MSVC2019CompileFlags) -nologo CXXFLAGS += $(MSVC2019CompileFlags) -nologo -EHsc diff --git a/libretro/README_WINDOWS.txt b/libretro/README_WINDOWS.txt index 5f95e29844..755658dca4 100644 --- a/libretro/README_WINDOWS.txt +++ b/libretro/README_WINDOWS.txt @@ -13,8 +13,7 @@ pacman -S make Then use the following in msys: cd libretro - -make platform=windows_msvc2019_desktop_x64 -j32 && cp ppsspp_libretro.* /d/retroarch/cores +make platform=windows_msvc2019_desktop_x64 -j32 && cp ppsspp_libretro.* /d/retroarch/cores && rm nul Note that the latter part copies the DLL/PDB into wherever retroarch reads it from. Might need to adjust the path, and adjust -j32 depending on your number of logical CPUs - might not need that many threads (or you might need more...). @@ -24,6 +23,13 @@ and adjust -j32 depending on your number of logical CPUs - might not need that m To debug from within MSVC, open retroarch.exe (or retroarch_debug.exe) as a Project/Solution, then open a few of the cpp files, set some breakpoints and just launch using F5. +If you get + +``` +../git-version.cpp(3): error C2374: 'PPSSPP_GIT_VERSION': redefinition; multiple initialization +../git-version.cpp(1): note: see declaration of 'PPSSPP_GIT_VERSION' +``` +just do `rm ../git-version.cpp`. Useful libretro/vulkan sample code: diff --git a/libretro/libretro_vulkan.cpp b/libretro/libretro_vulkan.cpp index 78789d3250..b046368ae4 100644 --- a/libretro/libretro_vulkan.cpp +++ b/libretro/libretro_vulkan.cpp @@ -1,3 +1,10 @@ +// Debugging notes +// The crash happens when we try to call vkGetPhysicalDeviceProperties2KHR which seems to be null. +// +// Apparently we don't manage to specify the extensions we want. Still something reports that this one +// is present? +// Failed to load : vkGetPhysicalDeviceProperties2KHR +// Failed to load : vkGetPhysicalDeviceFeatures2KHR #include #include @@ -5,6 +12,8 @@ #include #include +#include "Common/Log.h" + #define VK_NO_PROTOTYPES #include "libretro/libretro_vulkan.h" @@ -49,6 +58,7 @@ struct VkSwapchainKHR_T { static VkSwapchainKHR_T chain; #define LIBRETRO_VK_WARP_LIST() \ + LIBRETRO_VK_WARP_FUNC(vkCreateInstance); \ LIBRETRO_VK_WARP_FUNC(vkDestroyInstance); \ LIBRETRO_VK_WARP_FUNC(vkCreateDevice); \ LIBRETRO_VK_WARP_FUNC(vkDestroyDevice); \ @@ -332,13 +342,11 @@ VKAPI_ATTR VkResult VKAPI_CALL vkCreateRenderPass_libretro(VkDevice device, cons } #undef LIBRETRO_VK_WARP_FUNC -#define LIBRETRO_VK_WARP_FUNC(x) \ - do { \ - if (!strcmp(pName, #x)) { \ - x##_org = (PFN_##x)fptr; \ - return (PFN_vkVoidFunction)x##_libretro; \ - } \ - } while (0) +#define LIBRETRO_VK_WARP_FUNC(x) \ + if (!strcmp(pName, #x)) { \ + x##_org = (PFN_##x)fptr; \ + return (PFN_vkVoidFunction)x##_libretro; \ + } VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL vkGetInstanceProcAddr_libretro(VkInstance instance, const char *pName) { if (false @@ -362,8 +370,10 @@ VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL vkGetInstanceProcAddr_libretro(VkInstan } PFN_vkVoidFunction fptr = vkGetInstanceProcAddr_org(instance, pName); - if (!fptr) - return fptr; + if (!fptr) { + ERROR_LOG(G3D, "Failed to load VK instance function: %s", pName); + return fptr; + } LIBRETRO_VK_WARP_LIST(); @@ -400,7 +410,10 @@ void vk_libretro_init(VkInstance instance, VkPhysicalDevice gpu, VkSurfaceKHR su vkCreateInstance = vkCreateInstance_libretro; } -void vk_libretro_set_hwrender_interface(retro_hw_render_interface *hw_render_interface) { vulkan = (retro_hw_render_interface_vulkan *)hw_render_interface; } +void vk_libretro_set_hwrender_interface(retro_hw_render_interface *hw_render_interface) { + vulkan = (retro_hw_render_interface_vulkan *)hw_render_interface; +} + void vk_libretro_shutdown() { memset(&vk_init_info, 0x00, sizeof(vk_init_info)); vulkan = NULL; From 61567796a2f38ee10501421bb80ee15551c631ff Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Sun, 11 Oct 2020 20:26:39 +0200 Subject: [PATCH 014/275] libretro: Fix screen size problem in Vulkan. (Still something is slightly off, there are duplicated lines on screen. Can't figure out what) --- Windows/PPSSPP.vcxproj | 1 + Windows/PPSSPP.vcxproj.filters | 3 +++ libretro/libretro.cpp | 9 ++++----- libretro/libretro_vulkan.cpp | 16 ++++++++++++---- 4 files changed, 20 insertions(+), 9 deletions(-) diff --git a/Windows/PPSSPP.vcxproj b/Windows/PPSSPP.vcxproj index 55a21f5a1d..bef161003e 100644 --- a/Windows/PPSSPP.vcxproj +++ b/Windows/PPSSPP.vcxproj @@ -1704,6 +1704,7 @@ + diff --git a/Windows/PPSSPP.vcxproj.filters b/Windows/PPSSPP.vcxproj.filters index ffbdc51429..141d03a3ca 100644 --- a/Windows/PPSSPP.vcxproj.filters +++ b/Windows/PPSSPP.vcxproj.filters @@ -729,5 +729,8 @@ Other Platforms\libretro + + Other Platforms\libretro + \ No newline at end of file diff --git a/libretro/libretro.cpp b/libretro/libretro.cpp index bdb5f8d1b1..52ff150474 100644 --- a/libretro/libretro.cpp +++ b/libretro/libretro.cpp @@ -34,6 +34,7 @@ #include "GPU/GPUInterface.h" #include "GPU/Common/FramebufferManagerCommon.h" #include "GPU/Common/TextureScalerCommon.h" +#include "GPU/Common/PresentationCommon.h" #include "libretro/libretro.h" #include "libretro/LibretroGraphicsContext.h" @@ -318,10 +319,8 @@ static void check_variables(CoreParameter &coreParam) if (!PSP_IsInited() && ppsspp_internal_resolution.Update(&g_Config.iInternalResolution)) { - coreParam.pixelWidth = coreParam.renderWidth = - g_Config.iInternalResolution * 480; - coreParam.pixelHeight = coreParam.renderHeight = - g_Config.iInternalResolution * 272; + coreParam.pixelWidth = coreParam.renderWidth = g_Config.iInternalResolution * 480; + coreParam.pixelHeight = coreParam.renderHeight = g_Config.iInternalResolution * 272; if (gpu) { @@ -421,7 +420,7 @@ void retro_get_system_av_info(struct retro_system_av_info *info) info->geometry.base_height = g_Config.iInternalResolution * 272; info->geometry.max_width = g_Config.iInternalResolution * 480; info->geometry.max_height = g_Config.iInternalResolution * 272; - info->geometry.aspect_ratio = 16.0 / 9.0; + info->geometry.aspect_ratio = 480.0 / 272.0; // Not 16:9! But very, very close. } unsigned retro_api_version(void) { return RETRO_API_VERSION; } diff --git a/libretro/libretro_vulkan.cpp b/libretro/libretro_vulkan.cpp index b046368ae4..1081f95e0b 100644 --- a/libretro/libretro_vulkan.cpp +++ b/libretro/libretro_vulkan.cpp @@ -13,6 +13,7 @@ #include #include "Common/Log.h" +#include "Core/Config.h" #define VK_NO_PROTOTYPES #include "libretro/libretro_vulkan.h" @@ -134,8 +135,15 @@ static VKAPI_ATTR VkResult VKAPI_CALL vkCreateLibretroSurfaceKHR(VkInstance inst VKAPI_ATTR VkResult VKAPI_CALL vkGetPhysicalDeviceSurfaceCapabilitiesKHR_libretro(VkPhysicalDevice physicalDevice, VkSurfaceKHR surface, VkSurfaceCapabilitiesKHR *pSurfaceCapabilities) { VkResult res = vkGetPhysicalDeviceSurfaceCapabilitiesKHR_org(physicalDevice, surface, pSurfaceCapabilities); if (res == VK_SUCCESS) { - pSurfaceCapabilities->currentExtent.width = -1; - pSurfaceCapabilities->currentExtent.height = -1; + int w = g_Config.iInternalResolution * 480; + int h = g_Config.iInternalResolution * 272; + + pSurfaceCapabilities->minImageExtent.width = w; + pSurfaceCapabilities->minImageExtent.height = h; + pSurfaceCapabilities->maxImageExtent.width = w; + pSurfaceCapabilities->maxImageExtent.height = h; + pSurfaceCapabilities->currentExtent.width = w; + pSurfaceCapabilities->currentExtent.height = h; } return res; } @@ -415,7 +423,7 @@ void vk_libretro_set_hwrender_interface(retro_hw_render_interface *hw_render_int } void vk_libretro_shutdown() { - memset(&vk_init_info, 0x00, sizeof(vk_init_info)); - vulkan = NULL; + memset(&vk_init_info, 0, sizeof(vk_init_info)); + vulkan = nullptr; DEDICATED_ALLOCATION = false; } From 495fd9a13c3a960aab65fd4aeedf4593aa65acf7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Sun, 11 Oct 2020 22:34:37 +0200 Subject: [PATCH 015/275] Fix OpenGL crash introduced in #13536 --- GPU/GLES/GPU_GLES.cpp | 2 +- Windows/XinputDevice.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/GPU/GLES/GPU_GLES.cpp b/GPU/GLES/GPU_GLES.cpp index acbd172dfa..5abe3d9274 100644 --- a/GPU/GLES/GPU_GLES.cpp +++ b/GPU/GLES/GPU_GLES.cpp @@ -183,7 +183,7 @@ void GPU_GLES::CheckGPUFeatures() { } if (gl_extensions.ARB_framebuffer_object || gl_extensions.NV_framebuffer_blit || gl_extensions.GLES3) { - features |= GPU_SUPPORTS_FRAMEBUFFER_BLIT; + features |= GPU_SUPPORTS_FRAMEBUFFER_BLIT | GPU_SUPPORTS_FRAMEBUFFER_BLIT_TO_DEPTH; } if (gl_extensions.ARB_vertex_array_object && gl_extensions.IsCoreContext) { features |= GPU_SUPPORTS_VAO; diff --git a/Windows/XinputDevice.cpp b/Windows/XinputDevice.cpp index f3f0ef32ce..5a4a636bf6 100644 --- a/Windows/XinputDevice.cpp +++ b/Windows/XinputDevice.cpp @@ -158,7 +158,7 @@ inline float Clampf(float val, float min, float max) { } inline float Signf(float val) { - return (0.0f < val) - (val < 0.0f); + return (float)((0.0f < val) - (val < 0.0f)); } inline float LinearMapf(float val, float a0, float a1, float b0, float b1) { From 332bb7feeb0608d1946b582a7d199e5e7c8b689d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Sun, 11 Oct 2020 13:07:08 +0200 Subject: [PATCH 016/275] VK: Whenever safely possible, shrink the render area. We just set the render area to the union of the scissor rects used in a pass. Might help some games on some mobile hardware, a little bit. Possibly #13464? --- Common/GPU/Vulkan/VulkanQueueRunner.cpp | 24 ++++++-- Common/GPU/Vulkan/VulkanQueueRunner.h | 1 + Common/GPU/Vulkan/VulkanRenderManager.cpp | 27 +++++++-- Common/GPU/Vulkan/VulkanRenderManager.h | 69 ++++++++++++++++++++++- GPU/Vulkan/DebugVisVulkan.cpp | 4 +- GPU/Vulkan/DebugVisVulkan.h | 2 +- UI/EmuScreen.cpp | 2 +- 7 files changed, 115 insertions(+), 14 deletions(-) diff --git a/Common/GPU/Vulkan/VulkanQueueRunner.cpp b/Common/GPU/Vulkan/VulkanQueueRunner.cpp index a1c117932c..2140824ab7 100644 --- a/Common/GPU/Vulkan/VulkanQueueRunner.cpp +++ b/Common/GPU/Vulkan/VulkanQueueRunner.cpp @@ -633,7 +633,9 @@ std::string VulkanQueueRunner::StepToString(const VKRStep &step) const { { int w = step.render.framebuffer ? step.render.framebuffer->width : vulkan_->GetBackbufferWidth(); int h = step.render.framebuffer ? step.render.framebuffer->height : vulkan_->GetBackbufferHeight(); - snprintf(buffer, sizeof(buffer), "RENDER %s (draws: %d, %dx%d, fb: %p, )", step.tag, step.render.numDraws, w, h, step.render.framebuffer); + int actual_w = step.render.renderArea.extent.width; + int actual_h = step.render.renderArea.extent.height; + snprintf(buffer, sizeof(buffer), "RENDER %s (draws: %d, %dx%d/%dx%d, fb: %p, )", step.tag, step.render.numDraws, actual_w, actual_h, w, h, step.render.framebuffer); break; } case VKRStepType::COPY: @@ -1414,6 +1416,8 @@ void VulkanQueueRunner::PerformBindFramebufferAsRenderTarget(const VKRStep &step } } else { framebuf = backbuffer_; + + // Raw, rotated backbuffer size. w = vulkan_->GetBackbufferWidth(); h = vulkan_->GetBackbufferHeight(); renderPass = GetBackbufferRenderPass(); @@ -1426,10 +1430,20 @@ void VulkanQueueRunner::PerformBindFramebufferAsRenderTarget(const VKRStep &step VkRenderPassBeginInfo rp_begin = { VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO }; rp_begin.renderPass = renderPass; rp_begin.framebuffer = framebuf; - rp_begin.renderArea.offset.x = 0; - rp_begin.renderArea.offset.y = 0; - rp_begin.renderArea.extent.width = w; - rp_begin.renderArea.extent.height = h; + + VkRect2D rc = step.render.renderArea; + if (!step.render.framebuffer) { + // Rendering to backbuffer, must rotate, just like scissors. + DisplayRect rotated_rc{ rc.offset.x, rc.offset.y, (int)rc.extent.width, (int)rc.extent.height }; + RotateRectToDisplay(rotated_rc, vulkan_->GetBackbufferWidth(), vulkan_->GetBackbufferHeight()); + + rc.offset.x = rotated_rc.x; + rc.offset.y = rotated_rc.y; + rc.extent.width = rotated_rc.w; + rc.extent.height = rotated_rc.h; + } + + rp_begin.renderArea = rc; rp_begin.clearValueCount = numClearVals; rp_begin.pClearValues = numClearVals ? clearVal : nullptr; vkCmdBeginRenderPass(cmd, &rp_begin, VK_SUBPASS_CONTENTS_INLINE); diff --git a/Common/GPU/Vulkan/VulkanQueueRunner.h b/Common/GPU/Vulkan/VulkanQueueRunner.h index 4353a32981..5a514a170c 100644 --- a/Common/GPU/Vulkan/VulkanQueueRunner.h +++ b/Common/GPU/Vulkan/VulkanQueueRunner.h @@ -152,6 +152,7 @@ struct VKRStep { VkImageLayout finalColorLayout; VkImageLayout finalDepthStencilLayout; u32 pipelineFlags; + VkRect2D renderArea; } render; struct { VKRFramebuffer *src; diff --git a/Common/GPU/Vulkan/VulkanRenderManager.cpp b/Common/GPU/Vulkan/VulkanRenderManager.cpp index 8dcdcd969d..e9bdf76103 100644 --- a/Common/GPU/Vulkan/VulkanRenderManager.cpp +++ b/Common/GPU/Vulkan/VulkanRenderManager.cpp @@ -260,8 +260,8 @@ void VulkanRenderManager::CreateBackbuffers() { if (InitDepthStencilBuffer(cmdInit)) { InitBackbufferFramebuffers(vulkan_->GetBackbufferWidth(), vulkan_->GetBackbufferHeight()); } - curWidth_ = -1; - curHeight_ = -1; + curWidthRaw_ = -1; + curHeightRaw_ = -1; if (HasBackbuffers()) { VLOG("Backbuffers Created"); @@ -529,6 +529,14 @@ void VulkanRenderManager::EndCurRenderStep() { // We'll often be able to avoid loading/saving the depth/stencil buffer. if (curRenderStep_) { curRenderStep_->render.pipelineFlags = curPipelineFlags_; + // We don't do this optimization for very small targets, probably not worth it. + if (!curRenderArea_.Empty() && (curWidth_ > 32 && curHeight_ > 32)) { + curRenderStep_->render.renderArea = curRenderArea_.ToVkRect2D(); + } else { + curRenderStep_->render.renderArea.offset = {}; + curRenderStep_->render.renderArea.extent = { (uint32_t)curWidth_, (uint32_t)curHeight_ }; + } + curRenderArea_.Reset(); // We no longer have a current render step. curRenderStep_ = nullptr; @@ -638,11 +646,20 @@ void VulkanRenderManager::BindFramebufferAsRenderTarget(VKRFramebuffer *fb, VKRR curStepHasViewport_ = false; curStepHasScissor_ = false; if (fb) { + curWidthRaw_ = fb->width; + curHeightRaw_ = fb->height; curWidth_ = fb->width; curHeight_ = fb->height; } else { - curWidth_ = vulkan_->GetBackbufferWidth(); - curHeight_ = vulkan_->GetBackbufferHeight(); + curWidthRaw_ = vulkan_->GetBackbufferWidth(); + curHeightRaw_ = vulkan_->GetBackbufferHeight(); + if (g_display_rotation == DisplayRotation::ROTATE_90 || g_display_rotation == DisplayRotation::ROTATE_270) { + curWidth_ = curHeightRaw_; + curHeight_ = curWidthRaw_; + } else { + curWidth_ = curWidthRaw_; + curHeight_ = curHeightRaw_; + } } // See above - we add a clear afterward if only one side for depth/stencil CLEAR/KEEP. @@ -944,6 +961,8 @@ void VulkanRenderManager::Clear(uint32_t clearColor, float clearZ, int clearSten data.clear.clearMask = clearMask; curRenderStep_->commands.push_back(data); } + + curRenderArea_.SetRect(0, 0, curWidth_, curHeight_); } void VulkanRenderManager::CopyFramebuffer(VKRFramebuffer *src, VkRect2D srcRect, VKRFramebuffer *dst, VkOffset2D dstPos, VkImageAspectFlags aspectMask, const char *tag) { diff --git a/Common/GPU/Vulkan/VulkanRenderManager.h b/Common/GPU/Vulkan/VulkanRenderManager.h index 1aa2dc515b..19fb6b1fb3 100644 --- a/Common/GPU/Vulkan/VulkanRenderManager.h +++ b/Common/GPU/Vulkan/VulkanRenderManager.h @@ -61,6 +61,53 @@ enum { MAX_TIMESTAMP_QUERIES = 128, }; +struct BoundingRect { + int x1; + int y1; + int x2; + int y2; + + BoundingRect() { + Reset(); + } + + void Reset() { + x1 = 65535; + y1 = 65535; + x2 = -65535; + y2 = -65535; + } + + bool Empty() const { + return x2 < 0; + } + + void SetRect(int x, int y, int width, int height) { + x1 = x; + y1 = y; + x2 = width; + y2 = height; + } + + void Apply(const VkRect2D &rect) { + if (rect.offset.x < x1) x1 = rect.offset.x; + if (rect.offset.y < y1) y1 = rect.offset.y; + int rect_x2 = rect.offset.x + rect.extent.width; + int rect_y2 = rect.offset.y + rect.extent.height; + if (rect_x2 > x2) x2 = rect_x2; + if (rect_y2 > y2) y2 = rect_y2; + } + + VkRect2D ToVkRect2D() const { + VkRect2D rect; + rect.offset.x = x1; + rect.offset.y = y1; + rect.extent.width = x2 - x1; + rect.extent.height = y2 - y1; + return rect; + } +}; + class VulkanRenderManager { public: VulkanRenderManager(VulkanContext *vulkan); @@ -131,10 +178,22 @@ public: curStepHasViewport_ = true; } - void SetScissor(const VkRect2D &rc) { + void SetScissor(VkRect2D rc) { _dbg_assert_(curRenderStep_ && curRenderStep_->stepType == VKRStepType::RENDER); _dbg_assert_((int)rc.extent.width >= 0); _dbg_assert_((int)rc.extent.height >= 0); + + // Clamp to curWidth_/curHeight_. Apparently an issue. + if ((int)(rc.offset.x + rc.extent.width) > curWidth_) { + rc.extent.width = curWidth_ - rc.offset.x; + } + if ((int)(rc.offset.y + rc.extent.height) > curHeight_) { + rc.extent.height = curHeight_ - rc.offset.y; + } + _dbg_assert_((int)(rc.offset.x + rc.extent.width) <= curWidth_); + _dbg_assert_((int)(rc.offset.y + rc.extent.height) <= curHeight_); + curRenderArea_.Apply(rc); + VkRenderData data{ VKRRenderCommand::SCISSOR }; data.scissor.scissor = rc; curRenderStep_->commands.push_back(data); @@ -323,8 +382,15 @@ private: int outOfDateFrames_ = 0; // Submission time state + + // Note: These are raw backbuffer-sized. Rotated. + int curWidthRaw_ = -1; + int curHeightRaw_ = -1; + + // Pre-rotation (as you'd expect). int curWidth_ = -1; int curHeight_ = -1; + bool insideFrame_ = false; // This is the offset within this frame, in case of a mid-frame sync. int renderStepOffset_ = 0; @@ -332,6 +398,7 @@ private: bool curStepHasViewport_ = false; bool curStepHasScissor_ = false; u32 curPipelineFlags_ = 0; + BoundingRect curRenderArea_; std::vector steps_; bool splitSubmit_ = false; diff --git a/GPU/Vulkan/DebugVisVulkan.cpp b/GPU/Vulkan/DebugVisVulkan.cpp index 7d74f571d9..9d1365bb5f 100644 --- a/GPU/Vulkan/DebugVisVulkan.cpp +++ b/GPU/Vulkan/DebugVisVulkan.cpp @@ -19,8 +19,8 @@ #include "Common/GPU/thin3d.h" #include "Common/UI/Context.h" #include "Common/UI/View.h" -#include "Common/System/System.h" #include "Common/System/Display.h" +#include "Common/System/System.h" #include "DebugVisVulkan.h" #include "Common/GPU/Vulkan/VulkanMemory.h" @@ -100,7 +100,7 @@ void DrawAllocatorVis(UIContext *ui, GPUInterface *gpu) { iter->Release(); } -void DrawProfilerVis(UIContext *ui, GPUInterface *gpu) { +void DrawGPUProfilerVis(UIContext *ui, GPUInterface *gpu) { if (!gpu) { return; } diff --git a/GPU/Vulkan/DebugVisVulkan.h b/GPU/Vulkan/DebugVisVulkan.h index b616d856f3..210771412a 100644 --- a/GPU/Vulkan/DebugVisVulkan.h +++ b/GPU/Vulkan/DebugVisVulkan.h @@ -24,4 +24,4 @@ class UIContext; // gpu MUST be an instance of GPU_Vulkan. If not, will definitely crash. void DrawAllocatorVis(UIContext *ui, GPUInterface *gpu); -void DrawProfilerVis(UIContext *ui, GPUInterface *gpu); +void DrawGPUProfilerVis(UIContext *ui, GPUInterface *gpu); diff --git a/UI/EmuScreen.cpp b/UI/EmuScreen.cpp index b3d11af155..60a36c42e5 100644 --- a/UI/EmuScreen.cpp +++ b/UI/EmuScreen.cpp @@ -1574,7 +1574,7 @@ void EmuScreen::renderUI() { } if (g_Config.iGPUBackend == (int)GPUBackend::VULKAN && g_Config.bShowGpuProfile) { - DrawProfilerVis(ctx, gpu); + DrawGPUProfilerVis(ctx, gpu); } #endif From 2127524b3553c7cdfd507a6c790fc3a3178248ed Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Mon, 12 Oct 2020 22:59:04 +0200 Subject: [PATCH 017/275] Fix a couple of issues with #13477, found by aliaspider. Might help #13494 and other freezing issues. --- Core/HLE/sceDisplay.cpp | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/Core/HLE/sceDisplay.cpp b/Core/HLE/sceDisplay.cpp index a8cb651a8b..a160fad05f 100644 --- a/Core/HLE/sceDisplay.cpp +++ b/Core/HLE/sceDisplay.cpp @@ -670,11 +670,12 @@ static void DoFrameIdleTiming() { // Give a little extra wiggle room in case the next vblank does more work. const double goal = lastFrameTime + (numVBlanksSinceFlip - 1) * scaledVblank - 0.001; if (numVBlanksSinceFlip >= 2 && before < goal) { - while (time_now_d() < goal) { + double cur_time; + while ((cur_time = time_now_d()) < goal) { #ifdef _WIN32 sleep_ms(1); #else - const double left = goal - time_now_d(); + const double left = goal - cur_time; usleep((long)(left * 1000000)); #endif } @@ -893,9 +894,10 @@ void hleLagSync(u64 userdata, int cyclesLate) { // Don't lag too long ever, if they leave it paused. double now = before; while (now < goal && goal < now + 0.01) { + // Tight loop on win32. TODO: Probably not a good idea... #ifndef _WIN32 - const double left = goal - time_now_d(); - usleep((long)(left * 1000000)); + const double left = goal - now; + usleep((long)(left * 1000000.0)); #endif now = time_now_d(); } From 8bff088bb3d519367bbe6e359fc0303ac8c3a008 Mon Sep 17 00:00:00 2001 From: aliaspider Date: Tue, 13 Oct 2020 03:06:05 +0100 Subject: [PATCH 018/275] libkirk: fix buffer overflow. --- ext/libkirk/ec.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ext/libkirk/ec.c b/ext/libkirk/ec.c index 89892ddf0f..bfdd86bcc4 100644 --- a/ext/libkirk/ec.c +++ b/ext/libkirk/ec.c @@ -295,8 +295,8 @@ static void generate_ecdsa(u8 *outR, u8 *outS, u8 *k, u8 *hash) bn_from_mon(R, ec_N, 21); bn_from_mon(S, ec_N, 21); - memcpy(outR,R+1,0x20); - memcpy(outS,S+1,0x20); + memcpy(outR,R+1,20); + memcpy(outS,S+1,20); } // Signing = From 1aff9b3e2bdb7c122c77cd97bfb22bcdff73b5d1 Mon Sep 17 00:00:00 2001 From: aliaspider Date: Tue, 13 Oct 2020 06:05:30 +0100 Subject: [PATCH 019/275] Vulkan: fix stack overflow. --- GPU/Vulkan/DrawEngineVulkan.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/GPU/Vulkan/DrawEngineVulkan.cpp b/GPU/Vulkan/DrawEngineVulkan.cpp index 25ed57ffbe..b2f86d23fd 100644 --- a/GPU/Vulkan/DrawEngineVulkan.cpp +++ b/GPU/Vulkan/DrawEngineVulkan.cpp @@ -439,7 +439,7 @@ VkDescriptorSet DrawEngineVulkan::GetOrCreateDescriptorSet(VkImageView imageView _assert_msg_(result == VK_SUCCESS, "Ran out of descriptor space in pool. sz=%d res=%d", (int)frame.descSets.size(), (int)result); // We just don't write to the slots we don't care about, which is fine. - VkWriteDescriptorSet writes[7]{}; + VkWriteDescriptorSet writes[9]{}; // Main texture int n = 0; VkDescriptorImageInfo tex[3]{}; From b8e83258882fd7c1c89306687549cac0f17eb786 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Wed, 14 Oct 2020 00:08:10 +0200 Subject: [PATCH 020/275] Fix text issue in God Eater Burst. Forgot that games can allocate texture in volatile memory too. We considered any texture from kernel memory "reliable", which is wrong since games can allocate out of the upper half of kernel RAM, which is called "volatile" memory. Fixes issue #13511 --- Core/MemMap.h | 7 +++++++ GPU/Common/TextureCacheCommon.cpp | 7 +++---- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/Core/MemMap.h b/Core/MemMap.h index 7383b719ea..d5df36cad7 100644 --- a/Core/MemMap.h +++ b/Core/MemMap.h @@ -261,10 +261,17 @@ inline bool IsVRAMAddress(const u32 address) { inline bool IsDepthTexVRAMAddress(const u32 address) { return ((address & 0x3FE00000) == 0x04200000) || ((address & 0x3FE00000) == 0x04600000); } + +// 0x08000000 -> 0x08800000 inline bool IsKernelAddress(const u32 address) { return ((address & 0x3F800000) == 0x08000000); } +// 0x08000000 -> 0x08400000 +inline bool IsKernelAndNotVolatileAddress(const u32 address) { + return ((address & 0x3FC00000) == 0x08000000); +} + bool IsScratchpadAddress(const u32 address); // Used for auto-converted char * parameters, which can sometimes legitimately be null - diff --git a/GPU/Common/TextureCacheCommon.cpp b/GPU/Common/TextureCacheCommon.cpp index 03e6262940..1c5c63cdce 100644 --- a/GPU/Common/TextureCacheCommon.cpp +++ b/GPU/Common/TextureCacheCommon.cpp @@ -497,15 +497,14 @@ TexCacheEntry *TextureCacheCommon::SetTexture() { if (!entry) { VERBOSE_LOG(G3D, "No texture in cache for %08x, decoding...", texaddr); - TexCacheEntry *entryNew = new TexCacheEntry{}; - cache_[cachekey].reset(entryNew); + entry = new TexCacheEntry{}; + cache_[cachekey].reset(entry); if (hasClut && clutRenderAddress_ != 0xFFFFFFFF) { WARN_LOG_REPORT_ONCE(clutUseRender, G3D, "Using texture with rendered CLUT: texfmt=%d, clutfmt=%d", gstate.getTextureFormat(), gstate.getClutPaletteFormat()); } - entry = entryNew; - if (Memory::IsKernelAddress(texaddr)) { + if (Memory::IsKernelAndNotVolatileAddress(texaddr)) { // It's the builtin font texture. entry->status = TexCacheEntry::STATUS_RELIABLE; } else if (g_Config.bTextureBackoffCache) { From b3deaab96362e5d94abf21e7afc8084b6e0c55ff Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Wed, 14 Oct 2020 23:15:49 +0200 Subject: [PATCH 021/275] VS 2017 buildfix hack - these parameters are new to Windows. Thanks autechre. --- Core/HLE/proAdhoc.cpp | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/Core/HLE/proAdhoc.cpp b/Core/HLE/proAdhoc.cpp index 994b781194..a68daa012d 100644 --- a/Core/HLE/proAdhoc.cpp +++ b/Core/HLE/proAdhoc.cpp @@ -1950,6 +1950,15 @@ int setSockReuseAddrPort(int sock) { #if !defined(TCP_KEEPIDLE) #define TCP_KEEPIDLE TCP_KEEPALIVE //TCP_KEEPIDLE on Linux is equivalent to TCP_KEEPALIVE on macOS #endif +// VS 2017 compatibility +#if _MSC_VER +#ifndef TCP_KEEPCNT +#define TCP_KEEPCNT 16 +#endif +#ifndef TCP_KEEPINTVL +#define TCP_KEEPINTVL 17 +#endif +#endif int setSockKeepAlive(int sock, bool keepalive, const int keepinvl, const int keepcnt, const int keepidle) { int optval = keepalive ? 1 : 0; int optlen = sizeof(optval); From dc3c161b21f4d64c0e41b8940771369f4d5ae95c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Wed, 14 Oct 2020 23:30:40 +0200 Subject: [PATCH 022/275] Add missing include in URL.h Thanks autechre. --- Common/Net/URL.h | 1 + 1 file changed, 1 insertion(+) diff --git a/Common/Net/URL.h b/Common/Net/URL.h index 1a8a91677b..7fcaa0c455 100644 --- a/Common/Net/URL.h +++ b/Common/Net/URL.h @@ -5,6 +5,7 @@ #include #include #include +#include #include #if defined(_MSC_VER) && _MSC_VER < 1900 From c1b52c398b4780c337b004b748a973a62c1abe4f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Wed, 14 Oct 2020 23:45:19 +0200 Subject: [PATCH 023/275] Minor cleanups related to #13527 Doesn't fix it though. A "Resume" button will be added later to BREAK crashes. --- Core/HLE/sceKernelMemory.cpp | 10 ++++++++++ Core/MIPS/MIPSInt.cpp | 1 - UI/EmuScreen.cpp | 10 ++++++++-- 3 files changed, 18 insertions(+), 3 deletions(-) diff --git a/Core/HLE/sceKernelMemory.cpp b/Core/HLE/sceKernelMemory.cpp index 8ceb699fad..50b0b75fdf 100644 --- a/Core/HLE/sceKernelMemory.cpp +++ b/Core/HLE/sceKernelMemory.cpp @@ -1141,6 +1141,16 @@ static int sceKernelPrintf(const char *formatString) supported = false; } + // Scrub for beeps and other suspicious control characters. + for (size_t i = 0; i < result.size(); i++) { + switch (result[i]) { + case 7: // BEL + case 8: // Backspace + result[i] = ' '; + break; + } + } + // Just in case there were embedded strings that had \n's. if (!result.empty() && result[result.size() - 1] == '\n') result.resize(result.size() - 1); diff --git a/Core/MIPS/MIPSInt.cpp b/Core/MIPS/MIPSInt.cpp index b49dab057f..bfbce5db51 100644 --- a/Core/MIPS/MIPSInt.cpp +++ b/Core/MIPS/MIPSInt.cpp @@ -156,7 +156,6 @@ namespace MIPSInt void Int_Break(MIPSOpcode op) { - Reporting::ReportMessage("BREAK instruction hit"); Core_Break(); PC += 4; } diff --git a/UI/EmuScreen.cpp b/UI/EmuScreen.cpp index 60a36c42e5..3a3c5ddb45 100644 --- a/UI/EmuScreen.cpp +++ b/UI/EmuScreen.cpp @@ -1289,7 +1289,7 @@ ABI: %s int x = 20; int y = 50; draw2d->DrawTextShadow(ubuntu24, statbuf, x, y, 0xFFFFFFFF); - y += 100; + y += 140; if (info.type == ExceptionType::MEMORY) { snprintf(statbuf, sizeof(statbuf), R"( @@ -1310,7 +1310,13 @@ PC: %08x)", info.address, info.pc); draw2d->DrawTextShadow(ubuntu24, statbuf, x, y, 0xFFFFFFFF); - y += 120; + y += 180; + } else { + snprintf(statbuf, sizeof(statbuf), R"( +BREAK +)"); + draw2d->DrawTextShadow(ubuntu24, statbuf, x, y, 0xFFFFFFFF); + y += 180; } std::string kernelState = __KernelStateSummary(); From f46759be5a30cae785fc889568fc60c96deecd54 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Wed, 14 Oct 2020 23:49:44 +0200 Subject: [PATCH 024/275] Another missing header buildfix thanks autechre --- Common/MemoryUtil.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/Common/MemoryUtil.cpp b/Common/MemoryUtil.cpp index a6f5d5e919..7076da2fc9 100644 --- a/Common/MemoryUtil.cpp +++ b/Common/MemoryUtil.cpp @@ -18,6 +18,7 @@ #include "ppsspp_config.h" #include +#include #include "Common/Common.h" #include "Common/Log.h" From 74f8b3c69aa7489ace8650cc9bcd07f02fd0e0ad Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Thu, 15 Oct 2020 00:03:47 +0200 Subject: [PATCH 025/275] Yet another one --- Common/Serialize/Serializer.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Common/Serialize/Serializer.h b/Common/Serialize/Serializer.h index 99d7a5c343..38fcd686c9 100644 --- a/Common/Serialize/Serializer.h +++ b/Common/Serialize/Serializer.h @@ -31,6 +31,8 @@ #include #include +#include + #include "Common/CommonTypes.h" #include "Common/Log.h" From b5f7f5350a19af9aa1eca3a60c92cc2bafd7ddda Mon Sep 17 00:00:00 2001 From: aliaspider Date: Wed, 14 Oct 2020 23:34:01 +0100 Subject: [PATCH 026/275] Libretro: add SYSPROP_DISPLAY_SAFE_INSET* properties. fixes screen frame size. --- libretro/libretro.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/libretro/libretro.cpp b/libretro/libretro.cpp index 52ff150474..69984ee667 100644 --- a/libretro/libretro.cpp +++ b/libretro/libretro.cpp @@ -888,6 +888,11 @@ float System_GetPropertyFloat(SystemProperty prop) { case SYSPROP_DISPLAY_REFRESH_RATE: return 60.f; + case SYSPROP_DISPLAY_SAFE_INSET_LEFT: + case SYSPROP_DISPLAY_SAFE_INSET_RIGHT: + case SYSPROP_DISPLAY_SAFE_INSET_TOP: + case SYSPROP_DISPLAY_SAFE_INSET_BOTTOM: + return 0.0f; default: break; } From 6c2aa8622557f38dcda390f2b42f61d2a7be48be Mon Sep 17 00:00:00 2001 From: Leo Date: Thu, 15 Oct 2020 18:54:50 +0330 Subject: [PATCH 027/275] Replaced shader vertex file for naturalA Vertex shader file is different now. Not sure why I was using the old one anyway. --- assets/shaders/defaultshaders.ini | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/assets/shaders/defaultshaders.ini b/assets/shaders/defaultshaders.ini index 78c1eb62a4..6b3d70f13d 100644 --- a/assets/shaders/defaultshaders.ini +++ b/assets/shaders/defaultshaders.ini @@ -17,7 +17,7 @@ Vertex=natural.vsh [NaturalA] Name=Natural Colors (No Blur) Fragment=naturalA.fsh -Vertex=natural.vsh +Vertex=naturalA.vsh [Vignette] Name=Vignette Author=Henrik From 370d6ef62d7a176d5fc62fa132834bd97f21c0cd Mon Sep 17 00:00:00 2001 From: Leo Date: Thu, 15 Oct 2020 18:56:04 +0330 Subject: [PATCH 028/275] Removed unnecessary vertex coords --- assets/shaders/naturalA.fsh | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/assets/shaders/naturalA.fsh b/assets/shaders/naturalA.fsh index 8e396464ca..201f8e7ea9 100644 --- a/assets/shaders/naturalA.fsh +++ b/assets/shaders/naturalA.fsh @@ -1,6 +1,6 @@ -// Natural Vision Shader with removed blur. +// Natural Vision Shader, modified to use in PPSSPP. -// by ShadX (Modded by SimoneT and Leopard20) +// by ShadX (Modded by SimoneT) // http://forums.ngemu.com/showthread.php?t=76098 #ifdef GL_ES @@ -9,10 +9,7 @@ precision mediump int; #endif uniform sampler2D sampler0; -varying vec4 v_texcoord0; -varying vec4 v_texcoord1; -varying vec4 v_texcoord2; -varying vec4 v_texcoord3; +varying vec2 v_texcoord0; const mat3 RGBtoYIQ = mat3(0.299, 0.596, 0.212, 0.587,-0.275,-0.523, @@ -28,7 +25,7 @@ void main() { vec3 c0,c1; -c0 = texture2D(sampler0,v_texcoord0.xy).xyz; +c0 = texture2D(sampler0,v_texcoord0).xyz; c1=RGBtoYIQ*c0; From f3514704b14789312d115a84948c8a12c57f8bff Mon Sep 17 00:00:00 2001 From: Leo Date: Thu, 15 Oct 2020 18:57:24 +0330 Subject: [PATCH 029/275] Added new vertex shader file naturalA.vsh This fixes the trembling issue --- assets/shaders/naturalA.vsh | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 assets/shaders/naturalA.vsh diff --git a/assets/shaders/naturalA.vsh b/assets/shaders/naturalA.vsh new file mode 100644 index 0000000000..98b1fb9e77 --- /dev/null +++ b/assets/shaders/naturalA.vsh @@ -0,0 +1,12 @@ +uniform vec2 u_texelDelta; + +attribute vec4 a_position; +attribute vec2 a_texcoord0; + +varying vec2 v_texcoord0; + +void main() +{ + gl_Position=a_position; + v_texcoord0=a_texcoord0; +} From 5c387ce4130b8856df7b6821ec792ed8fcc318ec Mon Sep 17 00:00:00 2001 From: Leo Date: Thu, 15 Oct 2020 19:01:24 +0330 Subject: [PATCH 030/275] Removed unused texel info --- assets/shaders/naturalA.vsh | 2 -- 1 file changed, 2 deletions(-) diff --git a/assets/shaders/naturalA.vsh b/assets/shaders/naturalA.vsh index 98b1fb9e77..ebad6e2724 100644 --- a/assets/shaders/naturalA.vsh +++ b/assets/shaders/naturalA.vsh @@ -1,5 +1,3 @@ -uniform vec2 u_texelDelta; - attribute vec4 a_position; attribute vec2 a_texcoord0; From 1405e28166faf6983d355090971714a5a7f05bda Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Thu, 15 Oct 2020 23:48:05 +0200 Subject: [PATCH 031/275] More buildfixes --- Core/Util/PortManager.cpp | 1 + libretro/Makefile.common | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/Core/Util/PortManager.cpp b/Core/Util/PortManager.cpp index 3c4b808502..2ea62371e8 100644 --- a/Core/Util/PortManager.cpp +++ b/Core/Util/PortManager.cpp @@ -26,6 +26,7 @@ #include +#include #include #include #include diff --git a/libretro/Makefile.common b/libretro/Makefile.common index 950b6a864a..0c03333b9d 100644 --- a/libretro/Makefile.common +++ b/libretro/Makefile.common @@ -569,7 +569,7 @@ ifeq ($(WITH_DYNAREC),1) SOURCES_C += $(EXTDIR)/libpng17/arm/arm_init.c \ $(EXTDIR)/libpng17/arm/filter_neon_intrinsics.c - ASMFILES += $(NATIVEDIR)/math/fast/fast_matrix_neon.S \ + ASMFILES += $(COMMONDIR)/math/fast/fast_matrix_neon.S \ $(EXTDIR)/libpng17/arm/filter_neon.S endif else From cc1ff5b94c1040d0b95699ec6aeaa82f5be72e97 Mon Sep 17 00:00:00 2001 From: ANR2ME Date: Thu, 15 Oct 2020 23:56:08 +0700 Subject: [PATCH 032/275] 2nd or more instance of PPSSPP should only bind it's own localhost IP for Adhoc Server. Fixes Capcom Classics Collection Remix multiplayer on multiple-instance. --- Core/HLE/proAdhocServer.cpp | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/Core/HLE/proAdhocServer.cpp b/Core/HLE/proAdhocServer.cpp index d9ea077054..02dd1ee323 100644 --- a/Core/HLE/proAdhocServer.cpp +++ b/Core/HLE/proAdhocServer.cpp @@ -55,6 +55,7 @@ #include "Common/File/FileUtil.h" #include "Common/TimeUtil.h" #include "Core/Util/PortManager.h" +#include "Core/Instance.h" #include "Core/Core.h" #include "Core/Host.h" #include "Core/HLE/proAdhocServer.h" @@ -1808,6 +1809,9 @@ int create_listen_socket(uint16_t port) // Created Socket if(fd != -1) { + // Ignore SIGPIPE when supported (ie. BSD/MacOS) + setSockNoSIGPIPE(fd, 1); + // Enable KeepAlive enable_keepalive(fd); @@ -1827,12 +1831,10 @@ int create_listen_socket(uint16_t port) local.sin_addr.s_addr = INADDR_ANY; local.sin_port = htons(port); - //Should only bind to specific IP for the 2nd or more instance of PPSSPP to prevent communication interference issue when sharing the same port. Doesn't work well when PPSSPP_ID reseted everytime emulation restarted. - /* + // Should only bind to specific IP for the 2nd or more instance of PPSSPP to prevent communication interference issue when sharing the same port. (ie. Capcom Classics Collection Remixed) if (PPSSPP_ID > 1) { local.sin_addr = g_localhostIP.in.sin_addr; } - */ // Bind Local Address to Socket int bindresult = bind(fd, (struct sockaddr *)&local, sizeof(local)); From 40c4df23064c4f9f77e6506187cd92f7379787e6 Mon Sep 17 00:00:00 2001 From: ANR2ME Date: Fri, 16 Oct 2020 12:00:54 +0700 Subject: [PATCH 033/275] Fix disconnection issue when joining multiplayer on Capcom Puzzle World --- Core/HLE/sceNetAdhoc.cpp | 38 +++++++++++++++++++------------------- 1 file changed, 19 insertions(+), 19 deletions(-) diff --git a/Core/HLE/sceNetAdhoc.cpp b/Core/HLE/sceNetAdhoc.cpp index d14ed27a35..d761da5763 100644 --- a/Core/HLE/sceNetAdhoc.cpp +++ b/Core/HLE/sceNetAdhoc.cpp @@ -2908,7 +2908,7 @@ static int sceNetAdhocPtpOpen(const char *srcmac, int sport, const char *dstmac, getLocalMac(saddr); } // Valid Addresses - if (saddr != NULL && isLocalMAC(saddr) && daddr != NULL && !isBroadcastMAC(daddr)) { + if (saddr != NULL && isLocalMAC(saddr) && daddr != NULL && !isBroadcastMAC(daddr) && !isZeroMAC(daddr)) { // Dissidia 012 will try to reOpen the port without Closing the old one first when PtpConnect failed to try again. if (isPTPPortInUse(sport, false)) return hleLogDebug(SCENET, ERROR_NET_ADHOC_PORT_IN_USE, "port in use"); @@ -3185,6 +3185,7 @@ static int sceNetAdhocPtpAccept(int id, u32 peerMacAddrPtr, u32 peerPortPtr, int // Listener Socket if (ptpsocket.state == ADHOC_PTP_STATE_LISTEN) { + hleEatMicro(500); // Address Information sockaddr_in peeraddr; memset(&peeraddr, 0, sizeof(peeraddr)); @@ -3199,7 +3200,7 @@ static int sceNetAdhocPtpAccept(int id, u32 peerMacAddrPtr, u32 peerPortPtr, int error = errno; } - if (newsocket == 0 || (newsocket == SOCKET_ERROR && (error == EAGAIN || error == EWOULDBLOCK || error == ETIMEDOUT))) { + if (newsocket == 0 || (newsocket == SOCKET_ERROR && (error == EAGAIN || error == EWOULDBLOCK))) { if (flag == 0) { // Simulate blocking behaviour with non-blocking socket u64 threadSocketId = ((u64)__KernelGetCurThread()) << 32 | ptpsocket.id; @@ -3220,26 +3221,26 @@ static int sceNetAdhocPtpAccept(int id, u32 peerMacAddrPtr, u32 peerPortPtr, int // Action would block if (flag) - return ERROR_NET_ADHOC_WOULD_BLOCK; + return hleLogSuccessVerboseI(SCENET, ERROR_NET_ADHOC_WOULD_BLOCK, "would block"); // Timeout - return ERROR_NET_ADHOC_TIMEOUT; + return hleLogSuccessVerboseI(SCENET, ERROR_NET_ADHOC_TIMEOUT, "timeout"); } // Client Socket - return ERROR_NET_ADHOC_NOT_LISTENED; + return hleLogSuccessVerboseI(SCENET, ERROR_NET_ADHOC_NOT_LISTENED, "not listened"); } // Invalid Socket - return ERROR_NET_ADHOC_INVALID_SOCKET_ID; + return hleLogSuccessVerboseI(SCENET, ERROR_NET_ADHOC_INVALID_SOCKET_ID, "invalid socket id"); } // Invalid Arguments - return ERROR_NET_ADHOC_INVALID_ARG; + return hleLogSuccessVerboseI(SCENET, ERROR_NET_ADHOC_INVALID_ARG, "invalid arg"); } // Library is uninitialized - return ERROR_NET_ADHOC_NOT_INITIALIZED; + return hleLogSuccessVerboseI(SCENET, ERROR_NET_ADHOC_NOT_INITIALIZED, "not initialized"); } /** @@ -3252,7 +3253,7 @@ static int sceNetAdhocPtpAccept(int id, u32 peerMacAddrPtr, u32 peerPortPtr, int static int sceNetAdhocPtpConnect(int id, int timeout, int flag) { INFO_LOG(SCENET, "sceNetAdhocPtpConnect(%i, %i, %i) at %08x", id, timeout, flag, currentMIPS->pc); if (!g_Config.bEnableWlan) { - return 0; + return -1; } // Library is initialized @@ -3271,6 +3272,7 @@ static int sceNetAdhocPtpConnect(int id, int timeout, int flag) { // Valid Client Socket if (ptpsocket.state == ADHOC_PTP_STATE_CLOSED || ptpsocket.state == ADHOC_PTP_STATE_SYN_SENT) { + hleEatMicro(500); // Target Address sockaddr_in sin; memset(&sin, 0, sizeof(sin)); @@ -3325,28 +3327,25 @@ static int sceNetAdhocPtpConnect(int id, int timeout, int flag) { } // NonBlocking Mode else { - return ERROR_NET_ADHOC_WOULD_BLOCK; + return hleLogDebug(SCENET, ERROR_NET_ADHOC_WOULD_BLOCK, "would block"); } } } // Peer not found - if (flag) - return ERROR_NET_ADHOC_WOULD_BLOCK; - - return ERROR_NET_ADHOC_CONNECTION_REFUSED; // ERROR_NET_ADHOC_TIMEOUT; + return hleLogDebug(SCENET, ERROR_NET_ADHOC_INVALID_ADDR, "invalid address"); // ERROR_NET_ADHOC_WOULD_BLOCK / ERROR_NET_ADHOC_TIMEOUT } // Not a valid Client Socket - return ERROR_NET_ADHOC_NOT_OPENED; + return hleLogDebug(SCENET, ERROR_NET_ADHOC_NOT_OPENED, "not opened"); } // Invalid Socket - return ERROR_NET_ADHOC_INVALID_SOCKET_ID; + return hleLogDebug(SCENET, ERROR_NET_ADHOC_INVALID_SOCKET_ID, "invalid socket id"); } // Library is uninitialized - return ERROR_NET_ADHOC_NOT_INITIALIZED; + return hleLogDebug(SCENET, ERROR_NET_ADHOC_NOT_INITIALIZED, "not initialized"); } int NetAdhocPtp_Close(int id, int unknown) { @@ -3814,13 +3813,14 @@ static int sceNetAdhocPtpFlush(int id, int timeout, int nonblock) { // Connected Socket if (ptpsocket.state == ADHOC_PTP_STATE_ESTABLISHED) { + hleEatMicro(1000); // There are two ways to flush, you can either set TCP_NODELAY to 1 or TCP_CORK to 0. // Apply Send Timeout Settings to Socket setSockTimeout(ptpsocket.id, SO_SNDTIMEO, timeout); int error = FlushPtpSocket(ptpsocket.id); - if (error == EAGAIN || error == EWOULDBLOCK || error == ETIMEDOUT) { + if (error == EAGAIN || error == EWOULDBLOCK) { // Non-Blocking if (nonblock) return ERROR_NET_ADHOC_WOULD_BLOCK; @@ -5277,7 +5277,7 @@ void __NetTriggerCallbacks() } // Must be delayed long enough whenever there is a pending callback. Should it be 100-500ms for Adhocctl Events? or Not Less than the delays on sceNetAdhocctl HLE? - sceKernelDelayThread(delayus); + sceKernelDelayThread(adhocDefaultDelay); } void __NetMatchingCallbacks() //(int matchingId) From 88ebed4c02b0095f68affb18bb5f2268eb606570 Mon Sep 17 00:00:00 2001 From: ANR2ME Date: Fri, 16 Oct 2020 12:01:46 +0700 Subject: [PATCH 034/275] Prevent AdhocServer Pings from spamming Debug Log --- Core/HLE/proAdhoc.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Core/HLE/proAdhoc.cpp b/Core/HLE/proAdhoc.cpp index a68daa012d..2a45abdc45 100644 --- a/Core/HLE/proAdhoc.cpp +++ b/Core/HLE/proAdhoc.cpp @@ -1372,7 +1372,7 @@ int friendFinder(){ else { // Update Ping Time lastping = now; - DEBUG_LOG(SCENET, "FriendFinder: Sending OPCODE_PING (%llu)", static_cast(now)); + VERBOSE_LOG(SCENET, "FriendFinder: Sending OPCODE_PING (%llu)", static_cast(now)); } } } From b3b435aafb452ae629b568e0d3a01a4391279bc2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Fri, 16 Oct 2020 09:11:55 +0200 Subject: [PATCH 035/275] Add libretro CI. --- gitlab-ci.yml | 59 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 59 insertions(+) create mode 100644 gitlab-ci.yml diff --git a/gitlab-ci.yml b/gitlab-ci.yml new file mode 100644 index 0000000000..4fe98fb040 --- /dev/null +++ b/gitlab-ci.yml @@ -0,0 +1,59 @@ +# libretro CI + +.core-defs: + variables: + JNI_PATH: libretro + CORENAME: ppsspp + +include: + - template: Jobs/Code-Quality.gitlab-ci.yml + - project: 'libretro-infrastructure/ci-templates' + file: '/linux-x64.yml' + - project: 'libretro-infrastructure/ci-templates' + file: '/windows-x64-mingw.yml' + - project: 'libretro-infrastructure/ci-templates' + file: '/android-jni.yml' + +stages: + - build-prepare + - build-shared + - build-static + - test + +#Desktop +libretro-build-linux-x64: + extends: + - .core-defs + - .libretro-linux-x64-make-default + variables: + MAKEFILE_PATH: libretro + MAKEFILE: Makefile + +libretro-build-windows-x64: + extends: + - .core-defs + - .libretro-windows-x64-mingw-make-default + variables: + MAKEFILE_PATH: libretro + MAKEFILE: Makefile + +# Android +android-armeabi-v7a: + extends: + - .core-defs + - .libretro-android-jni-armeabi-v7a + +android-arm64-v8a: + extends: + - .core-defs + - .libretro-android-jni-arm64-v8a + +android-x86_64: + extends: + - .core-defs + - .libretro-android-jni-x86_64 + +android-x86: + extends: + - .core-defs + - .libretro-android-jni-x86 From 4c034ce988cde30fd82a161a76fbaa0545fc0387 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Fri, 16 Oct 2020 09:13:41 +0200 Subject: [PATCH 036/275] Make all the Comp_Cache implementations the same. We have the informative comments in the interpreter implementation anyway. --- Core/MIPS/ARM/ArmCompLoadStore.cpp | 34 ++++++-------------------- Core/MIPS/ARM64/Arm64CompLoadStore.cpp | 34 ++++++-------------------- Core/MIPS/IR/IRCompLoadStore.cpp | 32 +++++------------------- Core/MIPS/MIPSInt.cpp | 2 ++ Core/MIPS/x86/CompLoadStore.cpp | 15 +++++++++++- 5 files changed, 38 insertions(+), 79 deletions(-) diff --git a/Core/MIPS/ARM/ArmCompLoadStore.cpp b/Core/MIPS/ARM/ArmCompLoadStore.cpp index 3d49b2dc61..96c8f7133b 100644 --- a/Core/MIPS/ARM/ArmCompLoadStore.cpp +++ b/Core/MIPS/ARM/ArmCompLoadStore.cpp @@ -386,37 +386,19 @@ namespace MIPSComp } void ArmJit::Comp_Cache(MIPSOpcode op) { - // int imm = (s16)(op & 0xFFFF); - // int rs = _RS; - // int addr = R(rs) + imm; + CONDITIONAL_DISABLE(LSU); + int func = (op >> 16) & 0x1F; - // It appears that a cache line is 0x40 (64) bytes, loops in games - // issue the cache instruction at that interval. - - // These codes might be PSP-specific, they don't match regular MIPS cache codes very well + // See Int_Cache for the definitions. switch (func) { - // Icache - case 8: - // Invalidate the instruction cache at this address - DISABLE; - break; - // Dcache - case 24: - // "Create Dirty Exclusive" - for avoiding a cacheline fill before writing to it. - // Will cause garbage on the real machine so we just ignore it, the app will overwrite the cacheline. - break; - case 25: // Hit Invalidate - zaps the line if present in cache. Should not writeback???? scary. - // No need to do anything. - break; - case 27: // D-cube. Hit Writeback Invalidate. Tony Hawk Underground 2 - break; - case 30: // GTA LCS, a lot. Fill (prefetch). Tony Hawk Underground 2 - break; - + case 24: break; + case 25: break; + case 27: break; + case 30: break; default: + // Fall back to the interpreter. DISABLE; - break; } } } diff --git a/Core/MIPS/ARM64/Arm64CompLoadStore.cpp b/Core/MIPS/ARM64/Arm64CompLoadStore.cpp index ad706c5221..ca1aae8a8a 100644 --- a/Core/MIPS/ARM64/Arm64CompLoadStore.cpp +++ b/Core/MIPS/ARM64/Arm64CompLoadStore.cpp @@ -432,37 +432,19 @@ namespace MIPSComp { } void Arm64Jit::Comp_Cache(MIPSOpcode op) { - // int imm = (s16)(op & 0xFFFF); - // int rs = _RS; - // int addr = R(rs) + imm; + CONDITIONAL_DISABLE(LSU); + int func = (op >> 16) & 0x1F; - // It appears that a cache line is 0x40 (64) bytes, loops in games - // issue the cache instruction at that interval. - - // These codes might be PSP-specific, they don't match regular MIPS cache codes very well + // See Int_Cache for the definitions. switch (func) { - // Icache - case 8: - // Invalidate the instruction cache at this address - DISABLE; - break; - // Dcache - case 24: - // "Create Dirty Exclusive" - for avoiding a cacheline fill before writing to it. - // Will cause garbage on the real machine so we just ignore it, the app will overwrite the cacheline. - break; - case 25: // Hit Invalidate - zaps the line if present in cache. Should not writeback???? scary. - // No need to do anything. - break; - case 27: // D-cube. Hit Writeback Invalidate. Tony Hawk Underground 2 - break; - case 30: // GTA LCS, a lot. Fill (prefetch). Tony Hawk Underground 2 - break; - + case 24: break; + case 25: break; + case 27: break; + case 30: break; default: + // Fall back to the interpreter. DISABLE; - break; } } } diff --git a/Core/MIPS/IR/IRCompLoadStore.cpp b/Core/MIPS/IR/IRCompLoadStore.cpp index a8ed9d8166..ec2fc33aaf 100644 --- a/Core/MIPS/IR/IRCompLoadStore.cpp +++ b/Core/MIPS/IR/IRCompLoadStore.cpp @@ -108,37 +108,17 @@ namespace MIPSComp { void IRFrontend::Comp_Cache(MIPSOpcode op) { CONDITIONAL_DISABLE(LSU); -// int imm = (s16)(op & 0xFFFF); -// int rs = _RS; -// int addr = R(rs) + imm; int func = (op >> 16) & 0x1F; - // It appears that a cache line is 0x40 (64) bytes, loops in games - // issue the cache instruction at that interval. - - // These codes might be PSP-specific, they don't match regular MIPS cache codes very well + // See Int_Cache for the definitions. switch (func) { - // Icache - case 8: - // Invalidate the instruction cache at this address - DISABLE; - break; - // Dcache - case 24: - // "Create Dirty Exclusive" - for avoiding a cacheline fill before writing to it. - // Will cause garbage on the real machine so we just ignore it, the app will overwrite the cacheline. - break; - case 25: // Hit Invalidate - zaps the line if present in cache. Should not writeback???? scary. - // No need to do anything. - break; - case 27: // D-cube. Hit Writeback Invalidate. Tony Hawk Underground 2 - break; - case 30: // GTA LCS, a lot. Fill (prefetch). Tony Hawk Underground 2 - break; - + case 24: break; + case 25: break; + case 27: break; + case 30: break; default: + // Fall back to the interpreter. DISABLE; - break; } } } diff --git a/Core/MIPS/MIPSInt.cpp b/Core/MIPS/MIPSInt.cpp index bfbce5db51..0065774933 100644 --- a/Core/MIPS/MIPSInt.cpp +++ b/Core/MIPS/MIPSInt.cpp @@ -102,6 +102,8 @@ namespace MIPSInt // issue the cache instruction at that interval. // These codes might be PSP-specific, they don't match regular MIPS cache codes very well + + // NOTE: If you add support for more, make sure they are handled in the various Jit::Comp_Cache. switch (func) { // Icache case 8: diff --git a/Core/MIPS/x86/CompLoadStore.cpp b/Core/MIPS/x86/CompLoadStore.cpp index e3d87bcf94..f094684417 100644 --- a/Core/MIPS/x86/CompLoadStore.cpp +++ b/Core/MIPS/x86/CompLoadStore.cpp @@ -401,7 +401,20 @@ namespace MIPSComp { } void Jit::Comp_Cache(MIPSOpcode op) { - DISABLE; + CONDITIONAL_DISABLE(LSU); + + int func = (op >> 16) & 0x1F; + + // See Int_Cache for the definitions. + switch (func) { + case 24: break; + case 25: break; + case 27: break; + case 30: break; + default: + // Fall back to the interpreter. + DISABLE; + } } } From 6d0a4fe681a25a5e651108e497a347f5fb7d453c Mon Sep 17 00:00:00 2001 From: ANR2ME Date: Fri, 16 Oct 2020 12:10:06 +0700 Subject: [PATCH 037/275] Increasing Adhocctl timeout to 5 seconds (with side effects of longer freezes when detecting disconnected players), to prevent failure to connect to AdhocServer on time due to some unknown reason where sometimes it tooks more than 2 seconds for Adhocctl Init to connect to AdhocServer on localhost (normally only 10 ms), and sometimes it tooks more than 1 seconds for built-in AdhocServer to be ready (normally only 1 ms) --- Core/HLE/sceNetAdhoc.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Core/HLE/sceNetAdhoc.cpp b/Core/HLE/sceNetAdhoc.cpp index d761da5763..292dd4b2e9 100644 --- a/Core/HLE/sceNetAdhoc.cpp +++ b/Core/HLE/sceNetAdhoc.cpp @@ -69,7 +69,7 @@ bool netAdhocGameModeEntered; bool netAdhocMatchingInited; int netAdhocMatchingStarted = 0; -int adhocDefaultTimeout = 3000000; //3000000 usec +int adhocDefaultTimeout = 5000000; //2000000 usec // For some unknown reason, sometimes it tooks more than 2 seconds for Adhocctl Init to connect to AdhocServer on localhost (normally only 10 ms), and sometimes it tooks more than 1 seconds for built-in AdhocServer to be ready (normally only 1 ms) int adhocDefaultDelay = 10000; //10000 int adhocExtraDelay = 20000; //20000 int adhocEventPollDelay = 100000; //100000; // Same timings with PSP_ADHOCCTL_RECV_TIMEOUT ? From b86f3ca0f4ccba6a433c73f52766358d7cee023e Mon Sep 17 00:00:00 2001 From: ANR2ME Date: Fri, 16 Oct 2020 13:06:38 +0700 Subject: [PATCH 038/275] Updated AdhocPollSocket timeout checking. --- Core/HLE/sceNetAdhoc.cpp | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/Core/HLE/sceNetAdhoc.cpp b/Core/HLE/sceNetAdhoc.cpp index 292dd4b2e9..9c14d54f8e 100644 --- a/Core/HLE/sceNetAdhoc.cpp +++ b/Core/HLE/sceNetAdhoc.cpp @@ -690,7 +690,8 @@ int DoBlockingAdhocPollSocket(int uid, AdhocSocketRequest& req, s64& result) { int ret = PollAdhocSocket(sds, req.id, 0, 0); if (ret <= 0) { u64 now = (u64)(time_now_d() * 1000000.0); - if (req.timeout == 0 || now - req.startTime <= req.timeout) { + // POSIX poll using negative timeout for indefinitely blocking, not sure about PSP's AdhocPollSocket tho since most of PSP's sceNet API using 0 for indefinitely blocking. + if (static_cast(req.timeout) <= 0 || now - req.startTime <= req.timeout) { return -1; } else if (ret < 0) @@ -1797,12 +1798,6 @@ int sceNetAdhocPollSocket(u32 socketStructAddr, int count, int timeout, int nonb if (nonblock) timeout = 0; - // Blocking Mode - else - // Does timeout = 0 means indefinite on PSP? - if (timeout <= 0) - timeout = adhocDefaultTimeout; // minSocketTimeoutUS; - if (count > (int)FD_SETSIZE) count = FD_SETSIZE; // return 0; //ERROR_NET_ADHOC_INVALID_ARG @@ -1813,7 +1808,7 @@ int sceNetAdhocPollSocket(u32 socketStructAddr, int count, int timeout, int nonb //int affectedsockets = sceNetInetPoll(isds, count, timeout); int affectedsockets = 0; if (nonblock) - affectedsockets = PollAdhocSocket(sds, count, timeout, nonblock); + affectedsockets = PollAdhocSocket(sds, count, 0, nonblock); else { // Simulate blocking behaviour with non-blocking socket // Borrowing some arguments to pass some parameters. The dummy WaitID(count+1) might not be unique thus have duplicate possibilities if there are multiple thread trying to poll the same numbers of socket at the same time From 0a04f47ea94ff39783548f7d234db538d6f45190 Mon Sep 17 00:00:00 2001 From: ANR2ME Date: Fri, 16 Oct 2020 13:13:29 +0700 Subject: [PATCH 039/275] Removing the workaround that was used to fix Gran Turismo in the past but no longer needed. Since zero mac address is an invalid mac we should return an error. --- Core/HLE/sceNetAdhoc.cpp | 74 +++++++++++----------------------------- 1 file changed, 20 insertions(+), 54 deletions(-) diff --git a/Core/HLE/sceNetAdhoc.cpp b/Core/HLE/sceNetAdhoc.cpp index 9c14d54f8e..9ca3473be1 100644 --- a/Core/HLE/sceNetAdhoc.cpp +++ b/Core/HLE/sceNetAdhoc.cpp @@ -5010,65 +5010,31 @@ int sceNetAdhocMatchingSendData(int matchingId, const char *mac, int dataLen, u3 void* data = NULL; if (Memory::IsValidAddress(dataAddr)) data = Memory::GetPointer(dataAddr); - // FIXME: If the target MAC is 00:00:00:00:00:00 (invalid mac) Should we default to P2P/Parent's MAC or return an Error? - if (isZeroMAC((const SceNetEtherAddr*)mac)) { - int sent = 0; - peerlock.lock(); - // Iterate Peer List for Matching Target - SceNetAdhocMatchingMemberInternal* peer = context->peerlist; - for (; peer != NULL; peer = peer->next) + // Find Target Peer + SceNetAdhocMatchingMemberInternal* peer = findPeer(context, (SceNetEtherAddr*)mac); + + // Found Peer + if (peer != NULL) + { + // Valid Peer Connection State + if (peer->state == PSP_ADHOC_MATCHING_PEER_PARENT || peer->state == PSP_ADHOC_MATCHING_PEER_CHILD || peer->state == PSP_ADHOC_MATCHING_PEER_P2P) { - // Valid Peer Connection State - if (peer->state == PSP_ADHOC_MATCHING_PEER_PARENT || peer->state == PSP_ADHOC_MATCHING_PEER_P2P) - { - // Skip Busy peers - if (peer->sending) - continue; + // Send in Progress + if (peer->sending) + return hleLogError(SCENET, ERROR_NET_ADHOC_MATCHING_DATA_BUSY, "data busy"); - // Mark Peer as Sending - peer->sending = 1; + // Mark Peer as Sending + peer->sending = 1; - // Send Data to Peer - sendBulkData(context, peer, dataLen, data); - sent++; - break; - } + // Send Data to Peer + sendBulkData(context, peer, dataLen, data); + + // Return Success + return 0; } - peerlock.unlock(); - if (sent == 0) - return hleLogError(SCENET, ERROR_NET_ADHOC_MATCHING_UNKNOWN_TARGET, "invalid target"); - - // Return Success - return 0; - } - else { - // Find Target Peer - SceNetAdhocMatchingMemberInternal* peer = findPeer(context, (SceNetEtherAddr*)mac); - - // Found Peer - if (peer != NULL) - { - // Valid Peer Connection State - if (peer->state == PSP_ADHOC_MATCHING_PEER_PARENT || peer->state == PSP_ADHOC_MATCHING_PEER_CHILD || peer->state == PSP_ADHOC_MATCHING_PEER_P2P) - { - // Send in Progress - if (peer->sending) - return hleLogError(SCENET, ERROR_NET_ADHOC_MATCHING_DATA_BUSY, "data busy"); - - // Mark Peer as Sending - peer->sending = 1; - - // Send Data to Peer - sendBulkData(context, peer, dataLen, data); - - // Return Success - return 0; - } - - // Not connected / accepted - return hleLogError(SCENET, ERROR_NET_ADHOC_MATCHING_NOT_ESTABLISHED, "not established"); - } + // Not connected / accepted + return hleLogError(SCENET, ERROR_NET_ADHOC_MATCHING_NOT_ESTABLISHED, "not established"); } // Peer not found From d5e8333c403d357e5a6385258c51c96840adb902 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Fri, 16 Oct 2020 13:06:00 +0200 Subject: [PATCH 040/275] oops, wrong filename --- gitlab-ci.yml => .gitlab-ci.yml | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename gitlab-ci.yml => .gitlab-ci.yml (100%) diff --git a/gitlab-ci.yml b/.gitlab-ci.yml similarity index 100% rename from gitlab-ci.yml rename to .gitlab-ci.yml From 90ba3a20a958645eee01a27c6a2dc3f23a113d9d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Fri, 16 Oct 2020 15:31:07 +0200 Subject: [PATCH 041/275] retro ci fix --- .gitlab-ci.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 4fe98fb040..230b4e50c3 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -2,6 +2,7 @@ .core-defs: variables: + GIT_SUBMODULE_STRATEGY: recursive JNI_PATH: libretro CORENAME: ppsspp From f526f5977bb3fa25443a71117a5654f0bcfb2fd0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Sat, 17 Oct 2020 12:50:59 +0200 Subject: [PATCH 042/275] OpenGL: Disable auto invalidation of framebuffers, it has somehow broken (Breaks DBZ: Tag Team) --- Common/GPU/OpenGL/GLQueueRunner.cpp | 3 ++- Common/GPU/OpenGL/GLQueueRunner.h | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/Common/GPU/OpenGL/GLQueueRunner.cpp b/Common/GPU/OpenGL/GLQueueRunner.cpp index 7776d7da4d..642db6a143 100644 --- a/Common/GPU/OpenGL/GLQueueRunner.cpp +++ b/Common/GPU/OpenGL/GLQueueRunner.cpp @@ -617,6 +617,7 @@ void GLQueueRunner::RunSteps(const std::vector &steps, bool skipGLCal }; int invalidateAllMask = GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT; + /* for (int j = 0; j < (int)steps.size() - 1; ++j) { GLRStep &primaryStep = *steps[j]; if (primaryStep.stepType == GLRStepType::RENDER) { @@ -648,7 +649,7 @@ void GLQueueRunner::RunSteps(const std::vector &steps, bool skipGLCal primaryStep.commands.push_back(data); } } - } + }*/ CHECK_GL_ERROR_IF_DEBUG(); size_t renderCount = 0; diff --git a/Common/GPU/OpenGL/GLQueueRunner.h b/Common/GPU/OpenGL/GLQueueRunner.h index 742f885768..79559c4d4d 100644 --- a/Common/GPU/OpenGL/GLQueueRunner.h +++ b/Common/GPU/OpenGL/GLQueueRunner.h @@ -136,7 +136,7 @@ struct GLRRenderData { int16_t scissorY; int16_t scissorW; int16_t scissorH; - } clear; + } clear; // also used for invalidate struct { int slot; GLRTexture *texture; From 2a6e4dfe7d3a799b71b95c3d513f0d55a1b1ec19 Mon Sep 17 00:00:00 2001 From: aliaspider Date: Sat, 17 Oct 2020 17:09:47 +0100 Subject: [PATCH 043/275] Libretro: set Memory Stick Size config value. fixes #13552. --- libretro/libretro.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/libretro/libretro.cpp b/libretro/libretro.cpp index 69984ee667..e88e534af2 100644 --- a/libretro/libretro.cpp +++ b/libretro/libretro.cpp @@ -357,6 +357,7 @@ void retro_init(void) g_Config.iAltSpeedVolume = -1; g_Config.bEnableSound = true; g_Config.iCwCheatRefreshRate = 60; + g_Config.iMemStickSizeGB = 16; g_Config.iFirmwareVersion = PSP_DEFAULT_FIRMWARE; g_Config.iPSPModel = PSP_MODEL_SLIM; From d3339d93b0a48574a4cf275fd5c0fde5759bb4db Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Sun, 18 Oct 2020 10:33:24 +0200 Subject: [PATCH 044/275] Set up depth buffers to be bound as shader resource views --- Common/GPU/D3D11/thin3d_d3d11.cpp | 31 +++++++++++++++++++++++++++---- 1 file changed, 27 insertions(+), 4 deletions(-) diff --git a/Common/GPU/D3D11/thin3d_d3d11.cpp b/Common/GPU/D3D11/thin3d_d3d11.cpp index 263fa088e8..ceb06a9341 100644 --- a/Common/GPU/D3D11/thin3d_d3d11.cpp +++ b/Common/GPU/D3D11/thin3d_d3d11.cpp @@ -1212,6 +1212,8 @@ public: colorRTView->Release(); if (colorSRView) colorSRView->Release(); + if (depthSRView) + depthSRView->Release(); if (depthStencilTex) depthStencilTex->Release(); if (depthStencilRTView) @@ -1223,6 +1225,7 @@ public: ID3D11Texture2D *colorTex = nullptr; ID3D11RenderTargetView *colorRTView = nullptr; ID3D11ShaderResourceView *colorSRView = nullptr; + ID3D11ShaderResourceView *depthSRView = nullptr; DXGI_FORMAT colorFormat = DXGI_FORMAT_UNKNOWN; ID3D11Texture2D *depthStencilTex = nullptr; @@ -1273,11 +1276,11 @@ Framebuffer *D3D11DrawContext::CreateFramebuffer(const FramebufferDesc &desc) { descDepth.Height = desc.height; descDepth.MipLevels = 1; descDepth.ArraySize = 1; - descDepth.Format = fb->depthStencilFormat; + descDepth.Format = DXGI_FORMAT_R24G8_TYPELESS; // so we can create an R24X8 view of it. descDepth.SampleDesc.Count = 1; descDepth.SampleDesc.Quality = 0; descDepth.Usage = D3D11_USAGE_DEFAULT; - descDepth.BindFlags = D3D11_BIND_DEPTH_STENCIL; + descDepth.BindFlags = D3D11_BIND_DEPTH_STENCIL | D3D11_BIND_SHADER_RESOURCE; descDepth.CPUAccessFlags = 0; descDepth.MiscFlags = 0; hr = device_->CreateTexture2D(&descDepth, nullptr, &fb->depthStencilTex); @@ -1286,7 +1289,7 @@ Framebuffer *D3D11DrawContext::CreateFramebuffer(const FramebufferDesc &desc) { return nullptr; } D3D11_DEPTH_STENCIL_VIEW_DESC descDSV{}; - descDSV.Format = descDepth.Format; + descDSV.Format = DXGI_FORMAT_D24_UNORM_S8_UINT; descDSV.ViewDimension = D3D11_DSV_DIMENSION_TEXTURE2D; descDSV.Texture2D.MipSlice = 0; hr = device_->CreateDepthStencilView(fb->depthStencilTex, &descDSV, &fb->depthStencilRTView); @@ -1294,6 +1297,17 @@ Framebuffer *D3D11DrawContext::CreateFramebuffer(const FramebufferDesc &desc) { delete fb; return nullptr; } + + D3D11_SHADER_RESOURCE_VIEW_DESC depthViewDesc{}; + depthViewDesc.Format = DXGI_FORMAT_R24_UNORM_X8_TYPELESS; + depthViewDesc.Texture2D.MostDetailedMip = 0; + depthViewDesc.Texture2D.MipLevels = 1; + depthViewDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2D; + hr = device_->CreateShaderResourceView(fb->depthStencilTex, &depthViewDesc, &fb->depthSRView); + if (FAILED(hr)) { + delete fb; + return nullptr; + } } return fb; @@ -1587,7 +1601,16 @@ void D3D11DrawContext::BindFramebufferAsRenderTarget(Framebuffer *fbo, const Ren // color must be 0, for now. void D3D11DrawContext::BindFramebufferAsTexture(Framebuffer *fbo, int binding, FBChannel channelBit, int attachment) { D3D11Framebuffer *fb = (D3D11Framebuffer *)fbo; - context_->PSSetShaderResources(binding, 1, &fb->colorSRView); + switch (channelBit) { + case FBChannel::FB_COLOR_BIT: + context_->PSSetShaderResources(binding, 1, &fb->colorSRView); + break; + case FBChannel::FB_DEPTH_BIT: + context_->PSSetShaderResources(binding, 1, &fb->depthSRView); + break; + default: + break; + } } uintptr_t D3D11DrawContext::GetFramebufferAPITexture(Framebuffer *fbo, int channelBit, int attachment) { From e80a52601570eef5dc324a8b30c9d4299f3fe90d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Sun, 18 Oct 2020 20:06:53 +0200 Subject: [PATCH 045/275] D3D11: Implement depth texturing. Fixes, for D3D11, #6411. --- GPU/Common/DepalettizeShaderCommon.cpp | 7 ++++++- GPU/D3D11/TextureCacheD3D11.cpp | 29 ++++++++++++++++++++++++-- GPU/D3D11/TextureCacheD3D11.h | 2 ++ 3 files changed, 35 insertions(+), 3 deletions(-) diff --git a/GPU/Common/DepalettizeShaderCommon.cpp b/GPU/Common/DepalettizeShaderCommon.cpp index 23b662c672..28449d69b9 100644 --- a/GPU/Common/DepalettizeShaderCommon.cpp +++ b/GPU/Common/DepalettizeShaderCommon.cpp @@ -38,6 +38,12 @@ void GenerateDepalShader300(char *buffer, GEBufferFormat pixelFormat, ShaderLang WRITE(p, "SamplerState texSamp : register(s0);\n"); WRITE(p, "Texture2D tex : register(t0);\n"); WRITE(p, "Texture2D pal : register(t3);\n"); + // Support for depth. + if (pixelFormat == GE_FORMAT_DEPTH16) { + WRITE(p, "cbuffer params : register(b0) {\n"); + WRITE(p, " float z_scale; float z_offset;\n"); + WRITE(p, "};\n"); + } } else if (language == GLSL_VULKAN) { WRITE(p, "#version 450\n"); WRITE(p, "#extension GL_ARB_separate_shader_objects : enable\n"); @@ -53,7 +59,6 @@ void GenerateDepalShader300(char *buffer, GEBufferFormat pixelFormat, ShaderLang WRITE(p, " float z_scale; float z_offset;\n"); WRITE(p, "};\n"); } - } else { if (gl_extensions.IsGLES) { WRITE(p, "#version 300 es\n"); diff --git a/GPU/D3D11/TextureCacheD3D11.cpp b/GPU/D3D11/TextureCacheD3D11.cpp index c04b353aa7..faf04a7db2 100644 --- a/GPU/D3D11/TextureCacheD3D11.cpp +++ b/GPU/D3D11/TextureCacheD3D11.cpp @@ -25,6 +25,7 @@ #include "Core/Reporting.h" #include "GPU/ge_constants.h" #include "GPU/GPUState.h" +#include "GPU/Common/GPUStateUtils.h" #include "GPU/D3D11/FragmentShaderGeneratorD3D11.h" #include "GPU/D3D11/TextureCacheD3D11.h" #include "GPU/D3D11/FramebufferManagerD3D11.h" @@ -39,6 +40,12 @@ #include "ext/xxhash.h" #include "Common/Math/math_util.h" +// For depth depal +struct DepthPushConstants { + float z_scale; + float z_offset; + float pad[2]; +}; #define INVALID_TEX (ID3D11ShaderResourceView *)(-1LL) @@ -113,6 +120,9 @@ TextureCacheD3D11::TextureCacheD3D11(Draw::DrawContext *draw) isBgraBackend_ = true; lastBoundTexture = INVALID_TEX; + D3D11_BUFFER_DESC desc{ sizeof(DepthPushConstants), D3D11_USAGE_DYNAMIC, D3D11_BIND_CONSTANT_BUFFER, D3D11_CPU_ACCESS_WRITE }; + _dbg_assert_(SUCCEEDED(device_->CreateBuffer(&desc, nullptr, &depalConstants_))); + HRESULT result = 0; SetupTextureDecoder(); @@ -121,6 +131,8 @@ TextureCacheD3D11::TextureCacheD3D11(Draw::DrawContext *draw) } TextureCacheD3D11::~TextureCacheD3D11() { + depalConstants_->Release(); + // pFramebufferVertexDecl->Release(); Clear(true); } @@ -355,8 +367,9 @@ void TextureCacheD3D11::ApplyTextureFramebuffer(VirtualFramebuffer *framebuffer, ID3D11PixelShader *pshader = nullptr; uint32_t clutMode = gstate.clutformat & 0xFFFFFF; bool need_depalettize = IsClutFormat(texFormat); + bool depth = channel == NOTIFY_FB_DEPTH; if (need_depalettize && !g_Config.bDisableSlowFramebufEffects) { - pshader = depalShaderCache_->GetDepalettizePixelShader(clutMode, framebuffer->drawnFormat); + pshader = depalShaderCache_->GetDepalettizePixelShader(clutMode, depth ? GE_FORMAT_DEPTH16 : framebuffer->drawnFormat); } if (pshader) { @@ -382,8 +395,20 @@ void TextureCacheD3D11::ApplyTextureFramebuffer(VirtualFramebuffer *framebuffer, draw_->BindFramebufferAsRenderTarget(depalFBO, { Draw::RPAction::DONT_CARE, Draw::RPAction::DONT_CARE, Draw::RPAction::DONT_CARE }, "ApplyTextureFramebuffer_DepalShader"); context_->PSSetShaderResources(3, 1, &clutTexture); context_->PSSetSamplers(3, 1, &stockD3D11.samplerPoint2DWrap); - framebufferManagerD3D11_->BindFramebufferAsColorTexture(0, framebuffer, BINDFBCOLOR_SKIP_COPY | BINDFBCOLOR_FORCE_SELF); + draw_->BindFramebufferAsTexture(framebuffer->fbo, 0, depth ? Draw::FB_DEPTH_BIT : Draw::FB_COLOR_BIT, 0); context_->PSSetSamplers(0, 1, &stockD3D11.samplerPoint2DWrap); + + if (depth) { + DepthScaleFactors scaleFactors = GetDepthScaleFactors(); + DepthPushConstants push; + push.z_scale = scaleFactors.scale; + push.z_offset = scaleFactors.offset; + D3D11_MAPPED_SUBRESOURCE map; + context_->Map(depalConstants_, 0, D3D11_MAP_WRITE_DISCARD, 0, &map); + memcpy(map.pData, &push, sizeof(push)); + context_->Unmap(depalConstants_, 0); + context_->PSSetConstantBuffers(0, 1, &depalConstants_); + } shaderApply.Shade(); context_->PSSetShaderResources(0, 1, &nullTexture); // Make D3D11 validation happy. Really of no consequence since we rebind anyway. diff --git a/GPU/D3D11/TextureCacheD3D11.h b/GPU/D3D11/TextureCacheD3D11.h index ceaf64b150..d29bf8fd16 100644 --- a/GPU/D3D11/TextureCacheD3D11.h +++ b/GPU/D3D11/TextureCacheD3D11.h @@ -91,6 +91,7 @@ private: SamplerCacheD3D11 samplerCache_; ID3D11ShaderResourceView *lastBoundTexture; + ID3D11Buffer *depalConstants_; int decimationCounter_; int texelsScaledThisFrame_; @@ -99,6 +100,7 @@ private: FramebufferManagerD3D11 *framebufferManagerD3D11_; DepalShaderCacheD3D11 *depalShaderCache_; ShaderManagerD3D11 *shaderManager_; + }; DXGI_FORMAT GetClutDestFormatD3D11(GEPaletteFormat format); From 92e1dce2db537a4f3260606fe1ce2f54d713602b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Sun, 18 Oct 2020 20:26:19 +0200 Subject: [PATCH 046/275] Error handling fixes --- Common/GPU/D3D11/thin3d_d3d11.cpp | 8 +++++--- GPU/D3D11/TextureCacheD3D11.cpp | 3 ++- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/Common/GPU/D3D11/thin3d_d3d11.cpp b/Common/GPU/D3D11/thin3d_d3d11.cpp index ceb06a9341..3827b79052 100644 --- a/Common/GPU/D3D11/thin3d_d3d11.cpp +++ b/Common/GPU/D3D11/thin3d_d3d11.cpp @@ -1305,8 +1305,8 @@ Framebuffer *D3D11DrawContext::CreateFramebuffer(const FramebufferDesc &desc) { depthViewDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2D; hr = device_->CreateShaderResourceView(fb->depthStencilTex, &depthViewDesc, &fb->depthSRView); if (FAILED(hr)) { - delete fb; - return nullptr; + WARN_LOG(G3D, "Failed to create SRV for depth buffer."); + fb->depthSRView = nullptr; } } @@ -1606,7 +1606,9 @@ void D3D11DrawContext::BindFramebufferAsTexture(Framebuffer *fbo, int binding, F context_->PSSetShaderResources(binding, 1, &fb->colorSRView); break; case FBChannel::FB_DEPTH_BIT: - context_->PSSetShaderResources(binding, 1, &fb->depthSRView); + if (fb->depthSRView) { + context_->PSSetShaderResources(binding, 1, &fb->depthSRView); + } break; default: break; diff --git a/GPU/D3D11/TextureCacheD3D11.cpp b/GPU/D3D11/TextureCacheD3D11.cpp index faf04a7db2..f7f7582ec3 100644 --- a/GPU/D3D11/TextureCacheD3D11.cpp +++ b/GPU/D3D11/TextureCacheD3D11.cpp @@ -121,7 +121,8 @@ TextureCacheD3D11::TextureCacheD3D11(Draw::DrawContext *draw) lastBoundTexture = INVALID_TEX; D3D11_BUFFER_DESC desc{ sizeof(DepthPushConstants), D3D11_USAGE_DYNAMIC, D3D11_BIND_CONSTANT_BUFFER, D3D11_CPU_ACCESS_WRITE }; - _dbg_assert_(SUCCEEDED(device_->CreateBuffer(&desc, nullptr, &depalConstants_))); + HRESULT hr = device_->CreateBuffer(&desc, nullptr, &depalConstants_); + _dbg_assert_(SUCCEEDED(hr)); HRESULT result = 0; From e4ad514e429f29217a6892b8a4fb44b857a2cb0c Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Sun, 18 Oct 2020 20:46:09 -0700 Subject: [PATCH 047/275] Qt: Remove Qt-specific screenshot path. --- Core/Screenshot.cpp | 16 ---------------- 1 file changed, 16 deletions(-) diff --git a/Core/Screenshot.cpp b/Core/Screenshot.cpp index 0e4066bdbf..bb8d109c10 100644 --- a/Core/Screenshot.cpp +++ b/Core/Screenshot.cpp @@ -18,12 +18,8 @@ #include "ppsspp_config.h" #include -#ifdef USING_QT_UI -#include -#else #include #include "ext/jpge/jpge.h" -#endif #include "Common/ColorConv.h" #include "Common/File/FileUtil.h" @@ -35,7 +31,6 @@ #include "GPU/GPUInterface.h" #include "GPU/GPUState.h" -#ifndef USING_QT_UI // This is used to make non-ASCII paths work for filename. // Technically only needed on Windows. class JPEGFileStream : public jpge::output_stream @@ -118,7 +113,6 @@ static bool WriteScreenshotToPNG(png_imagep image, const char *filename, int con return false; } } -#endif static bool ConvertPixelTo8888RGBA(GPUDebugBufferFormat fmt, u8 &r, u8 &g, u8 &b, u8 &a, const void *buffer, int offset, bool rev) { const u8 *buf8 = (const u8 *)buffer; @@ -348,10 +342,6 @@ bool TakeGameScreenshot(const char *filename, ScreenshotFormat fmt, ScreenshotTy } bool Save888RGBScreenshot(const char *filename, ScreenshotFormat fmt, const u8 *bufferRGB888, int w, int h) { -#ifdef USING_QT_UI - QImage image(bufferRGB888, w, h, QImage::Format_RGB888); - return image.save(filename, fmt == ScreenshotFormat::PNG ? "PNG" : "JPG"); -#else if (fmt == ScreenshotFormat::PNG) { png_image png; memset(&png, 0, sizeof(png)); @@ -374,14 +364,9 @@ bool Save888RGBScreenshot(const char *filename, ScreenshotFormat fmt, const u8 * } else { return false; } -#endif } bool Save8888RGBAScreenshot(const char *filename, const u8 *buffer, int w, int h) { -#ifdef USING_QT_UI - QImage image(buffer, w, h, QImage::Format_RGBA8888); - return image.save(filename, "PNG"); -#else png_image png; memset(&png, 0, sizeof(png)); png.version = PNG_IMAGE_VERSION; @@ -396,5 +381,4 @@ bool Save8888RGBAScreenshot(const char *filename, const u8 *buffer, int w, int h success = false; } return success; -#endif } From e3a201fbc5decca8ebe88f63240f32f54f7c046a Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Sun, 18 Oct 2020 20:06:55 -0700 Subject: [PATCH 048/275] Io: Account for free space on the host device. --- Core/HW/MemoryStick.cpp | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/Core/HW/MemoryStick.cpp b/Core/HW/MemoryStick.cpp index da0058261f..b944f1c4f6 100644 --- a/Core/HW/MemoryStick.cpp +++ b/Core/HW/MemoryStick.cpp @@ -15,6 +15,7 @@ // Official git repository and contact information can be found at // https://github.com/hrydgard/ppsspp and http://www.ppsspp.org/. +#include #include "Common/Serialize/Serializer.h" #include "Common/Serialize/SerializeFuncs.h" #include "Core/CoreTiming.h" @@ -71,18 +72,20 @@ u64 MemoryStick_SectorSize() { } u64 MemoryStick_FreeSpace() { + u64 realFreeSpace = pspFileSystem.FreeSpace("ms0:/"); + // Cap the memory stick size to avoid math errors when old games get sizes that were - // hard to imagine back then. + // not planned for back then (even though 2GB cards were available.) // We have a compat setting to make it even smaller for Harry Potter : Goblet of Fire, see #13266. const u64 memStickSize = PSP_CoreParameter().compat.flags().ReportSmallMemstick ? smallMemstickSize : (u64)g_Config.iMemStickSizeGB * 1024 * 1024 * 1024; - u64 usedSpace = pspFileSystem.getDirSize("ms0:/PSP/SAVEDATA/");// Assume the memory stick is only used to store savedata. - u64 freeSpace; - if (usedSpace >= memStickSize) - freeSpace = 0; - else - freeSpace = memStickSize - usedSpace; + // Assume the memory stick is only used to store savedata. + u64 usedSpace = pspFileSystem.getDirSize("ms0:/PSP/SAVEDATA/"); + u64 simulatedFreeSpace = 0; + if (usedSpace < memStickSize) { + simulatedFreeSpace = memStickSize - usedSpace; + } - return freeSpace; + return std::min(simulatedFreeSpace, realFreeSpace); } void MemoryStick_SetFatState(MemStickFatState state) { From d940f80b88b368bcab3b96e6ce1503c58fbb0f06 Mon Sep 17 00:00:00 2001 From: shenweip <1037567878@qq.com> Date: Mon, 19 Oct 2020 16:29:42 +0800 Subject: [PATCH 049/275] PsmfPlayer:The status will not be changed until the delay result is finished. --- Core/HLE/scePsmf.cpp | 31 ++++++++++++++++++++++++------- 1 file changed, 24 insertions(+), 7 deletions(-) diff --git a/Core/HLE/scePsmf.cpp b/Core/HLE/scePsmf.cpp index 0a601db8d4..9ae78eb018 100644 --- a/Core/HLE/scePsmf.cpp +++ b/Core/HLE/scePsmf.cpp @@ -29,6 +29,7 @@ #include "Core/HLE/sceMpeg.h" #include "Core/HLE/sceKernelMemory.h" #include "Core/HW/MediaEngine.h" +#include "Core/CoreTiming.h" #include "GPU/GPUInterface.h" #include "GPU/GPUState.h" @@ -59,6 +60,8 @@ static int videoPixelMode = GE_CMODE_32BIT_ABGR8888; static int videoLoopStatus = PSMF_PLAYER_CONFIG_NO_LOOP; static int psmfPlayerLibVersion = 0; +int eventPsmfPlayerStatusChange = -1; + enum PsmfPlayerError { ERROR_PSMF_NOT_INITIALIZED = 0x80615001, ERROR_PSMF_BAD_VERSION = 0x80615002, @@ -666,10 +669,20 @@ static PsmfPlayer *getPsmfPlayer(u32 psmfplayer) return 0; } +static void __PsmfPlayerStatusChange(u64 userdata, int cyclesLate) { + PsmfPlayerStatus status = PsmfPlayerStatus(userdata & 0xFFFFFFFF); + u32 psmfPlayer = userdata >> 32; + PsmfPlayer *player = getPsmfPlayer(psmfPlayer); + if (player) { + player->status = status; + } +} + void __PsmfInit() { videoPixelMode = GE_CMODE_32BIT_ABGR8888; videoLoopStatus = PSMF_PLAYER_CONFIG_NO_LOOP; psmfPlayerLibVersion = 0; + eventPsmfPlayerStatusChange = CoreTiming::RegisterEvent("PsmfPlayerStatusChange", &__PsmfPlayerStatusChange); } void __PsmfPlayerLoadModule(int devkitVersion) { @@ -1129,8 +1142,9 @@ static int scePsmfPlayerCreate(u32 psmfPlayer, u32 dataPtr) videoPixelMode = GE_CMODE_32BIT_ABGR8888; videoLoopStatus = PSMF_PLAYER_CONFIG_NO_LOOP; - psmfplayer->status = PSMF_PLAYER_STATUS_INIT; - return hleDelayResult(0, "player create", 20000); + int delayUs = 20000; + CoreTiming::ScheduleEvent(usToCycles(delayUs), eventPsmfPlayerStatusChange, (u64)psmfPlayer << 32 | PSMF_PLAYER_STATUS_INIT); + return hleDelayResult(0, "player create", delayUs); } static int scePsmfPlayerStop(u32 psmfPlayer) { @@ -1146,8 +1160,9 @@ static int scePsmfPlayerStop(u32 psmfPlayer) { psmfplayer->AbortFinish(); INFO_LOG(ME, "scePsmfPlayerStop(%08x)", psmfPlayer); - psmfplayer->status = PSMF_PLAYER_STATUS_STANDBY; - return hleDelayResult(0, "psmfplayer stop", 3000); + int delayUs = 3000; + CoreTiming::ScheduleEvent(usToCycles(delayUs), eventPsmfPlayerStatusChange, (u64)psmfPlayer << 32 | PSMF_PLAYER_STATUS_STANDBY); + return hleDelayResult(0, "psmfplayer stop", delayUs); } static int scePsmfPlayerBreak(u32 psmfPlayer) @@ -1275,8 +1290,7 @@ static int _PsmfPlayerSetPsmfOffset(u32 psmfPlayer, const char *filename, int of psmfplayer->totalDurationTimestamp = psmfplayer->mediaengine->getLastTimeStamp(); - psmfplayer->status = PSMF_PLAYER_STATUS_STANDBY; - + CoreTiming::ScheduleEvent(usToCycles(delayUs), eventPsmfPlayerStatusChange, (u64)psmfPlayer << 32 | PSMF_PLAYER_STATUS_STANDBY); return hleDelayResult(0, "psmfplayer set", delayUs); } @@ -1460,7 +1474,10 @@ static int scePsmfPlayerStart(u32 psmfPlayer, u32 psmfPlayerData, int initPts) // Does not alter current pts, it just catches up when Update()/etc. get there. int delayUs = psmfplayer->status == PSMF_PLAYER_STATUS_PLAYING ? 3000 : 0; - psmfplayer->status = PSMF_PLAYER_STATUS_PLAYING; + if(delayUs == 0) + psmfplayer->status = PSMF_PLAYER_STATUS_PLAYING; + else + CoreTiming::ScheduleEvent(usToCycles(delayUs), eventPsmfPlayerStatusChange, (u64)psmfPlayer << 32 | PSMF_PLAYER_STATUS_PLAYING); psmfplayer->warmUp = 0; psmfplayer->mediaengine->openContext(); From c79d20ca07370bcb16a5cba959958b66c9cc81c2 Mon Sep 17 00:00:00 2001 From: shenweip <1037567878@qq.com> Date: Mon, 19 Oct 2020 16:57:51 +0800 Subject: [PATCH 050/275] DoState. --- Core/HLE/scePsmf.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/Core/HLE/scePsmf.cpp b/Core/HLE/scePsmf.cpp index 9ae78eb018..fa829c28af 100644 --- a/Core/HLE/scePsmf.cpp +++ b/Core/HLE/scePsmf.cpp @@ -698,7 +698,7 @@ void __PsmfDoState(PointerWrap &p) { } void __PsmfPlayerDoState(PointerWrap &p) { - auto s = p.Section("scePsmfPlayer", 1, 2); + auto s = p.Section("scePsmfPlayer", 1, 3); if (!s) return; @@ -706,6 +706,10 @@ void __PsmfPlayerDoState(PointerWrap &p) { Do(p, videoPixelMode); Do(p, videoLoopStatus); if (s >= 2) { + if (s >= 3) { + Do(p, eventPsmfPlayerStatusChange); + CoreTiming::RestoreRegisterEvent(eventPsmfPlayerStatusChange, "PsmfPlayerStatusChangeEvent", &__PsmfPlayerStatusChange); + } Do(p, psmfPlayerLibVersion); } else { // Assume the latest, which is what we were emulating before. From 5a169077f1a830e72743205269b8ba724f15ea1c Mon Sep 17 00:00:00 2001 From: ANR2ME Date: Sat, 17 Oct 2020 19:01:14 +0700 Subject: [PATCH 051/275] Updated Adhocctl timings based on the timestamp on JPCSP + prx files --- Core/HLE/sceNetAdhoc.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Core/HLE/sceNetAdhoc.cpp b/Core/HLE/sceNetAdhoc.cpp index 9ca3473be1..f3c2a693cb 100644 --- a/Core/HLE/sceNetAdhoc.cpp +++ b/Core/HLE/sceNetAdhoc.cpp @@ -5187,8 +5187,10 @@ void __NetTriggerCallbacks() switch (flags) { case ADHOCCTL_EVENT_CONNECT: newState = ADHOCCTL_STATE_CONNECTED; - if (adhocConnectionType != ADHOC_JOIN) + if (adhocConnectionType == ADHOC_CREATE) delayus = adhocEventDelay; // May affects Dissidia 012 and GTA VCS + else if (adhocConnectionType == ADHOC_CONNECT && getActivePeerCount() == 0) + delayus = adhocEventDelay / 2; break; case ADHOCCTL_EVENT_SCAN: // notified only when scan completed? newState = ADHOCCTL_STATE_DISCONNECTED; From d3956111352b32e9c448c4d180666bf9f412ef69 Mon Sep 17 00:00:00 2001 From: ANR2ME Date: Sat, 17 Oct 2020 19:06:34 +0700 Subject: [PATCH 052/275] Fixed disconnection issue when multiplayer game started on Shaun White Snowboarding, and improved multiplayer performance on games that use GameMode. --- Core/HLE/proAdhoc.h | 3 ++- Core/HLE/sceNetAdhoc.cpp | 9 ++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/Core/HLE/proAdhoc.h b/Core/HLE/proAdhoc.h index 9993a28574..30eda1ebe4 100644 --- a/Core/HLE/proAdhoc.h +++ b/Core/HLE/proAdhoc.h @@ -110,7 +110,8 @@ inline bool isDisconnected(int errcode) { return (errcode == EPIPE || errcode == // Default GameMode definitions #define ADHOC_GAMEMODE_PORT 31000 -#define GAMEMODE_UPDATE_INTERVAL 10000 // 12000 usec on JPCSP, but 10000 works better on BattleZone (in order to get full speed 60 FPS) +#define GAMEMODE_UPDATE_INTERVAL 500 // 12000 usec on JPCSP, but lower value works better on BattleZone (in order to get full speed 60 FPS) +#define GAMEMODE_INIT_DELAY 10000 // psp strutcs and definitions #define ADHOCCTL_MODE_NONE -1 diff --git a/Core/HLE/sceNetAdhoc.cpp b/Core/HLE/sceNetAdhoc.cpp index f3c2a693cb..316c9649be 100644 --- a/Core/HLE/sceNetAdhoc.cpp +++ b/Core/HLE/sceNetAdhoc.cpp @@ -163,8 +163,8 @@ static void __GameModeNotify(u64 userdata, int cyclesLate) { } } - // Recv new Replica data - while (IsGameModeActive() && IsSocketReady(sock->data.pdp.id, true, false) > 0) { + // Recv new Replica data. We shouldn't do too much activity on a single event and just try again later after a short delay (1ms or lower, to prevent long sync with max players) + if (IsGameModeActive() && IsSocketReady(sock->data.pdp.id, true, false) > 0) { SceNetEtherAddr sendermac; s32_le senderport = ADHOC_GAMEMODE_PORT; s32_le bufsz = uid; // GAMEMODE_BUFFER_SIZE; @@ -333,7 +333,7 @@ int StartGameModeScheduler(int bufSize) { INFO_LOG(SCENET, "GameMode Scheduler (%d, %d) has started", gameModeSocket, bufSize); u64 param = ((u64)__KernelGetCurThread()) << 32 | bufSize; - CoreTiming::ScheduleEvent(usToCycles(GAMEMODE_UPDATE_INTERVAL), gameModeNotifyEvent, param); + CoreTiming::ScheduleEvent(usToCycles(GAMEMODE_INIT_DELAY), gameModeNotifyEvent, param); return 0; } @@ -5201,8 +5201,7 @@ void __NetTriggerCallbacks() case ADHOCCTL_EVENT_GAME: { newState = ADHOCCTL_STATE_GAMEMODE; - if (adhocConnectionType != ADHOC_JOIN) - delayus = adhocEventDelay; + delayus = adhocEventDelay; // Shows player list INFO_LOG(SCENET, "GameMode - All players have joined:"); int i = 0; From e5a02cebb452e27eb53f5bfd643fbae38de00ce1 Mon Sep 17 00:00:00 2001 From: ANR2ME Date: Sun, 18 Oct 2020 06:32:41 +0700 Subject: [PATCH 053/275] Added Connection Refused error code on PtpConnect --- Core/HLE/proAdhoc.h | 2 ++ Core/HLE/sceNetAdhoc.cpp | 35 +++++++++++++++++++++-------------- 2 files changed, 23 insertions(+), 14 deletions(-) diff --git a/Core/HLE/proAdhoc.h b/Core/HLE/proAdhoc.h index 30eda1ebe4..9edc7d89e2 100644 --- a/Core/HLE/proAdhoc.h +++ b/Core/HLE/proAdhoc.h @@ -59,6 +59,7 @@ #undef ESHUTDOWN #undef ECONNABORTED #undef ECONNRESET +#undef ECONNREFUSED #undef ENOTCONN #undef EAGAIN #undef EINPROGRESS @@ -69,6 +70,7 @@ #define ESHUTDOWN WSAESHUTDOWN #define ECONNABORTED WSAECONNABORTED #define ECONNRESET WSAECONNRESET +#define ECONNREFUSED WSAECONNREFUSED #define ENOTCONN WSAENOTCONN #define EAGAIN WSAEWOULDBLOCK #define EINPROGRESS WSAEWOULDBLOCK diff --git a/Core/HLE/sceNetAdhoc.cpp b/Core/HLE/sceNetAdhoc.cpp index 316c9649be..5cbd4e8020 100644 --- a/Core/HLE/sceNetAdhoc.cpp +++ b/Core/HLE/sceNetAdhoc.cpp @@ -3308,21 +3308,28 @@ static int sceNetAdhocPtpConnect(int id, int timeout, int flag) { return 0; } - // Connection in Progress - else if (connectresult == SOCKET_ERROR && connectInProgress(errorcode)) { - socket->data.ptp.state = ADHOC_PTP_STATE_SYN_SENT; - socket->attemptCount++; - socket->lastAttempt = CoreTiming::GetGlobalTimeUsScaled(); - // Blocking Mode - // Workaround: Forcing first attempt to be blocking to prevent issue related to lobby or high latency networks. (can be useful for GvG Next Plus, Dissidia 012, and Fate Unlimited Codes) - if (!flag || (g_Config.bForcedFirstConnect && socket->attemptCount == 1)) { - // Simulate blocking behaviour with non-blocking socket - u64 threadSocketId = ((u64)__KernelGetCurThread()) << 32 | ptpsocket.id; - return WaitBlockingAdhocSocket(threadSocketId, PTP_CONNECT, id, nullptr, nullptr, (flag) ? std::max((int)socket->retry_interval, timeout) : timeout, nullptr, nullptr, "ptp connect"); + // Error handling + else if (connectresult == SOCKET_ERROR) { + // Connection in Progress + if (connectInProgress(errorcode)) { + socket->data.ptp.state = ADHOC_PTP_STATE_SYN_SENT; + socket->attemptCount++; + socket->lastAttempt = CoreTiming::GetGlobalTimeUsScaled(); + // Blocking Mode + // Workaround: Forcing first attempt to be blocking to prevent issue related to lobby or high latency networks. (can be useful for GvG Next Plus, Dissidia 012, and Fate Unlimited Codes) + if (!flag || (g_Config.bForcedFirstConnect && socket->attemptCount == 1)) { + // Simulate blocking behaviour with non-blocking socket + u64 threadSocketId = ((u64)__KernelGetCurThread()) << 32 | ptpsocket.id; + return WaitBlockingAdhocSocket(threadSocketId, PTP_CONNECT, id, nullptr, nullptr, (flag) ? std::max((int)socket->retry_interval, timeout) : timeout, nullptr, nullptr, "ptp connect"); + } + // NonBlocking Mode + else { + return hleLogDebug(SCENET, ERROR_NET_ADHOC_WOULD_BLOCK, "would block"); + } } - // NonBlocking Mode - else { - return hleLogDebug(SCENET, ERROR_NET_ADHOC_WOULD_BLOCK, "would block"); + // No connection could be made because the target device actively refused it. + else if (errorcode == ECONNREFUSED) { + return hleLogError(SCENET, ERROR_NET_ADHOC_CONNECTION_REFUSED, "connection refused"); } } } From 152f9a7e2b927b63b57004fe018f3726e0a930de Mon Sep 17 00:00:00 2001 From: ANR2ME Date: Sun, 18 Oct 2020 07:00:55 +0700 Subject: [PATCH 054/275] Fix disconnection issue due to timeout on blocking PTP Socket --- Core/HLE/sceNetAdhoc.cpp | 33 ++++++++++++++++++--------------- 1 file changed, 18 insertions(+), 15 deletions(-) diff --git a/Core/HLE/sceNetAdhoc.cpp b/Core/HLE/sceNetAdhoc.cpp index 5cbd4e8020..5acb8eba6c 100644 --- a/Core/HLE/sceNetAdhoc.cpp +++ b/Core/HLE/sceNetAdhoc.cpp @@ -490,12 +490,13 @@ int DoBlockingPtpSend(int uid, AdhocSocketRequest& req, s64& result) { else result = ERROR_NET_ADHOC_TIMEOUT; } + else { + // Change Socket State. // FIXME: Does Alerted Socket should be closed too? + ptpsocket.state = ADHOC_PTP_STATE_CLOSED; - // Change Socket State. // FIXME: Does Alerted Socket should be closed too? - ptpsocket.state = ADHOC_PTP_STATE_CLOSED; - - // Disconnected - result = ERROR_NET_ADHOC_DISCONNECTED; + // Disconnected + result = ERROR_NET_ADHOC_DISCONNECTED; + } if (ret == SOCKET_ERROR) DEBUG_LOG(SCENET, "sceNetAdhocPtpSend[%i]: Socket Error (%i)", req.id, sockerr); @@ -675,12 +676,13 @@ int DoBlockingPtpFlush(int uid, AdhocSocketRequest& req, s64& result) { else result = ERROR_NET_ADHOC_TIMEOUT; } + else { + // Change Socket State. // FIXME: Does Alerted Socket should be closed too? + ptpsocket.state = ADHOC_PTP_STATE_CLOSED; - // Change Socket State. // FIXME: Does Alerted Socket should be closed too? - ptpsocket.state = ADHOC_PTP_STATE_CLOSED; - - // Disconnected - result = ERROR_NET_ADHOC_DISCONNECTED; + // Disconnected + result = ERROR_NET_ADHOC_DISCONNECTED; + } return 0; } @@ -729,10 +731,10 @@ static void __AdhocSocketNotify(u64 userdata, int cyclesLate) { if (waitID == 0 || error != 0) return; - // Socket not found?! Should never happened! but if it ever happen should we just exit here or need to wake the thread first? + // Socket not found?! Should never happened! But if it ever happened (ie. loaded from SaveState where adhocSocketRequests got cleared) return TIMEOUT and let the game try again. if (adhocSocketRequests.find(userdata) == adhocSocketRequests.end()) { WARN_LOG(SCENET, "sceNetAdhoc Socket WaitID(%i) on Thread(%i) not found!", uid, threadID); - //__KernelResumeThreadFromWait(threadID, ERROR_NET_ADHOC_TIMEOUT); + __KernelResumeThreadFromWait(threadID, ERROR_NET_ADHOC_TIMEOUT); return; } @@ -811,7 +813,7 @@ static void __AdhocSocketNotify(u64 userdata, int cyclesLate) { } __KernelResumeThreadFromWait(threadID, result); - DEBUG_LOG(SCENET, "Returning (WaitID: %d, error: %d) Result (%08x) of sceNetAdhoc - SocketID: %d", waitID, error, (int)result, req.id); + DEBUG_LOG(SCENET, "Returning (ThreadId: %d, WaitID: %d, error: %d) Result (%08x) of sceNetAdhoc[%d] - SocketID: %d", threadID, waitID, error, (int)result, req.type, req.id); // We are done with this socket adhocSocketRequests.erase(userdata); @@ -821,8 +823,9 @@ static void __AdhocSocketNotify(u64 userdata, int cyclesLate) { int WaitBlockingAdhocSocket(u64 threadSocketId, int type, int pspSocketId, void* buffer, s32_le* len, u32 timeoutUS, SceNetEtherAddr* remoteMAC, u16_le* remotePort, const char* reason) { int uid = (int)(threadSocketId & 0xFFFFFFFF); if (adhocSocketRequests.find(threadSocketId) != adhocSocketRequests.end()) { - WARN_LOG(SCENET, "sceNetAdhoc - WaitID[%d] already existed, Socket[%d] is busy!", uid, pspSocketId); - return ERROR_NET_ADHOC_BUSY; + WARN_LOG(SCENET, "sceNetAdhoc[%d] - ThreadID[%d] WaitID[%d] already existed, Socket[%d] is busy!", type, static_cast(threadSocketId >> 32), uid, pspSocketId); + // FIXME: Not sure if Adhoc Socket can return ADHOC_BUSY or not (assuming it's similar to EINPROGRESS for Adhoc Socket), or may be we should return TIMEOUT instead? + return ERROR_NET_ADHOC_BUSY; // ERROR_NET_ADHOC_TIMEOUT } if (adhocSocketNotifyEvent < 0) From f597382619fc4cd0aa62ffa4dd96cef979e62f8e Mon Sep 17 00:00:00 2001 From: ANR2ME Date: Mon, 19 Oct 2020 18:23:10 +0700 Subject: [PATCH 055/275] Show a warning just in case an abnormal situation occurred. --- Core/HLE/sceNet.cpp | 4 +++- Core/HLE/sceNetAdhoc.cpp | 12 +++++++++--- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/Core/HLE/sceNet.cpp b/Core/HLE/sceNet.cpp index 499fd1acbd..15e5179d5e 100644 --- a/Core/HLE/sceNet.cpp +++ b/Core/HLE/sceNet.cpp @@ -135,8 +135,10 @@ static void __ApctlState(u64 userdata, int cyclesLate) { u32 error = 0; SceUID waitID = __KernelGetWaitID(threadID, WAITTYPE_NET, error); - if (waitID == 0 || error != 0) + if (waitID == 0 || error != 0) { + WARN_LOG(SCENET, "sceNetApctl State WaitID(%i) on Thread(%i) already woken up? (error: %d)", uid, threadID, error); return; + } u32 waitVal = __KernelGetWaitValue(threadID, error); if (error == 0) { diff --git a/Core/HLE/sceNetAdhoc.cpp b/Core/HLE/sceNetAdhoc.cpp index 5acb8eba6c..67f2760d0e 100644 --- a/Core/HLE/sceNetAdhoc.cpp +++ b/Core/HLE/sceNetAdhoc.cpp @@ -197,8 +197,10 @@ static void __AdhocctlNotify(u64 userdata, int cyclesLate) { u32 error = 0; SceUID waitID = __KernelGetWaitID(threadID, WAITTYPE_NET, error); - if (waitID == 0 || error != 0) + if (waitID == 0 || error != 0) { + WARN_LOG(SCENET, "sceNetAdhocctl Socket WaitID(%i) on Thread(%i) already woken up? (error: %d)", uid, threadID, error); return; + } // Socket not found?! Should never happen! But if it ever happened (ie. loaded from SaveState where adhocctlRequests got cleared) return BUSY and let the game try again. if (adhocctlRequests.find(uid) == adhocctlRequests.end()) { @@ -276,8 +278,10 @@ static void __AdhocctlState(u64 userdata, int cyclesLate) { u32 error = 0; SceUID waitID = __KernelGetWaitID(threadID, WAITTYPE_NET, error); - if (waitID == 0 || error != 0) + if (waitID == 0 || error != 0) { + WARN_LOG(SCENET, "sceNetAdhocctl State WaitID(%i) on Thread(%i) already woken up? (error: %d)", uid, threadID, error); return; + } u32 waitVal = __KernelGetWaitValue(threadID, error); if (error == 0) { @@ -728,8 +732,10 @@ static void __AdhocSocketNotify(u64 userdata, int cyclesLate) { int delayUS = 500; SceUID waitID = __KernelGetWaitID(threadID, WAITTYPE_NET, error); - if (waitID == 0 || error != 0) + if (waitID == 0 || error != 0) { + WARN_LOG(SCENET, "sceNetAdhoc Socket WaitID(%i) on Thread(%i) already woken up? (error: %d)", uid, threadID, error); return; + } // Socket not found?! Should never happened! But if it ever happened (ie. loaded from SaveState where adhocSocketRequests got cleared) return TIMEOUT and let the game try again. if (adhocSocketRequests.find(userdata) == adhocSocketRequests.end()) { From e11e8a7fda229db95db73b3a0559828de5fc8a48 Mon Sep 17 00:00:00 2001 From: ANR2ME Date: Mon, 19 Oct 2020 18:55:47 +0700 Subject: [PATCH 056/275] Updated Loggings and return value on PtpSend, PtpFlush, and PtpRecv. --- Core/HLE/sceNetAdhoc.cpp | 74 +++++++++++++++++++--------------------- 1 file changed, 36 insertions(+), 38 deletions(-) diff --git a/Core/HLE/sceNetAdhoc.cpp b/Core/HLE/sceNetAdhoc.cpp index 67f2760d0e..0ec8c85ecf 100644 --- a/Core/HLE/sceNetAdhoc.cpp +++ b/Core/HLE/sceNetAdhoc.cpp @@ -661,12 +661,9 @@ int DoBlockingPtpFlush(int uid, AdhocSocketRequest& req, s64& result) { // Try Sending Empty Data int sockerr = FlushPtpSocket(uid); + result = 0; - if (sockerr >= 0) { - result = 0; - return 0; - } - else if (sockerr == EAGAIN || sockerr == EWOULDBLOCK) { + if (sockerr == EAGAIN || sockerr == EWOULDBLOCK) { u64 now = (u64)(time_now_d() * 1000000.0); if (sock->flags & ADHOC_F_ALERTFLUSH) { result = ERROR_NET_ADHOC_SOCKET_ALERTED; @@ -680,13 +677,17 @@ int DoBlockingPtpFlush(int uid, AdhocSocketRequest& req, s64& result) { else result = ERROR_NET_ADHOC_TIMEOUT; } - else { + else if (isDisconnected(sockerr)) { // Change Socket State. // FIXME: Does Alerted Socket should be closed too? ptpsocket.state = ADHOC_PTP_STATE_CLOSED; // Disconnected result = ERROR_NET_ADHOC_DISCONNECTED; } + + if (sockerr != 0) { + DEBUG_LOG(SCENET, "sceNetAdhocPtpFlush[%i]: Socket Error (%i)", req.id, sockerr); + } return 0; } @@ -3590,9 +3591,7 @@ static int sceNetAdhocPtpListen(const char *srcmac, int sport, int bufsize, int */ static int sceNetAdhocPtpSend(int id, u32 dataAddr, u32 dataSizeAddr, int timeout, int flag) { DEBUG_LOG(SCENET, "sceNetAdhocPtpSend(%d,%08x,%08x,%d,%d) at %08x", id, dataAddr, dataSizeAddr, timeout, flag, currentMIPS->pc); - if (!g_Config.bEnableWlan) { - return 0; - } + int * len = (int *)Memory::GetPointer(dataSizeAddr); const char * data = Memory::GetCharPointer(dataAddr); // Library is initialized @@ -3641,34 +3640,36 @@ static int sceNetAdhocPtpSend(int id, u32 dataAddr, u32 dataSizeAddr, int timeou else if (sent == SOCKET_ERROR && (error == EAGAIN || error == EWOULDBLOCK)) { // Non-Blocking if (flag) - return ERROR_NET_ADHOC_WOULD_BLOCK; + return hleLogSuccessVerboseI(SCENET, ERROR_NET_ADHOC_WOULD_BLOCK, "would block"); // Simulate blocking behaviour with non-blocking socket u64 threadSocketId = ((u64)__KernelGetCurThread()) << 32 | ptpsocket.id; return WaitBlockingAdhocSocket(threadSocketId, PTP_SEND, id, (void*)data, len, timeout, nullptr, nullptr, "ptp send"); } + + DEBUG_LOG(SCENET, "sceNetAdhocPtpSend[%i:%u -> %s:%u]: Result:%i (Error:%i)", id, ptpsocket.lport, mac2str(&ptpsocket.paddr).c_str(), ptpsocket.pport, sent, error); // Change Socket State ptpsocket.state = ADHOC_PTP_STATE_CLOSED; // Disconnected - return ERROR_NET_ADHOC_DISCONNECTED; + return hleLogError(SCENET, ERROR_NET_ADHOC_DISCONNECTED, "disconnected"); } // Invalid Arguments - return ERROR_NET_ADHOC_INVALID_ARG; + return hleLogError(SCENET, ERROR_NET_ADHOC_INVALID_ARG, "invalid arg"); } // Not connected - return ERROR_NET_ADHOC_NOT_CONNECTED; + return hleLogError(SCENET, ERROR_NET_ADHOC_NOT_CONNECTED, "not connected"); } // Invalid Socket - return ERROR_NET_ADHOC_INVALID_SOCKET_ID; + return hleLogError(SCENET, ERROR_NET_ADHOC_INVALID_SOCKET_ID, "invalid socket id"); } // Library is uninitialized - return ERROR_NET_ADHOC_NOT_INITIALIZED; + return hleLogError(SCENET, ERROR_NET_ADHOC_NOT_INITIALIZED, "not initialized"); } /** @@ -3682,9 +3683,7 @@ static int sceNetAdhocPtpSend(int id, u32 dataAddr, u32 dataSizeAddr, int timeou */ static int sceNetAdhocPtpRecv(int id, u32 dataAddr, u32 dataSizeAddr, int timeout, int flag) { DEBUG_LOG(SCENET, "sceNetAdhocPtpRecv(%d,%08x,%08x,%d,%d) at %08x", id, dataAddr, dataSizeAddr, timeout, flag, currentMIPS->pc); - if (!g_Config.bEnableWlan) { - return 0; - } + void * buf = (void *)Memory::GetPointer(dataAddr); int * len = (int *)Memory::GetPointer(dataSizeAddr); // Library is initialized @@ -3724,7 +3723,7 @@ static int sceNetAdhocPtpRecv(int id, u32 dataAddr, u32 dataSizeAddr, int timeou return WaitBlockingAdhocSocket(threadSocketId, PTP_RECV, id, buf, len, timeout, nullptr, nullptr, "ptp recv"); } - VERBOSE_LOG(SCENET, "Socket Error (%i) on sceNetAdhocPtpRecv[%i:%u] [size=%i]", error, id, ptpsocket.lport, *len); + return hleLogSuccessVerboseI(SCENET, ERROR_NET_ADHOC_WOULD_BLOCK, "would block"); } // Free Network Lock @@ -3749,36 +3748,28 @@ static int sceNetAdhocPtpRecv(int id, u32 dataAddr, u32 dataSizeAddr, int timeou return 0; } - // Non-Critical Error - else if (received == SOCKET_ERROR && (error == EAGAIN || error == EWOULDBLOCK || error == ETIMEDOUT)) { - // Blocking Situation - if (flag) return ERROR_NET_ADHOC_WOULD_BLOCK; - - // Timeout - return hleLogError(SCENET, ERROR_NET_ADHOC_TIMEOUT, "ptp recv timeout"); - } DEBUG_LOG(SCENET, "sceNetAdhocPtpRecv[%i:%u]: Result:%i (Error:%i)", id, ptpsocket.lport, received, error); // Change Socket State ptpsocket.state = ADHOC_PTP_STATE_CLOSED; // Disconnected - return hleLogError(SCENET, ERROR_NET_ADHOC_DISCONNECTED, "ptp recv disconnected"); + return hleLogError(SCENET, ERROR_NET_ADHOC_DISCONNECTED, "disconnected"); } - return ERROR_NET_ADHOC_NOT_CONNECTED; + return hleLogError(SCENET, ERROR_NET_ADHOC_NOT_CONNECTED, "not connected"); } // Invalid Socket - return ERROR_NET_ADHOC_INVALID_SOCKET_ID; + return hleLogError(SCENET, ERROR_NET_ADHOC_INVALID_SOCKET_ID, "invalid socket id"); } // Invalid Arguments - return ERROR_NET_ADHOC_INVALID_ARG; + return hleLogError(SCENET, ERROR_NET_ADHOC_INVALID_ARG, "invalid socket arg"); } // Library is uninitialized - return ERROR_NET_ADHOC_NOT_INITIALIZED; + return hleLogError(SCENET, ERROR_NET_ADHOC_NOT_INITIALIZED, "not initialized"); } int FlushPtpSocket(int socketId) { @@ -3809,9 +3800,6 @@ int FlushPtpSocket(int socketId) { */ static int sceNetAdhocPtpFlush(int id, int timeout, int nonblock) { DEBUG_LOG(SCENET,"sceNetAdhocPtpFlush(%d,%d,%d) at %08x", id, timeout, nonblock, currentMIPS->pc); - if (!g_Config.bEnableWlan) { - return 0; - } // Library initialized if (netAdhocInited) { @@ -3834,12 +3822,22 @@ static int sceNetAdhocPtpFlush(int id, int timeout, int nonblock) { if (error == EAGAIN || error == EWOULDBLOCK) { // Non-Blocking if (nonblock) - return ERROR_NET_ADHOC_WOULD_BLOCK; + return hleLogSuccessVerboseI(SCENET, ERROR_NET_ADHOC_WOULD_BLOCK, "would block"); // Simulate blocking behaviour with non-blocking socket u64 threadSocketId = ((u64)__KernelGetCurThread()) << 32 | ptpsocket.id; return WaitBlockingAdhocSocket(threadSocketId, PTP_FLUSH, id, nullptr, nullptr, timeout, nullptr, nullptr, "ptp flush"); } + else if (isDisconnected(error)) { + // Change Socket State + ptpsocket.state = ADHOC_PTP_STATE_CLOSED; + + // Disconnected + return hleLogError(SCENET, ERROR_NET_ADHOC_DISCONNECTED, "disconnected"); + } + + if (error != 0) + DEBUG_LOG(SCENET, "sceNetAdhocPtpFlush[%i:%u -> %s:%u]: Error:%i", id, ptpsocket.lport, mac2str(&ptpsocket.paddr).c_str(), ptpsocket.pport, error); } // Dummy Result, Always success? @@ -3847,10 +3845,10 @@ static int sceNetAdhocPtpFlush(int id, int timeout, int nonblock) { } // Invalid Socket - return ERROR_NET_ADHOC_INVALID_SOCKET_ID; + return hleLogError(SCENET, ERROR_NET_ADHOC_INVALID_SOCKET_ID, "invalid socket id"); } // Library uninitialized - return ERROR_NET_ADHOC_NOT_INITIALIZED; + return hleLogError(SCENET, ERROR_NET_ADHOC_NOT_INITIALIZED, "not initialized"); } /** From 30b9f46aa5cd1c44ee8b741d5f77a96bc41e4402 Mon Sep 17 00:00:00 2001 From: ANR2ME Date: Mon, 19 Oct 2020 22:46:25 +0700 Subject: [PATCH 057/275] Don't need to connect if AdhocServer IP is the same with this instance localhost IP and having AdhocServer disabled --- Core/HLE/proAdhoc.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Core/HLE/proAdhoc.cpp b/Core/HLE/proAdhoc.cpp index 2a45abdc45..c408aa8b52 100644 --- a/Core/HLE/proAdhoc.cpp +++ b/Core/HLE/proAdhoc.cpp @@ -2083,6 +2083,10 @@ int initNetwork(SceNetAdhocctlAdhocId *adhoc_id){ if (g_adhocServerIP.in.sin_addr.s_addr == INADDR_NONE) return -1; + // Don't need to connect if AdhocServer IP is the same with this instance localhost IP and having AdhocServer disabled + if (g_adhocServerIP.in.sin_addr.s_addr == g_localhostIP.in.sin_addr.s_addr && !g_Config.bEnableAdhocServer) + return -1; + // Connect to Adhoc Server int errorcode = 0; int cnt = 0; From d4c02ccc1c5ad2368c2dfc3cc05f239f8f894025 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Mon, 19 Oct 2020 22:50:16 +0200 Subject: [PATCH 058/275] Address feedback about recent changes Thanks unknown. --- Common/GPU/Vulkan/VulkanQueueRunner.h | 1 - Core/HLE/sceDisplay.cpp | 2 +- Core/MIPS/MIPSInt.cpp | 1 + 3 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Common/GPU/Vulkan/VulkanQueueRunner.h b/Common/GPU/Vulkan/VulkanQueueRunner.h index 5a514a170c..912a6044d9 100644 --- a/Common/GPU/Vulkan/VulkanQueueRunner.h +++ b/Common/GPU/Vulkan/VulkanQueueRunner.h @@ -44,7 +44,6 @@ struct VkRenderData { union { struct { VkPipeline pipeline; - PipelineFlags flags; } pipeline; struct { VkPipelineLayout pipelineLayout; diff --git a/Core/HLE/sceDisplay.cpp b/Core/HLE/sceDisplay.cpp index a160fad05f..efc2e3c9cc 100644 --- a/Core/HLE/sceDisplay.cpp +++ b/Core/HLE/sceDisplay.cpp @@ -894,7 +894,7 @@ void hleLagSync(u64 userdata, int cyclesLate) { // Don't lag too long ever, if they leave it paused. double now = before; while (now < goal && goal < now + 0.01) { - // Tight loop on win32. TODO: Probably not a good idea... + // Tight loop on win32 - intentionally, as timing is otherwise not precise enough. #ifndef _WIN32 const double left = goal - now; usleep((long)(left * 1000000.0)); diff --git a/Core/MIPS/MIPSInt.cpp b/Core/MIPS/MIPSInt.cpp index 0065774933..be67cc915d 100644 --- a/Core/MIPS/MIPSInt.cpp +++ b/Core/MIPS/MIPSInt.cpp @@ -158,6 +158,7 @@ namespace MIPSInt void Int_Break(MIPSOpcode op) { + Reporting::ReportMessage("BREAK instruction hit"); Core_Break(); PC += 4; } From c8b2dd123f46ad739db91c48766cfa9ff660fba8 Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Mon, 19 Oct 2020 19:06:32 -0700 Subject: [PATCH 059/275] Psmf: Handle older states for delayed state change. --- Core/HLE/scePsmf.cpp | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/Core/HLE/scePsmf.cpp b/Core/HLE/scePsmf.cpp index fa829c28af..7309ac59ec 100644 --- a/Core/HLE/scePsmf.cpp +++ b/Core/HLE/scePsmf.cpp @@ -709,6 +709,8 @@ void __PsmfPlayerDoState(PointerWrap &p) { if (s >= 3) { Do(p, eventPsmfPlayerStatusChange); CoreTiming::RestoreRegisterEvent(eventPsmfPlayerStatusChange, "PsmfPlayerStatusChangeEvent", &__PsmfPlayerStatusChange); + } else { + eventPsmfPlayerStatusChange = -1; } Do(p, psmfPlayerLibVersion); } else { @@ -726,6 +728,13 @@ void __PsmfShutdown() { psmfPlayerMap.clear(); } +static void DelayPsmfStateChange(u32 psmfPlayer, u32 newState, s64 delayUs) { + if (eventPsmfPlayerStatusChange == -1) { + eventPsmfPlayerStatusChange = CoreTiming::RegisterEvent("PsmfPlayerStatusChange", &__PsmfPlayerStatusChange); + } + CoreTiming::ScheduleEvent(usToCycles(delayUs), eventPsmfPlayerStatusChange, (u64)psmfPlayer << 32 | newState); +} + static u32 scePsmfSetPsmf(u32 psmfStruct, u32 psmfData) { if (!Memory::IsValidAddress(psmfData) || !Memory::IsValidAddress(psmfData)) { // Crashes on a PSP. @@ -1147,7 +1156,7 @@ static int scePsmfPlayerCreate(u32 psmfPlayer, u32 dataPtr) videoLoopStatus = PSMF_PLAYER_CONFIG_NO_LOOP; int delayUs = 20000; - CoreTiming::ScheduleEvent(usToCycles(delayUs), eventPsmfPlayerStatusChange, (u64)psmfPlayer << 32 | PSMF_PLAYER_STATUS_INIT); + DelayPsmfStateChange(psmfPlayer, PSMF_PLAYER_STATUS_INIT, delayUs); return hleDelayResult(0, "player create", delayUs); } @@ -1165,7 +1174,7 @@ static int scePsmfPlayerStop(u32 psmfPlayer) { INFO_LOG(ME, "scePsmfPlayerStop(%08x)", psmfPlayer); int delayUs = 3000; - CoreTiming::ScheduleEvent(usToCycles(delayUs), eventPsmfPlayerStatusChange, (u64)psmfPlayer << 32 | PSMF_PLAYER_STATUS_STANDBY); + DelayPsmfStateChange(psmfPlayer, PSMF_PLAYER_STATUS_STANDBY, delayUs); return hleDelayResult(0, "psmfplayer stop", delayUs); } @@ -1293,8 +1302,7 @@ static int _PsmfPlayerSetPsmfOffset(u32 psmfPlayer, const char *filename, int of _PsmfPlayerFillRingbuffer(psmfplayer); psmfplayer->totalDurationTimestamp = psmfplayer->mediaengine->getLastTimeStamp(); - - CoreTiming::ScheduleEvent(usToCycles(delayUs), eventPsmfPlayerStatusChange, (u64)psmfPlayer << 32 | PSMF_PLAYER_STATUS_STANDBY); + DelayPsmfStateChange(psmfPlayer, PSMF_PLAYER_STATUS_STANDBY, delayUs); return hleDelayResult(0, "psmfplayer set", delayUs); } @@ -1478,10 +1486,10 @@ static int scePsmfPlayerStart(u32 psmfPlayer, u32 psmfPlayerData, int initPts) // Does not alter current pts, it just catches up when Update()/etc. get there. int delayUs = psmfplayer->status == PSMF_PLAYER_STATUS_PLAYING ? 3000 : 0; - if(delayUs == 0) + if (delayUs == 0) psmfplayer->status = PSMF_PLAYER_STATUS_PLAYING; else - CoreTiming::ScheduleEvent(usToCycles(delayUs), eventPsmfPlayerStatusChange, (u64)psmfPlayer << 32 | PSMF_PLAYER_STATUS_PLAYING); + DelayPsmfStateChange(psmfPlayer, PSMF_PLAYER_STATUS_PLAYING, delayUs); psmfplayer->warmUp = 0; psmfplayer->mediaengine->openContext(); From 9686520dbdab041709b7754870cbb523598fa46a Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Mon, 19 Oct 2020 19:24:08 -0700 Subject: [PATCH 060/275] Psmf: Cleanup logging. --- Core/HLE/scePsmf.cpp | 136 ++++++++++++------------------------------- 1 file changed, 38 insertions(+), 98 deletions(-) diff --git a/Core/HLE/scePsmf.cpp b/Core/HLE/scePsmf.cpp index 7309ac59ec..5805cfe04d 100644 --- a/Core/HLE/scePsmf.cpp +++ b/Core/HLE/scePsmf.cpp @@ -705,17 +705,17 @@ void __PsmfPlayerDoState(PointerWrap &p) { Do(p, psmfPlayerMap); Do(p, videoPixelMode); Do(p, videoLoopStatus); - if (s >= 2) { - if (s >= 3) { - Do(p, eventPsmfPlayerStatusChange); - CoreTiming::RestoreRegisterEvent(eventPsmfPlayerStatusChange, "PsmfPlayerStatusChangeEvent", &__PsmfPlayerStatusChange); - } else { - eventPsmfPlayerStatusChange = -1; - } - Do(p, psmfPlayerLibVersion); + if (s < 3) { + eventPsmfPlayerStatusChange = -1; } else { + Do(p, eventPsmfPlayerStatusChange); + CoreTiming::RestoreRegisterEvent(eventPsmfPlayerStatusChange, "PsmfPlayerStatusChangeEvent", &__PsmfPlayerStatusChange); + } + if (s < 2) { // Assume the latest, which is what we were emulating before. psmfPlayerLibVersion = 0x06060010; + } else { + Do(p, psmfPlayerLibVersion); } } @@ -1108,38 +1108,32 @@ static u32 scePsmfGetEPidWithTimestamp(u32 psmfStruct, u32 ts) return epid; } -static int scePsmfPlayerCreate(u32 psmfPlayer, u32 dataPtr) -{ +static int scePsmfPlayerCreate(u32 psmfPlayer, u32 dataPtr) { auto player = PSPPointer::Create(psmfPlayer); const auto data = PSPPointer::Create(dataPtr); if (!player.IsValid() || !data.IsValid()) { - ERROR_LOG_REPORT(ME, "scePsmfPlayerCreate(%08x, %08x): bad pointers", psmfPlayer, dataPtr); // Crashes on a PSP. - return SCE_KERNEL_ERROR_ILLEGAL_ADDRESS; + return hleReportError(ME, SCE_KERNEL_ERROR_ILLEGAL_ADDRESS, "bad pointers"); } if (!data->buffer.IsValid()) { - ERROR_LOG_REPORT(ME, "scePsmfPlayerCreate(%08x, %08x): invalid buffer address %08x", psmfPlayer, dataPtr, data->buffer.ptr); // Also crashes on a PSP. *player = 0; - return SCE_KERNEL_ERROR_ILLEGAL_ADDRESS; + return hleReportError(ME, SCE_KERNEL_ERROR_ILLEGAL_ADDRESS, "invalid buffer address %08x", data->buffer.ptr); } if (data->bufferSize < 0x00285800) { - ERROR_LOG_REPORT(ME, "scePsmfPlayerCreate(%08x, %08x): buffer too small %08x", psmfPlayer, dataPtr, data->bufferSize); *player = 0; - return ERROR_PSMFPLAYER_BUFFER_SIZE; + return hleReportError(ME, ERROR_PSMFPLAYER_BUFFER_SIZE, "buffer too small %08x", data->bufferSize); } if (data->threadPriority < 0x10 || data->threadPriority >= 0x6E) { - ERROR_LOG_REPORT(ME, "scePsmfPlayerCreate(%08x, %08x): bad thread priority %02x", psmfPlayer, dataPtr, data->threadPriority); *player = 0; - return ERROR_PSMFPLAYER_INVALID_PARAM; + return hleReportError(ME, ERROR_PSMFPLAYER_INVALID_PARAM, "bad thread priority %02x", data->threadPriority); } if (!psmfPlayerMap.empty()) { *player = 0; return hleReportError(ME, ERROR_MPEG_ALREADY_INIT, "already have an active player"); } - INFO_LOG(ME, "scePsmfPlayerCreate(%08x, %08x)", psmfPlayer, dataPtr); PsmfPlayer *psmfplayer = getPsmfPlayer(psmfPlayer); if (!psmfplayer) { psmfplayer = new PsmfPlayer(data); @@ -1157,39 +1151,33 @@ static int scePsmfPlayerCreate(u32 psmfPlayer, u32 dataPtr) int delayUs = 20000; DelayPsmfStateChange(psmfPlayer, PSMF_PLAYER_STATUS_INIT, delayUs); - return hleDelayResult(0, "player create", delayUs); + return hleLogSuccessInfoI(ME, hleDelayResult(0, "player create", delayUs)); } static int scePsmfPlayerStop(u32 psmfPlayer) { PsmfPlayer *psmfplayer = getPsmfPlayer(psmfPlayer); if (!psmfplayer) { - ERROR_LOG(ME, "scePsmfPlayerStop(%08x): invalid psmf player", psmfPlayer); - return ERROR_PSMFPLAYER_INVALID_STATUS; + return hleLogError(ME, ERROR_PSMFPLAYER_INVALID_STATUS, "invalid psmf player"); } if (psmfplayer->status < PSMF_PLAYER_STATUS_PLAYING) { - ERROR_LOG(ME, "scePsmfPlayerStop(%08x): not yet playing", psmfPlayer); - return ERROR_PSMFPLAYER_INVALID_STATUS; + return hleLogError(ME, ERROR_PSMFPLAYER_INVALID_STATUS, "not yet playing"); } psmfplayer->AbortFinish(); - INFO_LOG(ME, "scePsmfPlayerStop(%08x)", psmfPlayer); int delayUs = 3000; DelayPsmfStateChange(psmfPlayer, PSMF_PLAYER_STATUS_STANDBY, delayUs); - return hleDelayResult(0, "psmfplayer stop", delayUs); + return hleLogSuccessInfoI(ME, hleDelayResult(0, "psmfplayer stop", delayUs)); } -static int scePsmfPlayerBreak(u32 psmfPlayer) -{ - WARN_LOG(ME, "scePsmfPlayerBreak(%08x)", psmfPlayer); +static int scePsmfPlayerBreak(u32 psmfPlayer) { PsmfPlayer *psmfplayer = getPsmfPlayer(psmfPlayer); if (!psmfplayer) { - ERROR_LOG(ME, "scePsmfPlayerBreak(%08x): invalid psmf player", psmfPlayer); - return ERROR_PSMFPLAYER_INVALID_STATUS; + return hleLogError(ME, ERROR_PSMFPLAYER_INVALID_STATUS, "invalid psmf player", psmfPlayer); } psmfplayer->AbortFinish(); - return 0; + return hleLogWarning(ME, 0); } static int _PsmfPlayerFillRingbuffer(PsmfPlayer *psmfplayer) { @@ -1228,17 +1216,17 @@ static int _PsmfPlayerFillRingbuffer(PsmfPlayer *psmfplayer) { static int _PsmfPlayerSetPsmfOffset(u32 psmfPlayer, const char *filename, int offset, bool docallback) { PsmfPlayer *psmfplayer = getPsmfPlayer(psmfPlayer); if (!psmfplayer || psmfplayer->status != PSMF_PLAYER_STATUS_INIT) { - return ERROR_PSMFPLAYER_INVALID_STATUS; + return hleReportError(ME, ERROR_PSMFPLAYER_INVALID_STATUS, "invalid psmf player or status"); } if (!filename) { - return ERROR_PSMFPLAYER_INVALID_PARAM; + return hleLogError(ME, ERROR_PSMFPLAYER_INVALID_PARAM, "invalid filename"); } int delayUs = 1100; psmfplayer->filehandle = pspFileSystem.OpenFile(filename, (FileAccess) FILEACCESS_READ); if (psmfplayer->filehandle < 0) { - return hleDelayResult(SCE_KERNEL_ERROR_ILLEGAL_ARGUMENT, "psmfplayer set", delayUs); + return hleLogError(ME, hleDelayResult(SCE_KERNEL_ERROR_ILLEGAL_ARGUMENT, "psmfplayer set", delayUs), "invalid file data or does not exist"); } if (offset != 0) @@ -1251,15 +1239,14 @@ static int _PsmfPlayerSetPsmfOffset(u32 psmfPlayer, const char *filename, int of const u32 magic = *(u32_le *)buf; if (magic != PSMF_MAGIC) { // TODO: Let's keep trying as we were before. - ERROR_LOG_REPORT(ME, "scePsmfPlayerSetPsmf*: incorrect PSMF magic, bad data"); - //return SCE_KERNEL_ERROR_ILLEGAL_ARGUMENT; + ERROR_LOG_REPORT(ME, "scePsmfPlayerSetPsmf*: incorrect PSMF magic (%08x), bad data", magic); + //return hleReportError(ME, SCE_KERNEL_ERROR_ILLEGAL_ARGUMENT, "incorrect PSMF magic (%08x), bad data", magic); } // TODO: Merge better with Psmf. u16 numStreams = *(u16_be *)(buf + 0x80); if (numStreams > 128) { - ERROR_LOG_REPORT(ME, "scePsmfPlayerSetPsmf*: too many streams in PSMF video, bogus data"); - return hleDelayResult(SCE_KERNEL_ERROR_ILLEGAL_ARGUMENT, "psmfplayer set", delayUs); + return hleReportError(ME, hleDelayResult(SCE_KERNEL_ERROR_ILLEGAL_ARGUMENT, "psmfplayer set", delayUs), "too many streams in PSMF video, bogus data"); } psmfplayer->totalVideoStreams = 0; @@ -1303,80 +1290,33 @@ static int _PsmfPlayerSetPsmfOffset(u32 psmfPlayer, const char *filename, int of psmfplayer->totalDurationTimestamp = psmfplayer->mediaengine->getLastTimeStamp(); DelayPsmfStateChange(psmfPlayer, PSMF_PLAYER_STATUS_STANDBY, delayUs); - return hleDelayResult(0, "psmfplayer set", delayUs); + return hleLogSuccessInfoI(ME, hleDelayResult(0, "psmfplayer set", delayUs)); } -static int scePsmfPlayerSetPsmf(u32 psmfPlayer, const char *filename) -{ - u32 result = _PsmfPlayerSetPsmfOffset(psmfPlayer, filename, 0, false); - if (result == ERROR_PSMFPLAYER_INVALID_STATUS) { - ERROR_LOG_REPORT(ME, "scePsmfPlayerSetPsmf(%08x, %s): invalid psmf player or status", psmfPlayer, filename); - } else if (result == ERROR_PSMFPLAYER_INVALID_PARAM) { - ERROR_LOG(ME, "scePsmfPlayerSetPsmf(%08x, %s): invalid filename", psmfPlayer, filename); - } else if (result == SCE_KERNEL_ERROR_ILLEGAL_ARGUMENT) { - ERROR_LOG(ME, "scePsmfPlayerSetPsmf(%08x, %s): invalid file data or does not exist", psmfPlayer, filename); - } else { - INFO_LOG(ME, "scePsmfPlayerSetPsmf(%08x, %s)", psmfPlayer, filename); - } - return result; +static int scePsmfPlayerSetPsmf(u32 psmfPlayer, const char *filename) { + return _PsmfPlayerSetPsmfOffset(psmfPlayer, filename, 0, false); } -static int scePsmfPlayerSetPsmfCB(u32 psmfPlayer, const char *filename) -{ +static int scePsmfPlayerSetPsmfCB(u32 psmfPlayer, const char *filename) { // TODO: hleCheckCurrentCallbacks? - u32 result = _PsmfPlayerSetPsmfOffset(psmfPlayer, filename, 0, true); - if (result == ERROR_PSMFPLAYER_INVALID_STATUS) { - ERROR_LOG_REPORT(ME, "scePsmfPlayerSetPsmfCB(%08x, %s): invalid psmf player or status", psmfPlayer, filename); - } else if (result == ERROR_PSMFPLAYER_INVALID_PARAM) { - ERROR_LOG(ME, "scePsmfPlayerSetPsmfCB(%08x, %s): invalid filename", psmfPlayer, filename); - } else if (result == SCE_KERNEL_ERROR_ILLEGAL_ARGUMENT) { - ERROR_LOG(ME, "scePsmfPlayerSetPsmfCB(%08x, %s): invalid file data or does not exist", psmfPlayer, filename); - } else { - INFO_LOG(ME, "scePsmfPlayerSetPsmfCB(%08x, %s)", psmfPlayer, filename); - } - return result; + return _PsmfPlayerSetPsmfOffset(psmfPlayer, filename, 0, true); } -static int scePsmfPlayerSetPsmfOffset(u32 psmfPlayer, const char *filename, int offset) -{ - u32 result = _PsmfPlayerSetPsmfOffset(psmfPlayer, filename, offset, false); - if (result == ERROR_PSMFPLAYER_INVALID_STATUS) { - ERROR_LOG_REPORT(ME, "scePsmfPlayerSetPsmfOffset(%08x, %s): invalid psmf player or status", psmfPlayer, filename); - } else if (result == ERROR_PSMFPLAYER_INVALID_PARAM) { - ERROR_LOG(ME, "scePsmfPlayerSetPsmfOffset(%08x, %s): invalid filename", psmfPlayer, filename); - } else if (result == SCE_KERNEL_ERROR_ILLEGAL_ARGUMENT) { - ERROR_LOG(ME, "scePsmfPlayerSetPsmfOffset(%08x, %s): invalid file data or does not exist", psmfPlayer, filename); - } else { - INFO_LOG(ME, "scePsmfPlayerSetPsmfOffset(%08x, %s)", psmfPlayer, filename); - } - return result; +static int scePsmfPlayerSetPsmfOffset(u32 psmfPlayer, const char *filename, int offset) { + return _PsmfPlayerSetPsmfOffset(psmfPlayer, filename, offset, false); } -static int scePsmfPlayerSetPsmfOffsetCB(u32 psmfPlayer, const char *filename, int offset) -{ +static int scePsmfPlayerSetPsmfOffsetCB(u32 psmfPlayer, const char *filename, int offset) { // TODO: hleCheckCurrentCallbacks? - u32 result = _PsmfPlayerSetPsmfOffset(psmfPlayer, filename, offset, true); - if (result == ERROR_PSMFPLAYER_INVALID_STATUS) { - ERROR_LOG_REPORT(ME, "scePsmfPlayerSetPsmfOffsetCB(%08x, %s): invalid psmf player or status", psmfPlayer, filename); - } else if (result == ERROR_PSMFPLAYER_INVALID_PARAM) { - ERROR_LOG(ME, "scePsmfPlayerSetPsmfOffsetCB(%08x, %s): invalid filename", psmfPlayer, filename); - } else if (result == SCE_KERNEL_ERROR_ILLEGAL_ARGUMENT) { - ERROR_LOG(ME, "scePsmfPlayerSetPsmfOffsetCB(%08x, %s): invalid file data or does not exist", psmfPlayer, filename); - } else { - INFO_LOG(ME, "scePsmfPlayerSetPsmfOffsetCB(%08x, %s)", psmfPlayer, filename); - } - return result; + return _PsmfPlayerSetPsmfOffset(psmfPlayer, filename, offset, true); } -static int scePsmfPlayerGetAudioOutSize(u32 psmfPlayer) -{ +static int scePsmfPlayerGetAudioOutSize(u32 psmfPlayer) { PsmfPlayer *psmfplayer = getPsmfPlayer(psmfPlayer); if (!psmfplayer) { - ERROR_LOG(ME, "scePsmfPlayerGetAudioOutSize(%08x): invalid psmf player", psmfPlayer); - return ERROR_PSMFPLAYER_INVALID_STATUS; + return hleLogError(ME, ERROR_PSMFPLAYER_INVALID_STATUS, "invalid psmf player"); } - WARN_LOG(ME, "%i = scePsmfPlayerGetAudioOutSize(%08x)", audioSamplesBytes, psmfPlayer); - return audioSamplesBytes; + return hleLogWarning(ME, audioSamplesBytes); } static bool __PsmfPlayerContinueSeek(PsmfPlayer *psmfplayer, int tries = 50) { From 53ba351797048d7e1215d9dfde1e9240af37c258 Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Mon, 19 Oct 2020 21:43:00 -0700 Subject: [PATCH 061/275] Headless: Define consistent memstick size. --- headless/Headless.cpp | 3 +++ libretro/libretro.cpp | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/headless/Headless.cpp b/headless/Headless.cpp index 299cdd2cf0..fb80436d73 100644 --- a/headless/Headless.cpp +++ b/headless/Headless.cpp @@ -392,9 +392,12 @@ int main(int argc, const char* argv[]) g_Config.iSplineBezierQuality = 2; g_Config.bHighQualityDepth = true; g_Config.bMemStickInserted = true; + g_Config.iMemStickSizeGB = 16; g_Config.bFragmentTestCache = true; g_Config.bEnableWlan = true; g_Config.sMACAddress = "12:34:56:78:9A:BC"; + g_Config.iFirmwareVersion = PSP_DEFAULT_FIRMWARE; + g_Config.iPSPModel = PSP_MODEL_SLIM; #ifdef _WIN32 g_Config.internalDataDirectory = ""; diff --git a/libretro/libretro.cpp b/libretro/libretro.cpp index e88e534af2..c7386f9aa2 100644 --- a/libretro/libretro.cpp +++ b/libretro/libretro.cpp @@ -352,7 +352,7 @@ void retro_init(void) g_Config.bEnableLogging = true; g_Config.iUnthrottleMode = (int)UnthrottleMode::CONTINUOUS; - g_Config.bMemStickInserted = PSP_MEMORYSTICK_STATE_INSERTED; + g_Config.bMemStickInserted = true; g_Config.iGlobalVolume = VOLUME_MAX - 1; g_Config.iAltSpeedVolume = -1; g_Config.bEnableSound = true; From c95e695a3867319ef9cc4b09786a92621f1c91d5 Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Mon, 19 Oct 2020 22:42:49 -0700 Subject: [PATCH 062/275] Io: Track initial free space for compat flag. This seems to be necessary for Assassin's Creed. See #12761. --- Core/Compatibility.cpp | 1 + Core/Compatibility.h | 1 + Core/HLE/sceIo.cpp | 3 +-- Core/HW/MemoryStick.cpp | 17 +++++++++++++++-- assets/compat.ini | 6 ++++++ 5 files changed, 24 insertions(+), 4 deletions(-) diff --git a/Core/Compatibility.cpp b/Core/Compatibility.cpp index c607c0a076..a965f1b062 100644 --- a/Core/Compatibility.cpp +++ b/Core/Compatibility.cpp @@ -72,6 +72,7 @@ void Compatibility::CheckSettings(IniFile &iniFile, const std::string &gameID) { CheckSetting(iniFile, gameID, "ForceSoftwareRenderer", &flags_.ForceSoftwareRenderer); CheckSetting(iniFile, gameID, "DarkStalkersPresentHack", &flags_.DarkStalkersPresentHack); CheckSetting(iniFile, gameID, "ReportSmallMemstick", &flags_.ReportSmallMemstick); + CheckSetting(iniFile, gameID, "MemstickFixedFree", &flags_.MemstickFixedFree); CheckSetting(iniFile, gameID, "DateLimited", &flags_.DateLimited); } diff --git a/Core/Compatibility.h b/Core/Compatibility.h index 626d4f816c..1d5dfa6372 100644 --- a/Core/Compatibility.h +++ b/Core/Compatibility.h @@ -70,6 +70,7 @@ struct CompatFlags { bool ForceSoftwareRenderer; bool DarkStalkersPresentHack; bool ReportSmallMemstick; + bool MemstickFixedFree; bool DateLimited; }; diff --git a/Core/HLE/sceIo.cpp b/Core/HLE/sceIo.cpp index a12ba039f9..43e0700b98 100644 --- a/Core/HLE/sceIo.cpp +++ b/Core/HLE/sceIo.cpp @@ -621,8 +621,6 @@ static void __IoVblank() { } void __IoInit() { - MemoryStick_Init(); - asyncNotifyEvent = CoreTiming::RegisterEvent("IoAsyncNotify", __IoAsyncNotify); syncNotifyEvent = CoreTiming::RegisterEvent("IoSyncNotify", __IoSyncNotify); @@ -663,6 +661,7 @@ void __IoInit() { __KernelRegisterWaitTypeFuncs(WAITTYPE_ASYNCIO, __IoAsyncBeginCallback, __IoAsyncEndCallback); + MemoryStick_Init(); lastMemStickState = MemoryStick_State(); lastMemStickFatState = MemoryStick_FatState(); __DisplayListenVblank(__IoVblank); diff --git a/Core/HW/MemoryStick.cpp b/Core/HW/MemoryStick.cpp index b944f1c4f6..444334a3e3 100644 --- a/Core/HW/MemoryStick.cpp +++ b/Core/HW/MemoryStick.cpp @@ -29,12 +29,13 @@ static MemStickState memStickState; static MemStickFatState memStickFatState; static bool memStickNeedsAssign = false; static u64 memStickInsertedAt = 0; +static uint64_t memstickInitialFree = 0; const u64 normalMemstickSize = 9ULL * 1024 * 1024 * 1024; const u64 smallMemstickSize = 1ULL * 1024 * 1024 * 1024; void MemoryStick_DoState(PointerWrap &p) { - auto s = p.Section("MemoryStick", 1, 4); + auto s = p.Section("MemoryStick", 1, 5); if (!s) return; @@ -47,6 +48,9 @@ void MemoryStick_DoState(PointerWrap &p) { u64 memStickSize = normalMemstickSize; Do(p, memStickSize); } + if (s >= 5) { + Do(p, memstickInitialFree); + } if (s >= 3) { Do(p, memStickNeedsAssign); @@ -72,18 +76,26 @@ u64 MemoryStick_SectorSize() { } u64 MemoryStick_FreeSpace() { + const CompatFlags &flags = PSP_CoreParameter().compat.flags(); u64 realFreeSpace = pspFileSystem.FreeSpace("ms0:/"); // Cap the memory stick size to avoid math errors when old games get sizes that were // not planned for back then (even though 2GB cards were available.) // We have a compat setting to make it even smaller for Harry Potter : Goblet of Fire, see #13266. - const u64 memStickSize = PSP_CoreParameter().compat.flags().ReportSmallMemstick ? smallMemstickSize : (u64)g_Config.iMemStickSizeGB * 1024 * 1024 * 1024; + const u64 memStickSize = flags.ReportSmallMemstick ? smallMemstickSize : (u64)g_Config.iMemStickSizeGB * 1024 * 1024 * 1024; // Assume the memory stick is only used to store savedata. u64 usedSpace = pspFileSystem.getDirSize("ms0:/PSP/SAVEDATA/"); u64 simulatedFreeSpace = 0; if (usedSpace < memStickSize) { simulatedFreeSpace = memStickSize - usedSpace; } + if (flags.MemstickFixedFree) { + // Assassin's Creed: Bloodlines fails to save if free space changes incorrectly during game. + realFreeSpace = 0; + if (usedSpace <= memstickInitialFree) { + realFreeSpace = memstickInitialFree - usedSpace; + } + } return std::min(simulatedFreeSpace, realFreeSpace); } @@ -119,4 +131,5 @@ void MemoryStick_Init() { } memStickNeedsAssign = false; + memstickInitialFree = pspFileSystem.FreeSpace("ms0:/") + pspFileSystem.getDirSize("ms0:/PSP/SAVEDATA/"); } diff --git a/assets/compat.ini b/assets/compat.ini index 13b91e253a..1bda7f4fac 100644 --- a/assets/compat.ini +++ b/assets/compat.ini @@ -784,6 +784,12 @@ ULJM05225 = true CPCS01043 = true ULUS10062 = true +[MemstickFixedFree] +ULJM05571 = true +ULES01367 = true +NPEH00029 = true +ULUS10455 = true + [DateLimited] # Car Jack Streets - issue #12698 NPUZ00043 = true From 1d8a47dd8f8f4f66ca5894aa12c5ea5dd4dbdfb1 Mon Sep 17 00:00:00 2001 From: Aaron Kling Date: Sat, 17 Oct 2020 00:17:29 -0500 Subject: [PATCH 063/275] Update gitlab ci for libretro to use cmake --- .gitlab-ci.yml | 49 +++++++++++++++++++++---------------------------- 1 file changed, 21 insertions(+), 28 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 230b4e50c3..f1af20d665 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1,19 +1,22 @@ # libretro CI +variables: + GIT_SUBMODULE_STRATEGY: normal .core-defs: variables: - GIT_SUBMODULE_STRATEGY: recursive - JNI_PATH: libretro CORENAME: ppsspp + CORE_ARGS: -DLIBRETRO=ON + +.linux-defs: + variables: + EXTRA_PATH: lib include: - template: Jobs/Code-Quality.gitlab-ci.yml - project: 'libretro-infrastructure/ci-templates' - file: '/linux-x64.yml' + file: '/android-cmake.yml' - project: 'libretro-infrastructure/ci-templates' - file: '/windows-x64-mingw.yml' - - project: 'libretro-infrastructure/ci-templates' - file: '/android-jni.yml' + file: '/linux-cmake.yml' stages: - build-prepare @@ -22,39 +25,29 @@ stages: - test #Desktop -libretro-build-linux-x64: +libretro-build-linux-x86_64: extends: + - .libretro-linux-cmake-x86_64 - .core-defs - - .libretro-linux-x64-make-default - variables: - MAKEFILE_PATH: libretro - MAKEFILE: Makefile + - .linux-defs -libretro-build-windows-x64: - extends: - - .core-defs - - .libretro-windows-x64-mingw-make-default - variables: - MAKEFILE_PATH: libretro - MAKEFILE: Makefile - # Android -android-armeabi-v7a: +libretro-build-android-armeabi-v7a: extends: + - .libretro-android-cmake-armeabi-v7a - .core-defs - - .libretro-android-jni-armeabi-v7a -android-arm64-v8a: +libretro-build-android-arm64-v8a: extends: + - .libretro-android-cmake-arm64-v8a - .core-defs - - .libretro-android-jni-arm64-v8a -android-x86_64: +libretro-build-android-x86_64: extends: + - .libretro-android-cmake-x86_64 - .core-defs - - .libretro-android-jni-x86_64 - -android-x86: + +libretro-build-android-x86: extends: + - .libretro-android-cmake-x86 - .core-defs - - .libretro-android-jni-x86 From 391d2ea73d6aa44fce076d2193c7f72e8b7073b3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Sat, 17 Oct 2020 07:57:32 +0200 Subject: [PATCH 064/275] Rename vk uniforms to match the other backends --- GPU/Common/ShaderUniforms.h | 72 ++++++++++---------- GPU/GLES/VertexShaderGeneratorGLES.cpp | 8 +-- GPU/Vulkan/FragmentShaderGeneratorVulkan.cpp | 42 ++++++------ GPU/Vulkan/VertexShaderGeneratorVulkan.cpp | 72 ++++++++++---------- 4 files changed, 94 insertions(+), 100 deletions(-) diff --git a/GPU/Common/ShaderUniforms.h b/GPU/Common/ShaderUniforms.h index 5915297818..81a4b10aae 100644 --- a/GPU/Common/ShaderUniforms.h +++ b/GPU/Common/ShaderUniforms.h @@ -46,30 +46,30 @@ struct UB_VS_FS_Base { }; static const char *ub_baseStr = -R"( mat4 proj_mtx; - mat4 proj_through_mtx; - mat3x4 view_mtx; - mat3x4 world_mtx; - mat3x4 tex_mtx; - vec4 uvscaleoffset; - vec4 depthRange; - vec2 fogcoef; - float stencilReplace; - vec4 matambientalpha; - uint spline_counts; - uint depal_mask_shift_off_fmt; - int pad2; - int pad3; - vec4 cullRangeMin; - vec4 cullRangeMax; - vec3 fogcolor; - vec3 texenv; - ivec4 alphacolorref; - ivec4 alphacolormask; - vec3 blendFixA; - vec3 blendFixB; - vec4 texclamp; - vec2 texclampoff; +R"( mat4 u_proj; + mat4 u_proj_through; + mat3x4 u_view; + mat3x4 u_world; + mat3x4 u_tex; + vec4 u_uvscaleoffset; + vec4 u_depthRange; + vec2 u_fogcoef; + float u_stencilReplaceValue; + vec4 u_matambientalpha; + uint u_spline_counts; + uint u_depal_mask_shift_off_fmt; + int u_pad2; + int u_pad3; + vec4 u_cullRangeMin; + vec4 u_cullRangeMax; + vec3 u_fogcolor; + vec3 u_texenv; + ivec4 u_alphacolorref; + ivec4 u_alphacolormask; + vec3 u_blendFixA; + vec3 u_blendFixB; + vec4 u_texclamp; + vec2 u_texclampoff; )"; // HLSL code is shared so these names are changed to match those in DX9. @@ -118,16 +118,16 @@ struct UB_VS_Lights { static const char *ub_vs_lightsStr = R"( vec4 u_ambient; - vec3 matdiffuse; - vec4 matspecular; - vec3 matemissive; - vec3 pos[4]; - vec3 dir[4]; - vec3 att[4]; - vec2 angle_spotCoef[4]; - vec3 ambient[4]; - vec3 diffuse[4]; - vec3 specular[4]; + vec3 u_matdiffuse; + vec4 u_matspecular; + vec3 u_matemissive; + vec3 u_lightpos[4]; + vec3 u_lightdir[4]; + vec3 u_lightatt[4]; + vec2 u_lightangle_spotCoef[4]; + vec3 u_lightambient[4]; + vec3 u_lightdiffuse[4]; + vec3 u_lightspecular[4]; )"; // HLSL code is shared so these names are changed to match those in DX9. @@ -167,13 +167,13 @@ R"( float4 u_ambient; )"; // With some cleverness, we could get away with uploading just half this when only the four or five first -// bones are being used. This is 512b, 256b would be great. +// bones are being used. This is 384b. struct UB_VS_Bones { float bones[8][12]; }; static const char *ub_vs_bonesStr = -R"( mat3x4 m[8]; +R"( mat3x4 u_bone[8]; )"; // HLSL code is shared so these names are changed to match those in DX9. diff --git a/GPU/GLES/VertexShaderGeneratorGLES.cpp b/GPU/GLES/VertexShaderGeneratorGLES.cpp index 8f775d2647..e31354118f 100644 --- a/GPU/GLES/VertexShaderGeneratorGLES.cpp +++ b/GPU/GLES/VertexShaderGeneratorGLES.cpp @@ -33,6 +33,7 @@ #include "GPU/GLES/ShaderManagerGLES.h" #include "GPU/Common/ShaderId.h" #include "GPU/Common/VertexDecoderCommon.h" +#include "GPU/Common/VertexShaderGeneratorCommon.h" #undef WRITE @@ -62,13 +63,6 @@ static const char * const boneWeightInDecl[9] = { "in mediump vec4 w1, w2;\n", }; -enum DoLightComputation { - LIGHT_OFF, - LIGHT_SHADE, - LIGHT_FULL, -}; - - // Depth range and viewport // // After the multiplication with the projection matrix, we have a 4D vector in clip space. diff --git a/GPU/Vulkan/FragmentShaderGeneratorVulkan.cpp b/GPU/Vulkan/FragmentShaderGeneratorVulkan.cpp index 3d2ad0d1d5..78e2592be3 100644 --- a/GPU/Vulkan/FragmentShaderGeneratorVulkan.cpp +++ b/GPU/Vulkan/FragmentShaderGeneratorVulkan.cpp @@ -93,7 +93,7 @@ bool GenerateVulkanGLSLFragmentShader(const FShaderID &id, char *buffer, uint32_ WRITE(p, "layout (depth_unchanged) out float gl_FragDepth;\n"); } - WRITE(p, "layout (std140, set = 0, binding = 3) uniform baseUBO {\n%s} base;\n", ub_baseStr); + WRITE(p, "layout (std140, set = 0, binding = 3) uniform baseUBO {\n%s};\n", ub_baseStr); if (doTexture) { WRITE(p, "layout (binding = 0) uniform sampler2D tex;\n"); } @@ -167,18 +167,18 @@ bool GenerateVulkanGLSLFragmentShader(const FShaderID &id, char *buffer, uint32_ std::string modulo = (gl_extensions.bugs & BUG_PVR_SHADER_PRECISION_BAD) ? "mymod" : "mod"; if (id.Bit(FS_BIT_CLAMP_S)) { - ucoord = "clamp(" + ucoord + ", base.texclamp.z, base.texclamp.x - base.texclamp.z)"; + ucoord = "clamp(" + ucoord + ", u_texclamp.z, u_texclamp.x - u_texclamp.z)"; } else { - ucoord = modulo + "(" + ucoord + ", base.texclamp.x)"; + ucoord = modulo + "(" + ucoord + ", u_texclamp.x)"; } if (id.Bit(FS_BIT_CLAMP_T)) { - vcoord = "clamp(" + vcoord + ", base.texclamp.w, base.texclamp.y - base.texclamp.w)"; + vcoord = "clamp(" + vcoord + ", u_texclamp.w, u_texclamp.y - u_texclamp.w)"; } else { - vcoord = modulo + "(" + vcoord + ", base.texclamp.y)"; + vcoord = modulo + "(" + vcoord + ", u_texclamp.y)"; } if (textureAtOffset) { - ucoord = "(" + ucoord + " + base.texclampoff.x)"; - vcoord = "(" + vcoord + " + base.texclampoff.y)"; + ucoord = "(" + ucoord + " + u_texclampoff.x)"; + vcoord = "(" + vcoord + " + u_texclampoff.y)"; } WRITE(p, " vec2 fixedcoord = vec2(%s, %s);\n", ucoord.c_str(), vcoord.c_str()); @@ -203,7 +203,7 @@ bool GenerateVulkanGLSLFragmentShader(const FShaderID &id, char *buffer, uint32_ } WRITE(p, " vec2 tsize = textureSize(tex, 0);\n"); WRITE(p, " vec2 fraction;\n"); - WRITE(p, " bool bilinear = (base.depal_mask_shift_off_fmt >> 31) != 0;\n"); + WRITE(p, " bool bilinear = (u_depal_mask_shift_off_fmt >> 31) != 0;\n"); WRITE(p, " if (bilinear) {\n"); WRITE(p, " uv_round = uv * tsize - vec2(0.5, 0.5);\n"); WRITE(p, " fraction = fract(uv_round);\n"); @@ -215,10 +215,10 @@ bool GenerateVulkanGLSLFragmentShader(const FShaderID &id, char *buffer, uint32_ WRITE(p, " vec4 t1 = textureOffset(tex, uv_round, ivec2(1, 0));\n"); WRITE(p, " vec4 t2 = textureOffset(tex, uv_round, ivec2(0, 1));\n"); WRITE(p, " vec4 t3 = textureOffset(tex, uv_round, ivec2(1, 1));\n"); - WRITE(p, " uint depalMask = (base.depal_mask_shift_off_fmt & 0xFF);\n"); - WRITE(p, " uint depalShift = (base.depal_mask_shift_off_fmt >> 8) & 0xFF;\n"); - WRITE(p, " uint depalOffset = ((base.depal_mask_shift_off_fmt >> 16) & 0xFF) << 4;\n"); - WRITE(p, " uint depalFmt = (base.depal_mask_shift_off_fmt >> 24) & 0x3;\n"); + WRITE(p, " uint depalMask = (u_depal_mask_shift_off_fmt & 0xFF);\n"); + WRITE(p, " uint depalShift = (u_depal_mask_shift_off_fmt >> 8) & 0xFF;\n"); + WRITE(p, " uint depalOffset = ((u_depal_mask_shift_off_fmt >> 16) & 0xFF) << 4;\n"); + WRITE(p, " uint depalFmt = (u_depal_mask_shift_off_fmt >> 24) & 0x3;\n"); WRITE(p, " uvec4 col; uint index0; uint index1; uint index2; uint index3;\n"); WRITE(p, " switch (depalFmt) {\n"); // We might want to include fmt in the shader ID if this is a performance issue. WRITE(p, " case 0:\n"); // 565 @@ -299,7 +299,7 @@ bool GenerateVulkanGLSLFragmentShader(const FShaderID &id, char *buffer, uint32_ break; case GE_TEXFUNC_BLEND: - WRITE(p, " vec4 v = vec4(mix(p.rgb, base.texenv.rgb, t.rgb), p.a * t.a)%s;\n", secondary); + WRITE(p, " vec4 v = vec4(mix(p.rgb, u_texenv.rgb, t.rgb), p.a * t.a)%s;\n", secondary); break; case GE_TEXFUNC_REPLACE: @@ -326,7 +326,7 @@ bool GenerateVulkanGLSLFragmentShader(const FShaderID &id, char *buffer, uint32_ break; case GE_TEXFUNC_BLEND: - WRITE(p, " vec4 v = vec4(mix(p.rgb, base.texenv.rgb, t.rgb), p.a)%s;\n", secondary); + WRITE(p, " vec4 v = vec4(mix(p.rgb, u_texenv.rgb, t.rgb), p.a)%s;\n", secondary); break; case GE_TEXFUNC_REPLACE: @@ -374,7 +374,7 @@ bool GenerateVulkanGLSLFragmentShader(const FShaderID &id, char *buffer, uint32_ } else { const char *alphaTestFuncs[] = { "#", "#", " != ", " == ", " >= ", " > ", " <= ", " < " }; if (alphaTestFuncs[alphaTestFunc][0] != '#') { - WRITE(p, " if ((roundAndScaleTo255i(v.a) & base.alphacolormask.a) %s base.alphacolorref.a) %s\n", alphaTestFuncs[alphaTestFunc], discardStatement); + WRITE(p, " if ((roundAndScaleTo255i(v.a) & u_alphacolormask.a) %s u_alphacolorref.a) %s\n", alphaTestFuncs[alphaTestFunc], discardStatement); } else { // This means NEVER. See above. WRITE(p, " %s\n", discardStatement); @@ -384,7 +384,7 @@ bool GenerateVulkanGLSLFragmentShader(const FShaderID &id, char *buffer, uint32_ if (enableFog) { WRITE(p, " float fogCoef = clamp(v_fogdepth, 0.0, 1.0);\n"); - WRITE(p, " v = mix(vec4(base.fogcolor, v.a), v, fogCoef);\n"); + WRITE(p, " v = mix(vec4(u_fogcolor, v.a), v, fogCoef);\n"); // WRITE(p, " v.x = v_depth;\n"); } @@ -407,7 +407,7 @@ bool GenerateVulkanGLSLFragmentShader(const FShaderID &id, char *buffer, uint32_ const char *colorTestFuncs[] = { "#", "#", " != ", " == " }; if (colorTestFuncs[colorTestFunc][0] != '#') { WRITE(p, " ivec3 v_scaled = roundAndScaleTo255iv(v.rgb);\n"); - WRITE(p, " if ((v_scaled & base.alphacolormask.rgb) %s (base.alphacolorref.rgb & base.alphacolormask.rgb)) %s\n", colorTestFuncs[colorTestFunc], discardStatement); + WRITE(p, " if ((v_scaled & u_alphacolormask.rgb) %s (u_alphacolorref.rgb & u_alphacolormask.rgb)) %s\n", colorTestFuncs[colorTestFunc], discardStatement); } else { WRITE(p, " %s\n", discardStatement); } @@ -431,7 +431,7 @@ bool GenerateVulkanGLSLFragmentShader(const FShaderID &id, char *buffer, uint32_ case GE_SRCBLEND_DOUBLEINVSRCALPHA: srcFactor = "vec3(1.0 - v.a * 2.0)"; break; case GE_SRCBLEND_DOUBLEDSTALPHA: srcFactor = "ERROR"; break; case GE_SRCBLEND_DOUBLEINVDSTALPHA: srcFactor = "ERROR"; break; - case GE_SRCBLEND_FIXA: srcFactor = "base.blendFixA"; break; + case GE_SRCBLEND_FIXA: srcFactor = "u_blendFixA"; break; } WRITE(p, " v.rgb = v.rgb * %s;\n", srcFactor); @@ -454,7 +454,7 @@ bool GenerateVulkanGLSLFragmentShader(const FShaderID &id, char *buffer, uint32_ case GE_SRCBLEND_DOUBLEINVSRCALPHA: srcFactor = "vec3(1.0 - v.a * 2.0)"; break; case GE_SRCBLEND_DOUBLEDSTALPHA: srcFactor = "vec3(destColor.a * 2.0)"; break; case GE_SRCBLEND_DOUBLEINVDSTALPHA: srcFactor = "vec3(1.0 - destColor.a * 2.0)"; break; - case GE_SRCBLEND_FIXA: srcFactor = "base.blendFixA"; break; + case GE_SRCBLEND_FIXA: srcFactor = "u_blendFixA"; break; } switch (replaceBlendFuncB) { case GE_DSTBLEND_SRCCOLOR: dstFactor = "v.rgb"; break; @@ -467,7 +467,7 @@ bool GenerateVulkanGLSLFragmentShader(const FShaderID &id, char *buffer, uint32_ case GE_DSTBLEND_DOUBLEINVSRCALPHA: dstFactor = "vec3(1.0 - v.a * 2.0)"; break; case GE_DSTBLEND_DOUBLEDSTALPHA: dstFactor = "vec3(destColor.a * 2.0)"; break; case GE_DSTBLEND_DOUBLEINVDSTALPHA: dstFactor = "vec3(1.0 - destColor.a * 2.0)"; break; - case GE_DSTBLEND_FIXB: dstFactor = "base.blendFixB"; break; + case GE_DSTBLEND_FIXB: dstFactor = "u_blendFixB"; break; } switch (replaceBlendEq) { @@ -502,7 +502,7 @@ bool GenerateVulkanGLSLFragmentShader(const FShaderID &id, char *buffer, uint32_ if (stencilToAlpha != REPLACE_ALPHA_NO) { switch (replaceAlphaWithStencilType) { case STENCIL_VALUE_UNIFORM: - replacedAlpha = "base.stencilReplace"; + replacedAlpha = "u_stencilReplaceValue"; break; case STENCIL_VALUE_ZERO: diff --git a/GPU/Vulkan/VertexShaderGeneratorVulkan.cpp b/GPU/Vulkan/VertexShaderGeneratorVulkan.cpp index 36574f24ae..d706c42e08 100644 --- a/GPU/Vulkan/VertexShaderGeneratorVulkan.cpp +++ b/GPU/Vulkan/VertexShaderGeneratorVulkan.cpp @@ -134,11 +134,11 @@ bool GenerateVulkanGLSLVertexShader(const VShaderID &id, char *buffer) { bool flipNormalTess = id.Bit(VS_BIT_NORM_REVERSE_TESS); WRITE(p, "\n"); - WRITE(p, "layout (std140, set = 0, binding = 3) uniform baseVars {\n%s} base;\n", ub_baseStr); + WRITE(p, "layout (std140, set = 0, binding = 3) uniform baseVars {\n%s};\n", ub_baseStr); if (enableLighting || doShadeMapping) - WRITE(p, "layout (std140, set = 0, binding = 4) uniform lightVars {\n%s} light;\n", ub_vs_lightsStr); + WRITE(p, "layout (std140, set = 0, binding = 4) uniform lightVars {\n%s};\n", ub_vs_lightsStr); if (enableBones) - WRITE(p, "layout (std140, set = 0, binding = 5) uniform boneVars {\n%s} bone;\n", ub_vs_bonesStr); + WRITE(p, "layout (std140, set = 0, binding = 5) uniform boneVars {\n%s};\n", ub_vs_bonesStr); const char *shading = doFlatShading ? "flat " : ""; @@ -203,9 +203,9 @@ bool GenerateVulkanGLSLVertexShader(const VShaderID &id, char *buffer) { // Apply the projection and viewport to get the Z buffer value, floor to integer, undo the viewport and projection. WRITE(p, "\nvec4 depthRoundZVP(vec4 v) {\n"); WRITE(p, " float z = v.z / v.w;\n"); - WRITE(p, " z = z * base.depthRange.x + base.depthRange.y;\n"); + WRITE(p, " z = z * u_depthRange.x + u_depthRange.y;\n"); WRITE(p, " z = floor(z);\n"); - WRITE(p, " z = (z - base.depthRange.z) * base.depthRange.w;\n"); + WRITE(p, " z = (z - u_depthRange.z) * u_depthRange.w;\n"); WRITE(p, " return vec4(v.x, v.y, z * v.w, v.w);\n"); WRITE(p, "}\n\n"); } @@ -263,7 +263,7 @@ bool GenerateVulkanGLSLVertexShader(const VShaderID &id, char *buffer) { WRITE(p, " int index;\n"); for (int i = 0; i < 4; i++) { for (int j = 0; j < 4; j++) { - WRITE(p, " index = (%i + point_pos.y) * int(base.spline_counts) + (%i + point_pos.x);\n", i, j); + WRITE(p, " index = (%i + point_pos.y) * int(u_spline_counts) + (%i + point_pos.x);\n", i, j); WRITE(p, " _pos[%i] = tess_data.data[index].pos.xyz;\n", i * 4 + j); if (doTexture && hasTexcoordTess) WRITE(p, " _tex[%i] = tess_data.data[index].uv.xy;\n", i * 4 + j); @@ -288,7 +288,7 @@ bool GenerateVulkanGLSLVertexShader(const VShaderID &id, char *buffer) { if (hasColorTess) WRITE(p, " tess.col = tess_sample(_col, basis);\n"); else - WRITE(p, " tess.col = base.matambientalpha;\n"); + WRITE(p, " tess.col = u_matambientalpha;\n"); if (hasNormalTess) { // Derivatives as weight coefficients WRITE(p, " vec4 deriv_u = tess_weights_u.data[weight_idx.x].deriv;\n"); @@ -317,7 +317,7 @@ bool GenerateVulkanGLSLVertexShader(const VShaderID &id, char *buffer) { if (lmode) WRITE(p, " v_color1 = color1;\n"); } else { - WRITE(p, " v_color0 = base.matambientalpha;\n"); + WRITE(p, " v_color0 = u_matambientalpha;\n"); if (lmode) WRITE(p, " v_color1 = vec3(0.0);\n"); } @@ -325,13 +325,13 @@ bool GenerateVulkanGLSLVertexShader(const VShaderID &id, char *buffer) { WRITE(p, " v_fogdepth = position.w;\n"); } if (isModeThrough) { - WRITE(p, " vec4 outPos = base.proj_through_mtx * vec4(position.xyz, 1.0);\n"); + WRITE(p, " vec4 outPos = u_proj_through * vec4(position.xyz, 1.0);\n"); } else { // The viewport is used in this case, so need to compensate for that. if (gstate_c.Supports(GPU_ROUND_DEPTH_TO_16BIT)) { - WRITE(p, " vec4 outPos = depthRoundZVP(base.proj_mtx * vec4(position.xyz, 1.0));\n"); + WRITE(p, " vec4 outPos = depthRoundZVP(u_proj * vec4(position.xyz, 1.0));\n"); } else { - WRITE(p, " vec4 outPos = base.proj_mtx * vec4(position.xyz, 1.0);\n"); + WRITE(p, " vec4 outPos = u_proj * vec4(position.xyz, 1.0);\n"); } } } else { @@ -342,17 +342,17 @@ bool GenerateVulkanGLSLVertexShader(const VShaderID &id, char *buffer) { WRITE(p, " Tess tess;\n"); WRITE(p, " tessellate(tess);\n"); - WRITE(p, " vec3 worldpos = vec4(tess.pos.xyz, 1.0) * base.world_mtx;\n"); + WRITE(p, " vec3 worldpos = vec4(tess.pos.xyz, 1.0) * u_world;\n"); if (hasNormalTess) { - WRITE(p, " mediump vec3 worldnormal = normalize(vec4(%stess.nrm, 0.0) * base.world_mtx);\n", flipNormalTess ? "-" : ""); + WRITE(p, " mediump vec3 worldnormal = normalize(vec4(%stess.nrm, 0.0) * u_world);\n", flipNormalTess ? "-" : ""); } else { WRITE(p, " mediump vec3 worldnormal = vec3(0.0, 0.0, 1.0);\n"); } } else { // No skinning, just standard T&L. - WRITE(p, " vec3 worldpos = vec4(position.xyz, 1.0) * base.world_mtx;\n"); + WRITE(p, " vec3 worldpos = vec4(position.xyz, 1.0) * u_world;\n"); if (hasNormal) - WRITE(p, " mediump vec3 worldnormal = normalize(vec4(%snormal, 0.0) * base.world_mtx);\n", flipNormal ? "-" : ""); + WRITE(p, " mediump vec3 worldnormal = normalize(vec4(%snormal, 0.0) * u_world);\n", flipNormal ? "-" : ""); else WRITE(p, " mediump vec3 worldnormal = vec3(0.0, 0.0, 1.0);\n"); } @@ -365,10 +365,10 @@ bool GenerateVulkanGLSLVertexShader(const VShaderID &id, char *buffer) { "w2.x", "w2.y", "w2.z", "w2.w", }; - WRITE(p, " mat3x4 skinMatrix = w1.x * bone.m[0];\n"); + WRITE(p, " mat3x4 skinMatrix = w1.x * u_bone[0];\n"); if (numBoneWeights > 1) { for (int i = 1; i < numBoneWeights; i++) { - WRITE(p, " skinMatrix += %s * bone.m[%i];\n", boneWeightAttr[i], i); + WRITE(p, " skinMatrix += %s * u_bone[%i];\n", boneWeightAttr[i], i); } } @@ -376,23 +376,23 @@ bool GenerateVulkanGLSLVertexShader(const VShaderID &id, char *buffer) { // Trying to simplify this results in bugs in LBP... WRITE(p, " vec3 skinnedpos = (vec4(position, 1.0) * skinMatrix) %s;\n", factor); - WRITE(p, " vec3 worldpos = vec4(skinnedpos, 1.0) * base.world_mtx;\n"); + WRITE(p, " vec3 worldpos = vec4(skinnedpos, 1.0) * u_world;\n"); if (hasNormal) { WRITE(p, " mediump vec3 skinnednormal = vec4(%snormal, 0.0) * skinMatrix %s;\n", flipNormal ? "-" : "", factor); } else { WRITE(p, " mediump vec3 skinnednormal = vec4(0.0, 0.0, %s1.0, 0.0) * skinMatrix %s;\n", flipNormal ? "-" : "", factor); } - WRITE(p, " mediump vec3 worldnormal = normalize(vec4(skinnednormal, 0.0) * base.world_mtx);\n"); + WRITE(p, " mediump vec3 worldnormal = normalize(vec4(skinnednormal, 0.0) * u_world);\n"); } - WRITE(p, " vec4 viewPos = vec4(vec4(worldpos, 1.0) * base.view_mtx, 1.0);\n"); + WRITE(p, " vec4 viewPos = vec4(vec4(worldpos, 1.0) * u_view, 1.0);\n"); // Final view and projection transforms. if (gstate_c.Supports(GPU_ROUND_DEPTH_TO_16BIT)) { - WRITE(p, " vec4 outPos = depthRoundZVP(base.proj_mtx * viewPos);\n"); + WRITE(p, " vec4 outPos = depthRoundZVP(u_proj * viewPos);\n"); } else { - WRITE(p, " vec4 outPos = base.proj_mtx * viewPos;\n"); + WRITE(p, " vec4 outPos = u_proj * viewPos;\n"); } // TODO: Declare variables for dots for shade mapping if needed. @@ -536,7 +536,7 @@ bool GenerateVulkanGLSLVertexShader(const VShaderID &id, char *buffer) { else WRITE(p, " v_color0 = color0;\n"); } else { - WRITE(p, " v_color0 = base.matambientalpha;\n"); + WRITE(p, " v_color0 = u_matambientalpha;\n"); } if (lmode) { WRITE(p, " v_color1 = vec3(0.0);\n"); @@ -553,17 +553,17 @@ bool GenerateVulkanGLSLVertexShader(const VShaderID &id, char *buffer) { if (scaleUV) { if (hasTexcoord) { if (doBezier || doSpline) - WRITE(p, " v_texcoord = vec3(tess.tex.xy * base.uvscaleoffset.xy + base.uvscaleoffset.zw, 0.0);\n"); + WRITE(p, " v_texcoord = vec3(tess.tex.xy * u_uvscaleoffset.xy + u_uvscaleoffset.zw, 0.0);\n"); else - WRITE(p, " v_texcoord = vec3(texcoord.xy * base.uvscaleoffset.xy, 0.0);\n"); + WRITE(p, " v_texcoord = vec3(texcoord.xy * u_uvscaleoffset.xy, 0.0);\n"); } else { WRITE(p, " v_texcoord = vec3(0.0);\n"); } } else { if (hasTexcoord) { - WRITE(p, " v_texcoord = vec3(texcoord.xy * base.uvscaleoffset.xy + base.uvscaleoffset.zw, 0.0);\n"); + WRITE(p, " v_texcoord = vec3(texcoord.xy * u_uvscaleoffset.xy + u_uvscaleoffset.zw, 0.0);\n"); } else { - WRITE(p, " v_texcoord = vec3(base.uvscaleoffset.zw, 0.0);\n"); + WRITE(p, " v_texcoord = vec3(u_uvscaleoffset.zw, 0.0);\n"); } } break; @@ -599,15 +599,15 @@ bool GenerateVulkanGLSLVertexShader(const VShaderID &id, char *buffer) { break; } // Transform by texture matrix. XYZ as we are doing projection mapping. - WRITE(p, " v_texcoord = (%s * base.tex_mtx).xyz * vec3(base.uvscaleoffset.xy, 1.0);\n", temp_tc.c_str()); + WRITE(p, " v_texcoord = (%s * u_tex).xyz * vec3(u_uvscaleoffset.xy, 1.0);\n", temp_tc.c_str()); } break; case GE_TEXMAP_ENVIRONMENT_MAP: // Shade mapping - use dots from light sources. { - std::string lightFactor0 = StringFromFormat("(length(light.pos[%i]) == 0.0 ? worldnormal.z : dot(normalize(light.pos[%i]), worldnormal))", ls0, ls0); - std::string lightFactor1 = StringFromFormat("(length(light.pos[%i]) == 0.0 ? worldnormal.z : dot(normalize(light.pos[%i]), worldnormal))", ls1, ls1); - WRITE(p, " v_texcoord = vec3(base.uvscaleoffset.xy * vec2(1.0 + %s, 1.0 + %s) * 0.5, 1.0);\n", lightFactor0.c_str(), lightFactor1.c_str()); + std::string lightFactor0 = StringFromFormat("(length(u_lightpos[%i]) == 0.0 ? worldnormal.z : dot(normalize(u_lightpos[%i]), worldnormal))", ls0, ls0); + std::string lightFactor1 = StringFromFormat("(length(u_lightpos[%i]) == 0.0 ? worldnormal.z : dot(normalize(u_lightpos[%i]), worldnormal))", ls1, ls1); + WRITE(p, " v_texcoord = vec3(u_uvscaleoffset.xy * vec2(1.0 + %s, 1.0 + %s) * 0.5, 1.0);\n", lightFactor0.c_str(), lightFactor1.c_str()); } break; @@ -619,17 +619,17 @@ bool GenerateVulkanGLSLVertexShader(const VShaderID &id, char *buffer) { // Compute fogdepth if (enableFog) - WRITE(p, " v_fogdepth = (viewPos.z + base.fogcoef.x) * base.fogcoef.y;\n"); + WRITE(p, " v_fogdepth = (viewPos.z + u_fogcoef.x) * u_fogcoef.y;\n"); } if (!isModeThrough && gstate_c.Supports(GPU_SUPPORTS_VS_RANGE_CULLING)) { WRITE(p, " vec3 projPos = outPos.xyz / outPos.w;\n"); // Vertex range culling doesn't happen when depth is clamped, so only do this if in range. - WRITE(p, " if (base.cullRangeMin.w <= 0.0 || (projPos.z >= base.cullRangeMin.z && projPos.z <= base.cullRangeMax.z)) {\n"); - const char *outMin = "projPos.x < base.cullRangeMin.x || projPos.y < base.cullRangeMin.y || projPos.z < base.cullRangeMin.z"; - const char *outMax = "projPos.x > base.cullRangeMax.x || projPos.y > base.cullRangeMax.y || projPos.z > base.cullRangeMax.z"; + WRITE(p, " if (u_cullRangeMin.w <= 0.0 || (projPos.z >= u_cullRangeMin.z && projPos.z <= u_cullRangeMax.z)) {\n"); + const char *outMin = "projPos.x < u_cullRangeMin.x || projPos.y < u_cullRangeMin.y || projPos.z < u_cullRangeMin.z"; + const char *outMax = "projPos.x > u_cullRangeMax.x || projPos.y > u_cullRangeMax.y || projPos.z > u_cullRangeMax.z"; WRITE(p, " if (%s || %s) {\n", outMin, outMax); - WRITE(p, " outPos.xyzw = vec4(base.cullRangeMax.w);\n"); + WRITE(p, " outPos.xyzw = vec4(u_cullRangeMax.w);\n"); WRITE(p, " }\n"); WRITE(p, " }\n"); } From 712f56fb7d0429b9026e9d82d58bf53c772e7d16 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Sat, 17 Oct 2020 08:07:26 +0200 Subject: [PATCH 065/275] Vulkan: remove array indexing for light parameters to match the other backends --- GPU/Common/ShaderUniforms.h | 35 +++++++++++++---- GPU/Vulkan/VertexShaderGeneratorVulkan.cpp | 44 +++++++++++----------- 2 files changed, 50 insertions(+), 29 deletions(-) diff --git a/GPU/Common/ShaderUniforms.h b/GPU/Common/ShaderUniforms.h index 81a4b10aae..5acf973588 100644 --- a/GPU/Common/ShaderUniforms.h +++ b/GPU/Common/ShaderUniforms.h @@ -121,13 +121,34 @@ R"( vec4 u_ambient; vec3 u_matdiffuse; vec4 u_matspecular; vec3 u_matemissive; - vec3 u_lightpos[4]; - vec3 u_lightdir[4]; - vec3 u_lightatt[4]; - vec2 u_lightangle_spotCoef[4]; - vec3 u_lightambient[4]; - vec3 u_lightdiffuse[4]; - vec3 u_lightspecular[4]; + vec3 u_lightpos0; + vec3 u_lightpos1; + vec3 u_lightpos2; + vec3 u_lightpos3; + vec3 u_lightdir0; + vec3 u_lightdir1; + vec3 u_lightdir2; + vec3 u_lightdir3; + vec3 u_lightatt0; + vec3 u_lightatt1; + vec3 u_lightatt2; + vec3 u_lightatt3; + vec4 u_lightangle_spotCoef0; + vec4 u_lightangle_spotCoef1; + vec4 u_lightangle_spotCoef2; + vec4 u_lightangle_spotCoef3; + vec3 u_lightambient0; + vec3 u_lightambient1; + vec3 u_lightambient2; + vec3 u_lightambient3; + vec3 u_lightdiffuse0; + vec3 u_lightdiffuse1; + vec3 u_lightdiffuse2; + vec3 u_lightdiffuse3; + vec3 u_lightspecular0; + vec3 u_lightspecular1; + vec3 u_lightspecular2; + vec3 u_lightspecular3; )"; // HLSL code is shared so these names are changed to match those in DX9. diff --git a/GPU/Vulkan/VertexShaderGeneratorVulkan.cpp b/GPU/Vulkan/VertexShaderGeneratorVulkan.cpp index d706c42e08..ee5a350223 100644 --- a/GPU/Vulkan/VertexShaderGeneratorVulkan.cpp +++ b/GPU/Vulkan/VertexShaderGeneratorVulkan.cpp @@ -397,14 +397,14 @@ bool GenerateVulkanGLSLVertexShader(const VShaderID &id, char *buffer) { // TODO: Declare variables for dots for shade mapping if needed. - const char *ambientStr = ((matUpdate & 1) && hasColor) ? "color0" : "base.matambientalpha"; - const char *diffuseStr = ((matUpdate & 2) && hasColor) ? "color0.rgb" : "light.matdiffuse"; - const char *specularStr = ((matUpdate & 4) && hasColor) ? "color0.rgb" : "light.matspecular.rgb"; + const char *ambientStr = ((matUpdate & 1) && hasColor) ? "color0" : "u_matambientalpha"; + const char *diffuseStr = ((matUpdate & 2) && hasColor) ? "color0.rgb" : "u_matdiffuse"; + const char *specularStr = ((matUpdate & 4) && hasColor) ? "color0.rgb" : "u_matspecular.rgb"; if (doBezier || doSpline) { // TODO: Probably, should use hasColorTess but FF4 has a problem with drawing the background. - ambientStr = (matUpdate & 1) && hasColor ? "tess.col" : "base.matambientalpha"; - diffuseStr = (matUpdate & 2) && hasColor ? "tess.col.rgb" : "light.matdiffuse"; - specularStr = (matUpdate & 4) && hasColor ? "tess.col.rgb" : "light.matspecular.rgb"; + ambientStr = (matUpdate & 1) && hasColor ? "tess.col" : "u_matambientalpha"; + diffuseStr = (matUpdate & 2) && hasColor ? "tess.col.rgb" : "u_matdiffuse"; + specularStr = (matUpdate & 4) && hasColor ? "tess.col.rgb" : "u_matspecular.rgb"; } bool diffuseIsZero = true; @@ -412,7 +412,7 @@ bool GenerateVulkanGLSLVertexShader(const VShaderID &id, char *buffer) { bool distanceNeeded = false; if (enableLighting) { - WRITE(p, " vec4 lightSum0 = light.u_ambient * %s + vec4(light.matemissive, 0.0);\n", ambientStr); + WRITE(p, " vec4 lightSum0 = u_ambient * %s + vec4(u_matemissive, 0.0);\n", ambientStr); for (int i = 0; i < 4; i++) { GELightType type = static_cast(id.Bits(VS_BIT_LIGHT0_TYPE + 4 * i, 2)); @@ -450,9 +450,9 @@ bool GenerateVulkanGLSLVertexShader(const VShaderID &id, char *buffer) { if (type == GE_LIGHTTYPE_DIRECTIONAL) { // We prenormalize light positions for directional lights. - WRITE(p, " toLight = light.pos[%i];\n", i); + WRITE(p, " toLight = u_lightpos%d;\n", i); } else { - WRITE(p, " toLight = light.pos[%i] - worldpos;\n", i); + WRITE(p, " toLight = u_lightpos%d - worldpos;\n", i); WRITE(p, " distance = length(toLight);\n"); WRITE(p, " toLight /= distance;\n"); } @@ -464,10 +464,10 @@ bool GenerateVulkanGLSLVertexShader(const VShaderID &id, char *buffer) { if (poweredDiffuse) { // pow(0.0, 0.0) may be undefined, but the PSP seems to treat it as 1.0. // Seen in Tales of the World: Radiant Mythology (#2424.) - WRITE(p, " if (light.matspecular.a <= 0.0) {\n"); + WRITE(p, " if (u_matspecular.a <= 0.0) {\n"); WRITE(p, " dot%i = 1.0;\n", i); WRITE(p, " } else {\n"); - WRITE(p, " dot%i = pow(max(dot%i, 0.0), light.matspecular.a);\n", i, i); + WRITE(p, " dot%i = pow(max(dot%i, 0.0), u_matspecular.a);\n", i, i); WRITE(p, " }\n"); } @@ -479,13 +479,13 @@ bool GenerateVulkanGLSLVertexShader(const VShaderID &id, char *buffer) { timesLightScale = ""; break; case GE_LIGHTTYPE_POINT: - WRITE(p, " lightScale = clamp(1.0 / dot(light.att[%i], vec3(1.0, distance, distance*distance)), 0.0, 1.0);\n", i); + WRITE(p, " lightScale = clamp(1.0 / dot(u_lightatt%d, vec3(1.0, distance, distance*distance)), 0.0, 1.0);\n", i); break; case GE_LIGHTTYPE_SPOT: case GE_LIGHTTYPE_UNKNOWN: - WRITE(p, " float angle%i = length(light.dir[%i]) == 0.0 ? 0.0 : dot(normalize(light.dir[%i]), toLight);\n", i, i, i); - WRITE(p, " if (angle%i >= light.angle_spotCoef[%i].x) {\n", i, i); - WRITE(p, " lightScale = clamp(1.0 / dot(light.att[%i], vec3(1.0, distance, distance*distance)), 0.0, 1.0) * (light.angle_spotCoef[%i].y <= 0.0 ? 1.0 : pow(angle%i, light.angle_spotCoef[%i].y));\n", i, i, i, i); + WRITE(p, " float angle%i = length(u_lightdir%d) == 0.0 ? 0.0 : dot(normalize(u_lightdir%d), toLight);\n", i, i, i); + WRITE(p, " if (angle%i >= u_lightangle_spotCoef%d.x) {\n", i, i); + WRITE(p, " lightScale = clamp(1.0 / dot(u_lightatt%d, vec3(1.0, distance, distance*distance)), 0.0, 1.0) * (u_lightangle_spotCoef%d.y <= 0.0 ? 1.0 : pow(angle%i, u_lightangle_spotCoef%d.y));\n", i, i, i, i); WRITE(p, " } else {\n"); WRITE(p, " lightScale = 0.0;\n"); WRITE(p, " }\n"); @@ -495,20 +495,20 @@ bool GenerateVulkanGLSLVertexShader(const VShaderID &id, char *buffer) { break; } - WRITE(p, " diffuse = (light.diffuse[%i] * %s) * max(dot%i, 0.0);\n", i, diffuseStr, i); + WRITE(p, " diffuse = (u_lightdiffuse%d * %s) * max(dot%i, 0.0);\n", i, diffuseStr, i); if (doSpecular) { WRITE(p, " if (dot%i >= 0.0) {\n", i); WRITE(p, " dot%i = dot(normalize(toLight + vec3(0.0, 0.0, 1.0)), worldnormal);\n", i); - WRITE(p, " if (light.matspecular.a <= 0.0) {\n"); + WRITE(p, " if (u_matspecular.a <= 0.0) {\n"); WRITE(p, " dot%i = 1.0;\n", i); WRITE(p, " } else {\n"); - WRITE(p, " dot%i = pow(max(dot%i, 0.0), light.matspecular.a);\n", i, i); + WRITE(p, " dot%i = pow(max(dot%i, 0.0), u_matspecular.a);\n", i, i); WRITE(p, " }\n"); WRITE(p, " if (dot%i > 0.0)\n", i); - WRITE(p, " lightSum1 += light.specular[%i] * %s * dot%i %s;\n", i, specularStr, i, timesLightScale); + WRITE(p, " lightSum1 += u_lightspecular%d * %s * dot%i %s;\n", i, specularStr, i, timesLightScale); WRITE(p, " }\n"); } - WRITE(p, " lightSum0.rgb += (light.ambient[%i] * %s.rgb + diffuse)%s;\n", i, ambientStr, timesLightScale); + WRITE(p, " lightSum0.rgb += (u_lightambient%d * %s.rgb + diffuse)%s;\n", i, ambientStr, timesLightScale); } if (enableLighting) { @@ -605,8 +605,8 @@ bool GenerateVulkanGLSLVertexShader(const VShaderID &id, char *buffer) { case GE_TEXMAP_ENVIRONMENT_MAP: // Shade mapping - use dots from light sources. { - std::string lightFactor0 = StringFromFormat("(length(u_lightpos[%i]) == 0.0 ? worldnormal.z : dot(normalize(u_lightpos[%i]), worldnormal))", ls0, ls0); - std::string lightFactor1 = StringFromFormat("(length(u_lightpos[%i]) == 0.0 ? worldnormal.z : dot(normalize(u_lightpos[%i]), worldnormal))", ls1, ls1); + std::string lightFactor0 = StringFromFormat("(length(u_lightpos%d) == 0.0 ? worldnormal.z : dot(normalize(u_lightpos%d), worldnormal))", ls0, ls0); + std::string lightFactor1 = StringFromFormat("(length(u_lightpos%d) == 0.0 ? worldnormal.z : dot(normalize(u_lightpos%d), worldnormal))", ls1, ls1); WRITE(p, " v_texcoord = vec3(u_uvscaleoffset.xy * vec2(1.0 + %s, 1.0 + %s) * 0.5, 1.0);\n", lightFactor0.c_str(), lightFactor1.c_str()); } break; From c6f51bbc1e0a4ebb77a0fc6e2e735444ae4f4b50 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Mon, 19 Oct 2020 20:38:43 +0200 Subject: [PATCH 066/275] Add brute force shader generator tester. Tests D3D11 and Vulkan shaders. Found a potential error with tesselation without normals already. --- GPU/D3D11/D3D11Util.cpp | 12 +- GPU/D3D11/D3D11Util.h | 6 +- GPU/D3D11/FragmentShaderGeneratorD3D11.cpp | 4 +- GPU/D3D11/FragmentShaderGeneratorD3D11.h | 2 +- GPU/D3D11/VertexShaderGeneratorD3D11.cpp | 4 +- GPU/D3D11/VertexShaderGeneratorD3D11.h | 2 +- GPU/Directx9/ShaderManagerDX9.cpp | 4 +- GPU/Directx9/VertexShaderGeneratorDX9.h | 2 +- unittest/TestShaderGenerators.cpp | 174 +++++++++++++++++++++ unittest/UnitTest.cpp | 3 +- unittest/UnitTests.vcxproj | 3 +- unittest/UnitTests.vcxproj.filters | 1 + 12 files changed, 200 insertions(+), 17 deletions(-) create mode 100644 unittest/TestShaderGenerators.cpp diff --git a/GPU/D3D11/D3D11Util.cpp b/GPU/D3D11/D3D11Util.cpp index ee6ad435d3..acbdfc8e35 100644 --- a/GPU/D3D11/D3D11Util.cpp +++ b/GPU/D3D11/D3D11Util.cpp @@ -19,7 +19,7 @@ #include "D3D11Util.h" -static std::vector CompileShaderToBytecode(const char *code, size_t codeSize, const char *target, UINT flags) { +std::vector CompileShaderToBytecodeD3D11(const char *code, size_t codeSize, const char *target, UINT flags) { ID3DBlob *compiledCode = nullptr; ID3DBlob *errorMsgs = nullptr; HRESULT result = ptr_D3DCompile(code, codeSize, nullptr, nullptr, nullptr, "main", target, flags, 0, &compiledCode, &errorMsgs); @@ -31,8 +31,10 @@ static std::vector CompileShaderToBytecode(const char *code, size_t cod errorMsgs->Release(); } if (compiledCode) { + // Success! const uint8_t *buf = (const uint8_t *)compiledCode->GetBufferPointer(); std::vector compiled = std::vector(buf, buf + compiledCode->GetBufferSize()); + _assert_(compiled.size() != 0); compiledCode->Release(); return compiled; } @@ -41,7 +43,7 @@ static std::vector CompileShaderToBytecode(const char *code, size_t cod ID3D11VertexShader *CreateVertexShaderD3D11(ID3D11Device *device, const char *code, size_t codeSize, std::vector *byteCodeOut, D3D_FEATURE_LEVEL featureLevel, UINT flags) { const char *profile = featureLevel <= D3D_FEATURE_LEVEL_9_3 ? "vs_4_0_level_9_1" : "vs_4_0"; - std::vector byteCode = CompileShaderToBytecode(code, codeSize, profile, flags); + std::vector byteCode = CompileShaderToBytecodeD3D11(code, codeSize, profile, flags); if (byteCode.empty()) return nullptr; @@ -54,7 +56,7 @@ ID3D11VertexShader *CreateVertexShaderD3D11(ID3D11Device *device, const char *co ID3D11PixelShader *CreatePixelShaderD3D11(ID3D11Device *device, const char *code, size_t codeSize, D3D_FEATURE_LEVEL featureLevel, UINT flags) { const char *profile = featureLevel <= D3D_FEATURE_LEVEL_9_3 ? "ps_4_0_level_9_1" : "ps_4_0"; - std::vector byteCode = CompileShaderToBytecode(code, codeSize, profile, flags); + std::vector byteCode = CompileShaderToBytecodeD3D11(code, codeSize, profile, flags); if (byteCode.empty()) return nullptr; @@ -66,7 +68,7 @@ ID3D11PixelShader *CreatePixelShaderD3D11(ID3D11Device *device, const char *code ID3D11ComputeShader *CreateComputeShaderD3D11(ID3D11Device *device, const char *code, size_t codeSize, D3D_FEATURE_LEVEL featureLevel, UINT flags) { if (featureLevel <= D3D_FEATURE_LEVEL_9_3) return nullptr; - std::vector byteCode = CompileShaderToBytecode(code, codeSize, "cs_4_0", flags); + std::vector byteCode = CompileShaderToBytecodeD3D11(code, codeSize, "cs_4_0", flags); if (byteCode.empty()) return nullptr; @@ -78,7 +80,7 @@ ID3D11ComputeShader *CreateComputeShaderD3D11(ID3D11Device *device, const char * ID3D11GeometryShader *CreateGeometryShaderD3D11(ID3D11Device *device, const char *code, size_t codeSize, D3D_FEATURE_LEVEL featureLevel, UINT flags) { if (featureLevel <= D3D_FEATURE_LEVEL_9_3) return nullptr; - std::vector byteCode = CompileShaderToBytecode(code, codeSize, "gs_5_0", flags); + std::vector byteCode = CompileShaderToBytecodeD3D11(code, codeSize, "gs_5_0", flags); if (byteCode.empty()) return nullptr; diff --git a/GPU/D3D11/D3D11Util.h b/GPU/D3D11/D3D11Util.h index 11dba6ee4c..e9ae76ad42 100644 --- a/GPU/D3D11/D3D11Util.h +++ b/GPU/D3D11/D3D11Util.h @@ -18,6 +18,8 @@ #pragma once #include +#include + #include class PushBufferD3D11 { @@ -71,6 +73,8 @@ private: bool nextMapDiscard_ = false; }; +std::vector CompileShaderToBytecodeD3D11(const char *code, size_t codeSize, const char *target, UINT flags); + ID3D11VertexShader *CreateVertexShaderD3D11(ID3D11Device *device, const char *code, size_t codeSize, std::vector *byteCodeOut, D3D_FEATURE_LEVEL featureLevel, UINT flags = 0); ID3D11PixelShader *CreatePixelShaderD3D11(ID3D11Device *device, const char *code, size_t codeSize, D3D_FEATURE_LEVEL featureLevel, UINT flags = 0); ID3D11ComputeShader *CreateComputeShaderD3D11(ID3D11Device *device, const char *code, size_t codeSize, D3D_FEATURE_LEVEL featureLevel, UINT flags = 0); @@ -95,4 +99,4 @@ public: if (!SUCCEEDED((x))) \ Crash(); -extern StockObjectsD3D11 stockD3D11; \ No newline at end of file +extern StockObjectsD3D11 stockD3D11; diff --git a/GPU/D3D11/FragmentShaderGeneratorD3D11.cpp b/GPU/D3D11/FragmentShaderGeneratorD3D11.cpp index 07d37c8d5c..d63a0c4b41 100644 --- a/GPU/D3D11/FragmentShaderGeneratorD3D11.cpp +++ b/GPU/D3D11/FragmentShaderGeneratorD3D11.cpp @@ -19,6 +19,6 @@ #include "GPU/D3D11/FragmentShaderGeneratorD3D11.h" #include "GPU/Directx9/PixelShaderGeneratorDX9.h" -void GenerateFragmentShaderD3D11(const FShaderID &id, char *buffer, ShaderLanguage lang) { - DX9::GenerateFragmentShaderHLSL(id, buffer, lang); +bool GenerateFragmentShaderD3D11(const FShaderID &id, char *buffer, ShaderLanguage lang) { + return DX9::GenerateFragmentShaderHLSL(id, buffer, lang); } diff --git a/GPU/D3D11/FragmentShaderGeneratorD3D11.h b/GPU/D3D11/FragmentShaderGeneratorD3D11.h index cf94a63200..5e99cae958 100644 --- a/GPU/D3D11/FragmentShaderGeneratorD3D11.h +++ b/GPU/D3D11/FragmentShaderGeneratorD3D11.h @@ -19,4 +19,4 @@ #include "GPU/Common/ShaderId.h" -void GenerateFragmentShaderD3D11(const FShaderID &id, char *buffer, ShaderLanguage lang); +bool GenerateFragmentShaderD3D11(const FShaderID &id, char *buffer, ShaderLanguage lang); diff --git a/GPU/D3D11/VertexShaderGeneratorD3D11.cpp b/GPU/D3D11/VertexShaderGeneratorD3D11.cpp index 75affc997d..87c24e33f5 100644 --- a/GPU/D3D11/VertexShaderGeneratorD3D11.cpp +++ b/GPU/D3D11/VertexShaderGeneratorD3D11.cpp @@ -19,6 +19,6 @@ #include "GPU/D3D11/VertexShaderGeneratorD3D11.h" #include "GPU/Directx9/VertexShaderGeneratorDX9.h" -void GenerateVertexShaderD3D11(const VShaderID &id, char *buffer, ShaderLanguage lang) { - DX9::GenerateVertexShaderHLSL(id, buffer, lang); +bool GenerateVertexShaderD3D11(const VShaderID &id, char *buffer, ShaderLanguage lang) { + return DX9::GenerateVertexShaderHLSL(id, buffer, lang); } diff --git a/GPU/D3D11/VertexShaderGeneratorD3D11.h b/GPU/D3D11/VertexShaderGeneratorD3D11.h index fcf6f7f749..d595a9e146 100644 --- a/GPU/D3D11/VertexShaderGeneratorD3D11.h +++ b/GPU/D3D11/VertexShaderGeneratorD3D11.h @@ -19,4 +19,4 @@ #include "GPU/Common/ShaderId.h" -void GenerateVertexShaderD3D11(const VShaderID &id, char *buffer, ShaderLanguage lang); +bool GenerateVertexShaderD3D11(const VShaderID &id, char *buffer, ShaderLanguage lang); diff --git a/GPU/Directx9/ShaderManagerDX9.cpp b/GPU/Directx9/ShaderManagerDX9.cpp index f7c331907e..13d998c3d5 100644 --- a/GPU/Directx9/ShaderManagerDX9.cpp +++ b/GPU/Directx9/ShaderManagerDX9.cpp @@ -587,7 +587,7 @@ VSShader *ShaderManagerDX9::ApplyShader(bool useHWTransform, bool useHWTessellat VSShader *vs; if (vsIter == vsCache_.end()) { // Vertex shader not in cache. Let's compile it. - GenerateVertexShaderHLSL(VSID, codeBuffer_); + GenerateVertexShaderHLSL(VSID, codeBuffer_, HLSL_DX9); vs = new VSShader(device_, VSID, codeBuffer_, useHWTransform); if (vs->Failed()) { @@ -605,7 +605,7 @@ VSShader *ShaderManagerDX9::ApplyShader(bool useHWTransform, bool useHWTessellat // next time and we'll do this over and over... // Can still work with software transform. - GenerateVertexShaderHLSL(VSID, codeBuffer_); + GenerateVertexShaderHLSL(VSID, codeBuffer_, HLSL_DX9); vs = new VSShader(device_, VSID, codeBuffer_, false); } diff --git a/GPU/Directx9/VertexShaderGeneratorDX9.h b/GPU/Directx9/VertexShaderGeneratorDX9.h index aecc113ea3..b27f4dedeb 100644 --- a/GPU/Directx9/VertexShaderGeneratorDX9.h +++ b/GPU/Directx9/VertexShaderGeneratorDX9.h @@ -21,7 +21,7 @@ namespace DX9 { - void GenerateVertexShaderHLSL(const VShaderID &id, char *buffer, ShaderLanguage lang = HLSL_DX9); + bool GenerateVertexShaderHLSL(const VShaderID &id, char *buffer, ShaderLanguage lang); enum { CONST_VS_PROJ = 0, diff --git a/unittest/TestShaderGenerators.cpp b/unittest/TestShaderGenerators.cpp new file mode 100644 index 0000000000..a045bd1359 --- /dev/null +++ b/unittest/TestShaderGenerators.cpp @@ -0,0 +1,174 @@ +#include "Common/StringUtils.h" + +#include "GPU/Common/ShaderId.h" +#include "GPU/Common/ShaderCommon.h" +#include "Common/Data/Random/Rng.h" + +#include "GPU/Vulkan/VulkanContext.h" + +#include "GPU/Vulkan/FragmentShaderGeneratorVulkan.h" +#include "GPU/D3D11/FragmentShaderGeneratorD3D11.h" +#include "GPU/Directx9/PixelShaderGeneratorDX9.h" +#include "GPU/GLES/FragmentShaderGeneratorGLES.h" + +#include "GPU/Vulkan/VertexShaderGeneratorVulkan.h" +#include "GPU/D3D11/VertexShaderGeneratorD3D11.h" +#include "GPU/Directx9/VertexShaderGeneratorDX9.h" +#include "GPU/GLES/VertexShaderGeneratorGLES.h" + +#include "GPU/D3D11/D3D11Util.h" +#include "GPU/D3D11/D3D11Loader.h" + +#include "GPU/D3D9/D3DCompilerLoader.h" +#include "GPU/D3D9/D3D9ShaderCompiler.h" + +bool GenerateFShader(FShaderID id, char *buffer, ShaderLanguage lang) { + switch (lang) { + case ShaderLanguage::HLSL_D3D11: + return GenerateFragmentShaderD3D11(id, buffer, ShaderLanguage::HLSL_D3D11); + case ShaderLanguage::HLSL_DX9: + DX9::GenerateFragmentShaderHLSL(id, buffer, ShaderLanguage::HLSL_DX9); + // TODO: Need a device :( Returning false here so it doesn't get tried. + return false; + case ShaderLanguage::GLSL_VULKAN: + return GenerateVulkanGLSLFragmentShader(id, buffer, 0); + case ShaderLanguage::GLSL_140: + case ShaderLanguage::GLSL_300: + // TODO: Need a device - except that maybe glslang could be used to verify these .... + return false; + default: + return false; + } +} + +bool GenerateVShader(VShaderID id, char *buffer, ShaderLanguage lang) { + switch (lang) { + case ShaderLanguage::HLSL_D3D11: + return GenerateVertexShaderD3D11(id, buffer, ShaderLanguage::HLSL_D3D11); + case ShaderLanguage::HLSL_DX9: + DX9::GenerateVertexShaderHLSL(id, buffer, ShaderLanguage::HLSL_DX9); + // TODO: Need a device :( Returning false here so it doesn't get tried. + return false; + // return DX9::GenerateFragmentShaderHLSL(id, buffer, ShaderLanguage::HLSL_DX9); + case ShaderLanguage::GLSL_VULKAN: + return GenerateVulkanGLSLVertexShader(id, buffer); + default: + return false; + } +} + +bool TestCompileShader(const char *buffer, ShaderLanguage lang, bool vertex) { + switch (lang) { + case ShaderLanguage::HLSL_D3D11: + { + auto output = CompileShaderToBytecodeD3D11(buffer, strlen(buffer), vertex ? "vs_4_0" : "ps_4_0", 0); + return !output.empty(); + } + case ShaderLanguage::HLSL_DX9: + return false; + case ShaderLanguage::GLSL_VULKAN: + { + std::vector spirv; + std::string errorMessage; + bool result = GLSLtoSPV(vertex ? VK_SHADER_STAGE_VERTEX_BIT : VK_SHADER_STAGE_FRAGMENT_BIT, buffer, spirv, &errorMessage); + if (!result) { + printf("GLSLtoSPV ERROR:\n%s\n\n", errorMessage.c_str()); + } + return result; + } + case ShaderLanguage::GLSL_140: + + return false; + case ShaderLanguage::GLSL_300: + + return false; + default: + return false; + } +} + +bool TestShaderGenerators() { + LoadD3D11(); + init_glslang(); + LoadD3DCompilerDynamic(); + + ShaderLanguage languages[] = { + ShaderLanguage::HLSL_D3D11, + ShaderLanguage::GLSL_VULKAN, + ShaderLanguage::GLSL_140, + ShaderLanguage::GLSL_300, + ShaderLanguage::HLSL_DX9, + }; + const int numLanguages = ARRAY_SIZE(languages); + + char *buffer[numLanguages]; + + for (int i = 0; i < numLanguages; i++) { + buffer[i] = new char[65536]; + } + // Generate a bunch of random fragment shader IDs, try to generate shader source. + // Then compile it and check that it's ok. + GMRng rng; + int successes = 0; + int count = 200; + for (int i = 0; i < count; i++) { + uint32_t bottom = rng.R32(); + uint32_t top = rng.R32(); + FShaderID id; + id.d[0] = bottom; + id.d[1] = top; + + bool generateSuccess[numLanguages]{}; + + for (int j = 0; j < numLanguages; j++) { + generateSuccess[j] = GenerateFShader(id, buffer[j], languages[j]); + } + + // Now that we have the strings ready for easy comparison (buffer,4 in the watch window), + // let's try to compile them. + for (int j = 0; j < numLanguages; j++) { + if (generateSuccess[j]) { + if (!TestCompileShader(buffer[j], languages[j], false)) { + printf("Error compiling fragment shader:\n\n%s\n\n", LineNumberString(buffer[j]).c_str()); + return false; + } + successes++; + } + } + } + + printf("%d/%d fragment shaders generated (it's normal that it's not all, there are invalid bit combos)\n", successes, count * numLanguages); + + // Now try vertex shaders. + for (int i = 0; i < count; i++) { + uint32_t bottom = rng.R32(); + uint32_t top = rng.R32(); + VShaderID id; + id.d[0] = bottom; + id.d[1] = top; + + bool generateSuccess[numLanguages]{}; + + for (int j = 0; j < numLanguages; j++) { + generateSuccess[j] = GenerateVShader(id, buffer[j], languages[j]); + } + + // Now that we have the strings ready for easy comparison (buffer,4 in the watch window), + // let's try to compile them. + for (int j = 0; j < numLanguages; j++) { + if (generateSuccess[j]) { + if (!TestCompileShader(buffer[j], languages[j], true)) { + printf("Error compiling vertex shader:\n\n%s\n\n", LineNumberString(buffer[j]).c_str()); + return false; + } + successes++; + } + } + } + + for (int i = 0; i < numLanguages; i++) { + delete[] buffer[i]; + } + + return true; +} diff --git a/unittest/UnitTest.cpp b/unittest/UnitTest.cpp index a310999360..b5beb3cefa 100644 --- a/unittest/UnitTest.cpp +++ b/unittest/UnitTest.cpp @@ -571,6 +571,7 @@ struct TestItem { bool TestArmEmitter(); bool TestArm64Emitter(); bool TestX64Emitter(); +bool TestShaderGenerators(); TestItem availableTests[] = { #if PPSSPP_ARCH(ARM64) || PPSSPP_ARCH(AMD64) || PPSSPP_ARCH(X86) @@ -593,7 +594,7 @@ TestItem availableTests[] = { TEST_ITEM(ParseLBN), TEST_ITEM(QuickTexHash), TEST_ITEM(CLZ), - TEST_ITEM(MemMap), + TEST_ITEM(ShaderGenerators), }; int main(int argc, const char *argv[]) { diff --git a/unittest/UnitTests.vcxproj b/unittest/UnitTests.vcxproj index a401a081b7..f585ee5feb 100644 --- a/unittest/UnitTests.vcxproj +++ b/unittest/UnitTests.vcxproj @@ -382,6 +382,7 @@ true true + @@ -426,4 +427,4 @@ - + \ No newline at end of file diff --git a/unittest/UnitTests.vcxproj.filters b/unittest/UnitTests.vcxproj.filters index fd685e86b1..511e700f67 100644 --- a/unittest/UnitTests.vcxproj.filters +++ b/unittest/UnitTests.vcxproj.filters @@ -11,6 +11,7 @@ Windows + From 3d36049b65bd732fb61505717bbd0ffb6d93a782 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Wed, 21 Oct 2020 23:09:34 +0200 Subject: [PATCH 067/275] Rename shader generator functions, a bit of moving around and adding an errorString param. --- CMakeLists.txt | 12 ++-- GPU/Common/ShaderCommon.h | 6 ++ GPU/Common/ShaderId.h | 2 + GPU/D3D11/DrawEngineD3D11.h | 2 +- GPU/D3D11/FragmentShaderGeneratorD3D11.cpp | 24 -------- GPU/D3D11/FragmentShaderGeneratorD3D11.h | 22 ------- GPU/D3D11/ShaderManagerD3D11.cpp | 10 ++-- GPU/D3D11/StencilBufferD3D11.cpp | 2 +- GPU/D3D11/TextureCacheD3D11.cpp | 1 - GPU/D3D11/VertexShaderGeneratorD3D11.cpp | 24 -------- GPU/D3D11/VertexShaderGeneratorD3D11.h | 22 ------- GPU/Directx9/DrawEngineDX9.h | 1 - ...X9.cpp => FragmentShaderGeneratorHLSL.cpp} | 21 ++++--- ...torDX9.h => FragmentShaderGeneratorHLSL.h} | 6 +- GPU/Directx9/ShaderManagerDX9.cpp | 26 +++++--- GPU/Directx9/ShaderManagerDX9.h | 4 +- GPU/Directx9/StateMappingDX9.cpp | 1 - GPU/Directx9/StencilBufferDX9.cpp | 1 - GPU/Directx9/TextureCacheDX9.cpp | 2 +- GPU/Directx9/VertexShaderGeneratorDX9.h | 60 ------------------- ...rDX9.cpp => VertexShaderGeneratorHLSL.cpp} | 24 ++------ GPU/Directx9/VertexShaderGeneratorHLSL.h | 57 ++++++++++++++++++ GPU/GLES/FragmentShaderGeneratorGLES.cpp | 6 +- GPU/GLES/FragmentShaderGeneratorGLES.h | 2 +- GPU/GLES/ShaderManagerGLES.cpp | 10 +++- GPU/GLES/VertexShaderGeneratorGLES.cpp | 10 +--- GPU/GLES/VertexShaderGeneratorGLES.h | 2 +- GPU/GPU.vcxproj | 12 ++-- GPU/GPU.vcxproj.filters | 36 ++++------- GPU/Vulkan/FragmentShaderGeneratorVulkan.cpp | 12 ++-- GPU/Vulkan/FragmentShaderGeneratorVulkan.h | 2 +- GPU/Vulkan/ShaderManagerVulkan.cpp | 17 ++++-- GPU/Vulkan/VertexShaderGeneratorVulkan.cpp | 11 +--- GPU/Vulkan/VertexShaderGeneratorVulkan.h | 2 +- UWP/GPU_UWP/GPU_UWP.vcxproj | 12 ++-- UWP/GPU_UWP/GPU_UWP.vcxproj.filters | 12 ++-- libretro/Makefile.common | 8 +-- unittest/TestShaderGenerators.cpp | 57 ++++++++++++------ 38 files changed, 225 insertions(+), 316 deletions(-) delete mode 100644 GPU/D3D11/FragmentShaderGeneratorD3D11.cpp delete mode 100644 GPU/D3D11/FragmentShaderGeneratorD3D11.h delete mode 100644 GPU/D3D11/VertexShaderGeneratorD3D11.cpp delete mode 100644 GPU/D3D11/VertexShaderGeneratorD3D11.h rename GPU/Directx9/{PixelShaderGeneratorDX9.cpp => FragmentShaderGeneratorHLSL.cpp} (98%) rename GPU/Directx9/{PixelShaderGeneratorDX9.h => FragmentShaderGeneratorHLSL.h} (95%) delete mode 100644 GPU/Directx9/VertexShaderGeneratorDX9.h rename GPU/Directx9/{VertexShaderGeneratorDX9.cpp => VertexShaderGeneratorHLSL.cpp} (98%) create mode 100644 GPU/Directx9/VertexShaderGeneratorHLSL.h diff --git a/CMakeLists.txt b/CMakeLists.txt index ce647f7040..0aec870bff 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1291,8 +1291,6 @@ set(GPU_D3D9 GPU/Directx9/DepalettizeShaderDX9.h GPU/Directx9/DrawEngineDX9.cpp GPU/Directx9/DrawEngineDX9.h - GPU/Directx9/PixelShaderGeneratorDX9.cpp - GPU/Directx9/PixelShaderGeneratorDX9.h GPU/Directx9/FramebufferManagerDX9.cpp GPU/Directx9/FramebufferManagerDX9.h GPU/Directx9/GPU_DX9.cpp @@ -1306,8 +1304,10 @@ set(GPU_D3D9 GPU/Directx9/TextureCacheDX9.h GPU/Directx9/TextureScalerDX9.cpp GPU/Directx9/TextureScalerDX9.h - GPU/Directx9/VertexShaderGeneratorDX9.cpp - GPU/Directx9/VertexShaderGeneratorDX9.h + GPU/Directx9/FragmentShaderGeneratorHLSL.cpp + GPU/Directx9/FragmentShaderGeneratorHLSL.h + GPU/Directx9/VertexShaderGeneratorHLSL.cpp + GPU/Directx9/VertexShaderGeneratorHLSL.h ) set(GPU_D3D11 @@ -1315,8 +1315,6 @@ set(GPU_D3D11 GPU/D3D11/DepalettizeShaderD3D11.h GPU/D3D11/DrawEngineD3D11.cpp GPU/D3D11/DrawEngineD3D11.h - GPU/D3D11/FragmentShaderGeneratorD3D11.cpp - GPU/D3D11/FragmentShaderGeneratorD3D11.h GPU/D3D11/FramebufferManagerD3D11.cpp GPU/D3D11/FramebufferManagerD3D11.h GPU/D3D11/GPU_D3D11.cpp @@ -1332,8 +1330,6 @@ set(GPU_D3D11 GPU/D3D11/TextureCacheD3D11.h GPU/D3D11/TextureScalerD3D11.cpp GPU/D3D11/TextureScalerD3D11.h - GPU/D3D11/VertexShaderGeneratorD3D11.cpp - GPU/D3D11/VertexShaderGeneratorD3D11.h ) # We build Vulkan even on Apple to avoid annoying build differences. diff --git a/GPU/Common/ShaderCommon.h b/GPU/Common/ShaderCommon.h index 3280c765b6..dd947db283 100644 --- a/GPU/Common/ShaderCommon.h +++ b/GPU/Common/ShaderCommon.h @@ -131,3 +131,9 @@ protected: struct TBuiltInResource; void init_resources(TBuiltInResource &Resources); + +enum DoLightComputation { + LIGHT_OFF, + LIGHT_SHADE, + LIGHT_FULL, +}; diff --git a/GPU/Common/ShaderId.h b/GPU/Common/ShaderId.h index 3adc7f4c2b..60eba9e460 100644 --- a/GPU/Common/ShaderId.h +++ b/GPU/Common/ShaderId.h @@ -159,6 +159,8 @@ protected: void SetBit(int bit, bool value = true) { if (value) { d[bit >> 5] |= 1 << (bit & 31); + } else { + d[bit >> 5] &= ~(1 << (bit & 31)); } } void SetBits(int bit, int count, int value) { diff --git a/GPU/D3D11/DrawEngineD3D11.h b/GPU/D3D11/DrawEngineD3D11.h index fbc94f2d7a..5225c11052 100644 --- a/GPU/D3D11/DrawEngineD3D11.h +++ b/GPU/D3D11/DrawEngineD3D11.h @@ -28,7 +28,7 @@ #include "GPU/Common/VertexDecoderCommon.h" #include "GPU/Common/DrawEngineCommon.h" #include "GPU/Common/GPUStateUtils.h" -#include "GPU/D3D11/FragmentShaderGeneratorD3D11.h" +#include "GPU/Directx9/FragmentShaderGeneratorHLSL.h" #include "GPU/D3D11/StateMappingD3D11.h" #include "GPU/D3D11/D3D11Util.h" diff --git a/GPU/D3D11/FragmentShaderGeneratorD3D11.cpp b/GPU/D3D11/FragmentShaderGeneratorD3D11.cpp deleted file mode 100644 index d63a0c4b41..0000000000 --- a/GPU/D3D11/FragmentShaderGeneratorD3D11.cpp +++ /dev/null @@ -1,24 +0,0 @@ -// Copyright (c) 2017- PPSSPP Project. - -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 2.0 or later versions. - -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License 2.0 for more details. - -// A copy of the GPL 2.0 should have been included with the program. -// If not, see http://www.gnu.org/licenses/ - -// Official git repository and contact information can be found at -// https://github.com/hrydgard/ppsspp and http://www.ppsspp.org/. - -#include "GPU/Common/ShaderCommon.h" -#include "GPU/D3D11/FragmentShaderGeneratorD3D11.h" -#include "GPU/Directx9/PixelShaderGeneratorDX9.h" - -bool GenerateFragmentShaderD3D11(const FShaderID &id, char *buffer, ShaderLanguage lang) { - return DX9::GenerateFragmentShaderHLSL(id, buffer, lang); -} diff --git a/GPU/D3D11/FragmentShaderGeneratorD3D11.h b/GPU/D3D11/FragmentShaderGeneratorD3D11.h deleted file mode 100644 index 5e99cae958..0000000000 --- a/GPU/D3D11/FragmentShaderGeneratorD3D11.h +++ /dev/null @@ -1,22 +0,0 @@ -// Copyright (c) 2017- PPSSPP Project. - -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 2.0 or later versions. - -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License 2.0 for more details. - -// A copy of the GPL 2.0 should have been included with the program. -// If not, see http://www.gnu.org/licenses/ - -// Official git repository and contact information can be found at -// https://github.com/hrydgard/ppsspp and http://www.ppsspp.org/. - -#pragma once - -#include "GPU/Common/ShaderId.h" - -bool GenerateFragmentShaderD3D11(const FShaderID &id, char *buffer, ShaderLanguage lang); diff --git a/GPU/D3D11/ShaderManagerD3D11.cpp b/GPU/D3D11/ShaderManagerD3D11.cpp index 4678f4ae65..8a7ac1654c 100644 --- a/GPU/D3D11/ShaderManagerD3D11.cpp +++ b/GPU/D3D11/ShaderManagerD3D11.cpp @@ -35,8 +35,8 @@ #include "GPU/GPUState.h" #include "GPU/ge_constants.h" #include "GPU/D3D11/ShaderManagerD3D11.h" -#include "GPU/D3D11/FragmentShaderGeneratorD3D11.h" -#include "GPU/D3D11/VertexShaderGeneratorD3D11.h" +#include "GPU/Directx9/FragmentShaderGeneratorHLSL.h" +#include "GPU/Directx9/VertexShaderGeneratorHLSL.h" #include "GPU/D3D11/D3D11Util.h" D3D11FragmentShader::D3D11FragmentShader(ID3D11Device *device, D3D_FEATURE_LEVEL featureLevel, FShaderID id, const char *code, bool useHWTransform) @@ -208,7 +208,8 @@ void ShaderManagerD3D11::GetShaders(int prim, u32 vertType, D3D11VertexShader ** D3D11VertexShader *vs; if (vsIter == vsCache_.end()) { // Vertex shader not in cache. Let's compile it. - GenerateVertexShaderD3D11(VSID, codeBuffer_, featureLevel_ <= D3D_FEATURE_LEVEL_9_3 ? HLSL_D3D11_LEVEL9 : HLSL_D3D11); + std::string genErrorString; + GenerateVertexShaderHLSL(VSID, codeBuffer_, featureLevel_ <= D3D_FEATURE_LEVEL_9_3 ? HLSL_D3D11_LEVEL9 : HLSL_D3D11, &genErrorString); vs = new D3D11VertexShader(device_, featureLevel_, VSID, codeBuffer_, vertType, useHWTransform); vsCache_[VSID] = vs; } else { @@ -220,7 +221,8 @@ void ShaderManagerD3D11::GetShaders(int prim, u32 vertType, D3D11VertexShader ** D3D11FragmentShader *fs; if (fsIter == fsCache_.end()) { // Fragment shader not in cache. Let's compile it. - GenerateFragmentShaderD3D11(FSID, codeBuffer_, featureLevel_ <= D3D_FEATURE_LEVEL_9_3 ? HLSL_D3D11_LEVEL9 : HLSL_D3D11); + std::string genErrorString; + GenerateFragmentShaderHLSL(FSID, codeBuffer_, featureLevel_ <= D3D_FEATURE_LEVEL_9_3 ? HLSL_D3D11_LEVEL9 : HLSL_D3D11, &genErrorString); fs = new D3D11FragmentShader(device_, featureLevel_, FSID, codeBuffer_, useHWTransform); fsCache_[FSID] = fs; } else { diff --git a/GPU/D3D11/StencilBufferD3D11.cpp b/GPU/D3D11/StencilBufferD3D11.cpp index 4da469ae61..043cbd50d0 100644 --- a/GPU/D3D11/StencilBufferD3D11.cpp +++ b/GPU/D3D11/StencilBufferD3D11.cpp @@ -23,7 +23,7 @@ #include "Core/Reporting.h" #include "GPU/Common/StencilCommon.h" #include "GPU/D3D11/FramebufferManagerD3D11.h" -#include "GPU/D3D11/FragmentShaderGeneratorD3D11.h" +#include "GPU/Directx9/FragmentShaderGeneratorHLSL.h" #include "GPU/D3D11/ShaderManagerD3D11.h" #include "GPU/D3D11/TextureCacheD3D11.h" #include "GPU/D3D11/D3D11Util.h" diff --git a/GPU/D3D11/TextureCacheD3D11.cpp b/GPU/D3D11/TextureCacheD3D11.cpp index f7f7582ec3..a989cf353f 100644 --- a/GPU/D3D11/TextureCacheD3D11.cpp +++ b/GPU/D3D11/TextureCacheD3D11.cpp @@ -26,7 +26,6 @@ #include "GPU/ge_constants.h" #include "GPU/GPUState.h" #include "GPU/Common/GPUStateUtils.h" -#include "GPU/D3D11/FragmentShaderGeneratorD3D11.h" #include "GPU/D3D11/TextureCacheD3D11.h" #include "GPU/D3D11/FramebufferManagerD3D11.h" #include "GPU/D3D11/ShaderManagerD3D11.h" diff --git a/GPU/D3D11/VertexShaderGeneratorD3D11.cpp b/GPU/D3D11/VertexShaderGeneratorD3D11.cpp deleted file mode 100644 index 87c24e33f5..0000000000 --- a/GPU/D3D11/VertexShaderGeneratorD3D11.cpp +++ /dev/null @@ -1,24 +0,0 @@ -// Copyright (c) 2017- PPSSPP Project. - -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 2.0 or later versions. - -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License 2.0 for more details. - -// A copy of the GPL 2.0 should have been included with the program. -// If not, see http://www.gnu.org/licenses/ - -// Official git repository and contact information can be found at -// https://github.com/hrydgard/ppsspp and http://www.ppsspp.org/. - -#include "GPU/Common/ShaderCommon.h" -#include "GPU/D3D11/VertexShaderGeneratorD3D11.h" -#include "GPU/Directx9/VertexShaderGeneratorDX9.h" - -bool GenerateVertexShaderD3D11(const VShaderID &id, char *buffer, ShaderLanguage lang) { - return DX9::GenerateVertexShaderHLSL(id, buffer, lang); -} diff --git a/GPU/D3D11/VertexShaderGeneratorD3D11.h b/GPU/D3D11/VertexShaderGeneratorD3D11.h deleted file mode 100644 index d595a9e146..0000000000 --- a/GPU/D3D11/VertexShaderGeneratorD3D11.h +++ /dev/null @@ -1,22 +0,0 @@ -// Copyright (c) 2017- PPSSPP Project. - -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 2.0 or later versions. - -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License 2.0 for more details. - -// A copy of the GPL 2.0 should have been included with the program. -// If not, see http://www.gnu.org/licenses/ - -// Official git repository and contact information can be found at -// https://github.com/hrydgard/ppsspp and http://www.ppsspp.org/. - -#pragma once - -#include "GPU/Common/ShaderId.h" - -bool GenerateVertexShaderD3D11(const VShaderID &id, char *buffer, ShaderLanguage lang); diff --git a/GPU/Directx9/DrawEngineDX9.h b/GPU/Directx9/DrawEngineDX9.h index 3ddf99b79b..789ebe6209 100644 --- a/GPU/Directx9/DrawEngineDX9.h +++ b/GPU/Directx9/DrawEngineDX9.h @@ -26,7 +26,6 @@ #include "GPU/Common/VertexDecoderCommon.h" #include "GPU/Common/DrawEngineCommon.h" #include "GPU/Common/GPUStateUtils.h" -#include "GPU/Directx9/PixelShaderGeneratorDX9.h" struct DecVtxFormat; struct UVScale; diff --git a/GPU/Directx9/PixelShaderGeneratorDX9.cpp b/GPU/Directx9/FragmentShaderGeneratorHLSL.cpp similarity index 98% rename from GPU/Directx9/PixelShaderGeneratorDX9.cpp rename to GPU/Directx9/FragmentShaderGeneratorHLSL.cpp index 344f6c5542..9f5eb1fe7b 100644 --- a/GPU/Directx9/PixelShaderGeneratorDX9.cpp +++ b/GPU/Directx9/FragmentShaderGeneratorHLSL.cpp @@ -19,7 +19,7 @@ #include "Core/Reporting.h" #include "Core/Config.h" -#include "GPU/Directx9/PixelShaderGeneratorDX9.h" +#include "GPU/Directx9/FragmentShaderGeneratorHLSL.h" #include "GPU/ge_constants.h" #include "GPU/Common/GPUStateUtils.h" #include "GPU/GPUState.h" @@ -29,11 +29,9 @@ // #define DEBUG_SHADER -namespace DX9 { - // Missing: Z depth range // Also, logic ops etc, of course, as they are not supported in DX9. -bool GenerateFragmentShaderHLSL(const FShaderID &id, char *buffer, ShaderLanguage lang) { +bool GenerateFragmentShaderHLSL(const FShaderID &id, char *buffer, ShaderLanguage lang, std::string *errorString) { char *p = buffer; bool lmode = id.Bit(FS_BIT_LMODE); @@ -372,6 +370,10 @@ bool GenerateFragmentShaderHLSL(const FShaderID &id, char *buffer, ShaderLanguag case GE_SRCBLEND_FIXA: srcFactor = "u_blendFixA"; break; default: srcFactor = "u_blendFixA"; break; } + if (!strcmp(srcFactor, "ERROR")) { + *errorString = "Bad srcfactor in replace blend"; + return false; + } WRITE(p, " v.rgb = v.rgb * %s;\n", srcFactor); } @@ -379,8 +381,8 @@ bool GenerateFragmentShaderHLSL(const FShaderID &id, char *buffer, ShaderLanguag if ((lang == HLSL_D3D11 || lang == HLSL_D3D11_LEVEL9) && replaceBlend == REPLACE_BLEND_COPY_FBO) { WRITE(p, " float4 destColor = fboTex.Load(int3((int)In.pixelPos.x, (int)In.pixelPos.y, 0));\n"); - const char *srcFactor = "float3(1.0)"; - const char *dstFactor = "float3(0.0)"; + const char *srcFactor = nullptr; + const char *dstFactor = nullptr; switch (replaceBlendFuncA) { case GE_SRCBLEND_DSTCOLOR: srcFactor = "destColor.rgb"; break; @@ -408,7 +410,7 @@ bool GenerateFragmentShaderHLSL(const FShaderID &id, char *buffer, ShaderLanguag case GE_DSTBLEND_DOUBLEDSTALPHA: dstFactor = "destColor.aaa * 2.0"; break; case GE_DSTBLEND_DOUBLEINVDSTALPHA: dstFactor = "float3(1.0, 1.0, 1.0) - destColor.aaa * 2.0"; break; case GE_DSTBLEND_FIXB: dstFactor = "u_blendFixB"; break; - default: srcFactor = "u_blendFixB"; break; + default: dstFactor = "u_blendFixB"; break; } switch (replaceBlendEq) { @@ -430,6 +432,9 @@ bool GenerateFragmentShaderHLSL(const FShaderID &id, char *buffer, ShaderLanguag case GE_BLENDMODE_ABSDIFF: WRITE(p, " v.rgb = abs(v.rgb - destColor.rgb);\n"); break; + default: + *errorString = "Bad replace blend eq"; + return false; } } @@ -535,5 +540,3 @@ bool GenerateFragmentShaderHLSL(const FShaderID &id, char *buffer, ShaderLanguag WRITE(p, "}\n"); return true; } - -}; diff --git a/GPU/Directx9/PixelShaderGeneratorDX9.h b/GPU/Directx9/FragmentShaderGeneratorHLSL.h similarity index 95% rename from GPU/Directx9/PixelShaderGeneratorDX9.h rename to GPU/Directx9/FragmentShaderGeneratorHLSL.h index 15623439ff..5dcaa52e54 100644 --- a/GPU/Directx9/PixelShaderGeneratorDX9.h +++ b/GPU/Directx9/FragmentShaderGeneratorHLSL.h @@ -20,9 +20,7 @@ #include "GPU/Common/ShaderId.h" #include "GPU/Common/ShaderCommon.h" -namespace DX9 { - -bool GenerateFragmentShaderHLSL(const FShaderID &id, char *buffer, ShaderLanguage lang = HLSL_DX9); +bool GenerateFragmentShaderHLSL(const FShaderID &id, char *buffer, ShaderLanguage lang, std::string *errorString); #define CONST_PS_TEXENV 0 #define CONST_PS_ALPHACOLORREF 1 @@ -37,5 +35,3 @@ bool GenerateFragmentShaderHLSL(const FShaderID &id, char *buffer, ShaderLanguag // For stencil upload #define CONST_PS_STENCILVALUE 10 - -}; diff --git a/GPU/Directx9/ShaderManagerDX9.cpp b/GPU/Directx9/ShaderManagerDX9.cpp index 13d998c3d5..bce4de6770 100644 --- a/GPU/Directx9/ShaderManagerDX9.cpp +++ b/GPU/Directx9/ShaderManagerDX9.cpp @@ -584,15 +584,21 @@ VSShader *ShaderManagerDX9::ApplyShader(bool useHWTransform, bool useHWTessellat } VSCache::iterator vsIter = vsCache_.find(VSID); - VSShader *vs; + VSShader *vs = nullptr; if (vsIter == vsCache_.end()) { // Vertex shader not in cache. Let's compile it. - GenerateVertexShaderHLSL(VSID, codeBuffer_, HLSL_DX9); - vs = new VSShader(device_, VSID, codeBuffer_, useHWTransform); - - if (vs->Failed()) { + std::string genErrorString; + if (GenerateVertexShaderHLSL(VSID, codeBuffer_, HLSL_DX9, &genErrorString)) { + vs = new VSShader(device_, VSID, codeBuffer_, useHWTransform); + } + if (!vs || vs->Failed()) { auto gr = GetI18NCategory("Graphics"); - ERROR_LOG(G3D, "Shader compilation failed, falling back to software transform"); + if (!vs) { + // TODO: Report this? + ERROR_LOG(G3D, "Shader generation failed, falling back to software transform"); + } else { + ERROR_LOG(G3D, "Shader compilation failed, falling back to software transform"); + } if (!g_Config.bHideSlowWarnings) { host->NotifyUserMessage(gr->T("hardware transform error - falling back to software"), 2.5f, 0xFF3030FF); } @@ -605,7 +611,8 @@ VSShader *ShaderManagerDX9::ApplyShader(bool useHWTransform, bool useHWTessellat // next time and we'll do this over and over... // Can still work with software transform. - GenerateVertexShaderHLSL(VSID, codeBuffer_, HLSL_DX9); + bool success = GenerateVertexShaderHLSL(VSID, codeBuffer_, HLSL_DX9, &genErrorString); + _assert_(success); vs = new VSShader(device_, VSID, codeBuffer_, false); } @@ -619,7 +626,10 @@ VSShader *ShaderManagerDX9::ApplyShader(bool useHWTransform, bool useHWTessellat PSShader *fs; if (fsIter == fsCache_.end()) { // Fragment shader not in cache. Let's compile it. - GenerateFragmentShaderHLSL(FSID, codeBuffer_); + std::string errorString; + bool success = GenerateFragmentShaderHLSL(FSID, codeBuffer_, HLSL_DX9, &errorString); + // We're supposed to handle all possible cases. + _assert_(success); fs = new PSShader(device_, FSID, codeBuffer_); fsCache_[FSID] = fs; } else { diff --git a/GPU/Directx9/ShaderManagerDX9.h b/GPU/Directx9/ShaderManagerDX9.h index a71b95d2e5..706a627938 100644 --- a/GPU/Directx9/ShaderManagerDX9.h +++ b/GPU/Directx9/ShaderManagerDX9.h @@ -21,8 +21,8 @@ #include #include "Common/Common.h" -#include "GPU/Directx9/VertexShaderGeneratorDX9.h" -#include "GPU/Directx9/PixelShaderGeneratorDX9.h" +#include "GPU/Directx9/VertexShaderGeneratorHLSL.h" +#include "GPU/Directx9/FragmentShaderGeneratorHLSL.h" #include "GPU/Common/ShaderCommon.h" #include "GPU/Common/ShaderId.h" #include "Common/Math/lin/matrix4x4.h" diff --git a/GPU/Directx9/StateMappingDX9.cpp b/GPU/Directx9/StateMappingDX9.cpp index a3ae081396..cbe47ead46 100644 --- a/GPU/Directx9/StateMappingDX9.cpp +++ b/GPU/Directx9/StateMappingDX9.cpp @@ -31,7 +31,6 @@ #include "GPU/Directx9/ShaderManagerDX9.h" #include "GPU/Directx9/TextureCacheDX9.h" #include "GPU/Directx9/FramebufferManagerDX9.h" -#include "GPU/Directx9/PixelShaderGeneratorDX9.h" namespace DX9 { diff --git a/GPU/Directx9/StencilBufferDX9.cpp b/GPU/Directx9/StencilBufferDX9.cpp index d938e4339a..be617417f0 100644 --- a/GPU/Directx9/StencilBufferDX9.cpp +++ b/GPU/Directx9/StencilBufferDX9.cpp @@ -22,7 +22,6 @@ #include "Core/Reporting.h" #include "GPU/Common/StencilCommon.h" #include "GPU/Directx9/FramebufferManagerDX9.h" -#include "GPU/Directx9/PixelShaderGeneratorDX9.h" #include "GPU/Directx9/ShaderManagerDX9.h" #include "GPU/Directx9/TextureCacheDX9.h" diff --git a/GPU/Directx9/TextureCacheDX9.cpp b/GPU/Directx9/TextureCacheDX9.cpp index c867418a3f..f2373e0a6b 100644 --- a/GPU/Directx9/TextureCacheDX9.cpp +++ b/GPU/Directx9/TextureCacheDX9.cpp @@ -21,8 +21,8 @@ #include "Core/MemMap.h" #include "Core/Reporting.h" #include "GPU/ge_constants.h" + #include "GPU/GPUState.h" -#include "GPU/Directx9/PixelShaderGeneratorDX9.h" #include "GPU/Directx9/TextureCacheDX9.h" #include "GPU/Directx9/FramebufferManagerDX9.h" #include "GPU/Directx9/ShaderManagerDX9.h" diff --git a/GPU/Directx9/VertexShaderGeneratorDX9.h b/GPU/Directx9/VertexShaderGeneratorDX9.h deleted file mode 100644 index b27f4dedeb..0000000000 --- a/GPU/Directx9/VertexShaderGeneratorDX9.h +++ /dev/null @@ -1,60 +0,0 @@ -// Copyright (c) 2012- PPSSPP Project. - -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 2.0 or later versions. - -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License 2.0 for more details. - -// A copy of the GPL 2.0 should have been included with the program. -// If not, see http://www.gnu.org/licenses/ - -// Official git repository and contact information can be found at -// https://github.com/hrydgard/ppsspp and http://www.ppsspp.org/. - -#pragma once - -#include "GPU/Common/ShaderID.h" - -namespace DX9 { - - bool GenerateVertexShaderHLSL(const VShaderID &id, char *buffer, ShaderLanguage lang); - - enum { - CONST_VS_PROJ = 0, - CONST_VS_PROJ_THROUGH = 4, - CONST_VS_VIEW = 8, - CONST_VS_WORLD = 11, - CONST_VS_TEXMTX = 14, - CONST_VS_UVSCALEOFFSET = 17, - CONST_VS_FOGCOEF = 18, - CONST_VS_AMBIENT = 19, - CONST_VS_MATAMBIENTALPHA = 20, - CONST_VS_MATDIFFUSE = 21, - CONST_VS_MATSPECULAR = 22, - CONST_VS_MATEMISSIVE = 23, - CONST_VS_LIGHTPOS = 24, - CONST_VS_LIGHTDIR = 28, - CONST_VS_LIGHTATT = 32, - CONST_VS_LIGHTANGLE_SPOTCOEF = 36, - CONST_VS_LIGHTDIFFUSE = 40, - CONST_VS_LIGHTSPECULAR = 44, - CONST_VS_LIGHTAMBIENT = 48, - CONST_VS_DEPTHRANGE = 52, - CONST_VS_BONE0 = 53, - CONST_VS_BONE1 = 56, - CONST_VS_BONE2 = 59, - CONST_VS_BONE3 = 62, - CONST_VS_BONE4 = 65, - CONST_VS_BONE5 = 68, - CONST_VS_BONE6 = 71, - CONST_VS_BONE7 = 74, - CONST_VS_BONE8 = 77, - CONST_VS_CULLRANGEMIN = 80, - CONST_VS_CULLRANGEMAX = 81, - }; - -}; diff --git a/GPU/Directx9/VertexShaderGeneratorDX9.cpp b/GPU/Directx9/VertexShaderGeneratorHLSL.cpp similarity index 98% rename from GPU/Directx9/VertexShaderGeneratorDX9.cpp rename to GPU/Directx9/VertexShaderGeneratorHLSL.cpp index cdc3cdbff7..5af4e57ba6 100644 --- a/GPU/Directx9/VertexShaderGeneratorDX9.cpp +++ b/GPU/Directx9/VertexShaderGeneratorHLSL.cpp @@ -18,16 +18,12 @@ #include #include -#if defined(_WIN32) && defined(_DEBUG) -#include "Common/CommonWindows.h" -#endif - #include "Common/StringUtils.h" #include "GPU/ge_constants.h" #include "GPU/GPUState.h" #include "Core/Config.h" -#include "GPU/Directx9/VertexShaderGeneratorDX9.h" +#include "GPU/Directx9/VertexShaderGeneratorHLSL.h" #include "GPU/Common/VertexDecoderCommon.h" #include "GPU/Common/ShaderUniforms.h" @@ -35,8 +31,6 @@ #define WRITE p+=sprintf -namespace DX9 { - static const char * const boneWeightAttrDecl[9] = { "#ERROR#", "float a_w1:TEXCOORD1;\n", @@ -49,13 +43,7 @@ static const char * const boneWeightAttrDecl[9] = { "float4 a_w1:TEXCOORD1;\n float4 a_w2:TEXCOORD2;\n", }; -enum DoLightComputation { - LIGHT_OFF, - LIGHT_SHADE, - LIGHT_FULL, -}; - -void GenerateVertexShaderHLSL(const VShaderID &id, char *buffer, ShaderLanguage lang) { +bool GenerateVertexShaderHLSL(const VShaderID &id, char *buffer, ShaderLanguage lang, std::string *errorString) { char *p = buffer; bool isModeThrough = id.Bit(VS_BIT_IS_THROUGH); @@ -730,8 +718,9 @@ void GenerateVertexShaderHLSL(const VShaderID &id, char *buffer, ShaderLanguage break; default: - // ILLEGAL - break; + // Should be unreachable. + _assert_(false); + return false; } } @@ -756,6 +745,5 @@ void GenerateVertexShaderHLSL(const VShaderID &id, char *buffer, ShaderLanguage WRITE(p, " return Out;\n"); WRITE(p, "}\n"); + return true; } - -}; diff --git a/GPU/Directx9/VertexShaderGeneratorHLSL.h b/GPU/Directx9/VertexShaderGeneratorHLSL.h new file mode 100644 index 0000000000..08adab846c --- /dev/null +++ b/GPU/Directx9/VertexShaderGeneratorHLSL.h @@ -0,0 +1,57 @@ +// Copyright (c) 2012- PPSSPP Project. + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, version 2.0 or later versions. + +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License 2.0 for more details. + +// A copy of the GPL 2.0 should have been included with the program. +// If not, see http://www.gnu.org/licenses/ + +// Official git repository and contact information can be found at +// https://github.com/hrydgard/ppsspp and http://www.ppsspp.org/. + +#pragma once + +#include +#include "GPU/Common/ShaderID.h" + +bool GenerateVertexShaderHLSL(const VShaderID &id, char *buffer, ShaderLanguage lang, std::string *errorString); + +enum { + CONST_VS_PROJ = 0, + CONST_VS_PROJ_THROUGH = 4, + CONST_VS_VIEW = 8, + CONST_VS_WORLD = 11, + CONST_VS_TEXMTX = 14, + CONST_VS_UVSCALEOFFSET = 17, + CONST_VS_FOGCOEF = 18, + CONST_VS_AMBIENT = 19, + CONST_VS_MATAMBIENTALPHA = 20, + CONST_VS_MATDIFFUSE = 21, + CONST_VS_MATSPECULAR = 22, + CONST_VS_MATEMISSIVE = 23, + CONST_VS_LIGHTPOS = 24, + CONST_VS_LIGHTDIR = 28, + CONST_VS_LIGHTATT = 32, + CONST_VS_LIGHTANGLE_SPOTCOEF = 36, + CONST_VS_LIGHTDIFFUSE = 40, + CONST_VS_LIGHTSPECULAR = 44, + CONST_VS_LIGHTAMBIENT = 48, + CONST_VS_DEPTHRANGE = 52, + CONST_VS_BONE0 = 53, + CONST_VS_BONE1 = 56, + CONST_VS_BONE2 = 59, + CONST_VS_BONE3 = 62, + CONST_VS_BONE4 = 65, + CONST_VS_BONE5 = 68, + CONST_VS_BONE6 = 71, + CONST_VS_BONE7 = 74, + CONST_VS_BONE8 = 77, + CONST_VS_CULLRANGEMIN = 80, + CONST_VS_CULLRANGEMAX = 81, +}; diff --git a/GPU/GLES/FragmentShaderGeneratorGLES.cpp b/GPU/GLES/FragmentShaderGeneratorGLES.cpp index 82586c3ea6..f45f3ed407 100644 --- a/GPU/GLES/FragmentShaderGeneratorGLES.cpp +++ b/GPU/GLES/FragmentShaderGeneratorGLES.cpp @@ -36,7 +36,7 @@ // #define DEBUG_SHADER // Missing: Z depth range -bool GenerateFragmentShader(const FShaderID &id, char *buffer, uint64_t *uniformMask) { +bool GenerateFragmentShaderGLSL(const FShaderID &id, char *buffer, uint64_t *uniformMask, std::string *errorString) { char *p = buffer; *uniformMask = 0; @@ -768,7 +768,7 @@ bool GenerateFragmentShader(const FShaderID &id, char *buffer, uint64_t *uniform break; default: - ERROR_LOG(G3D, "Bad stencil-to-alpha type, corrupt ID?"); + *errorString = "Bad stencil-to-alpha type, corrupt ID?"; return false; } @@ -784,7 +784,7 @@ bool GenerateFragmentShader(const FShaderID &id, char *buffer, uint64_t *uniform break; default: - ERROR_LOG(G3D, "Bad logic op type, corrupt ID?"); + *errorString = "Bad logic op type, corrupt ID?"; return false; } diff --git a/GPU/GLES/FragmentShaderGeneratorGLES.h b/GPU/GLES/FragmentShaderGeneratorGLES.h index 1d190e5e96..6f0aa73b23 100644 --- a/GPU/GLES/FragmentShaderGeneratorGLES.h +++ b/GPU/GLES/FragmentShaderGeneratorGLES.h @@ -19,4 +19,4 @@ struct FShaderID; -bool GenerateFragmentShader(const FShaderID &id, char *buffer, uint64_t *uniformMask); +bool GenerateFragmentShaderGLSL(const FShaderID &id, char *buffer, uint64_t *uniformMask, std::string *errorString); diff --git a/GPU/GLES/ShaderManagerGLES.cpp b/GPU/GLES/ShaderManagerGLES.cpp index e4e3d4fda4..eda3294c0e 100644 --- a/GPU/GLES/ShaderManagerGLES.cpp +++ b/GPU/GLES/ShaderManagerGLES.cpp @@ -629,7 +629,9 @@ void ShaderManagerGLES::DirtyLastShader() { Shader *ShaderManagerGLES::CompileFragmentShader(FShaderID FSID) { uint64_t uniformMask; - if (!GenerateFragmentShader(FSID, codeBuffer_, &uniformMask)) { + std::string errorString; + if (!GenerateFragmentShaderGLSL(FSID, codeBuffer_, &uniformMask, &errorString)) { + ERROR_LOG(G3D, "Shader gen error: %s", errorString.c_str()); return nullptr; } std::string desc = FragmentShaderDesc(FSID); @@ -640,7 +642,11 @@ Shader *ShaderManagerGLES::CompileVertexShader(VShaderID VSID) { bool useHWTransform = VSID.Bit(VS_BIT_USE_HW_TRANSFORM); uint32_t attrMask; uint64_t uniformMask; - GenerateVertexShader(VSID, codeBuffer_, &attrMask, &uniformMask); + std::string errorString; + if (!GenerateVertexShaderGLSL(VSID, codeBuffer_, &attrMask, &uniformMask, &errorString)) { + ERROR_LOG(G3D, "Shader gen error: %s", errorString.c_str()); + return nullptr; + } std::string desc = VertexShaderDesc(VSID); return new Shader(render_, codeBuffer_, desc, GL_VERTEX_SHADER, useHWTransform, attrMask, uniformMask); } diff --git a/GPU/GLES/VertexShaderGeneratorGLES.cpp b/GPU/GLES/VertexShaderGeneratorGLES.cpp index e31354118f..c6b623e58d 100644 --- a/GPU/GLES/VertexShaderGeneratorGLES.cpp +++ b/GPU/GLES/VertexShaderGeneratorGLES.cpp @@ -21,10 +21,6 @@ #include "Common/GPU/OpenGL/GLFeatures.h" -#if defined(_WIN32) && defined(_DEBUG) -#include "Common/CommonWindows.h" -#endif - #include "Common/StringUtils.h" #include "GPU/ge_constants.h" #include "GPU/GPUState.h" @@ -33,7 +29,6 @@ #include "GPU/GLES/ShaderManagerGLES.h" #include "GPU/Common/ShaderId.h" #include "GPU/Common/VertexDecoderCommon.h" -#include "GPU/Common/VertexShaderGeneratorCommon.h" #undef WRITE @@ -92,8 +87,7 @@ static const char * const boneWeightInDecl[9] = { // TODO: Skip all this if we can actually get a 16-bit depth buffer along with stencil, which // is a bit of a rare configuration, although quite common on mobile. - -void GenerateVertexShader(const VShaderID &id, char *buffer, uint32_t *attrMask, uint64_t *uniformMask) { +bool GenerateVertexShaderGLSL(const VShaderID &id, char *buffer, uint32_t *attrMask, uint64_t *uniformMask, std::string *errorString) { char *p = buffer; *attrMask = 0; *uniformMask = 0; @@ -152,6 +146,7 @@ void GenerateVertexShader(const VShaderID &id, char *buffer, uint32_t *attrMask, WRITE(p, "#define mediump\n"); WRITE(p, "#define highp\n"); } + WRITE(p, "#define splat3(x) vec3(x)\n"); if (glslES30 || gl_extensions.IsCoreContext) { attribute = "in"; @@ -843,4 +838,5 @@ void GenerateVertexShader(const VShaderID &id, char *buffer, uint32_t *attrMask, WRITE(p, " gl_Position = outPos;\n"); WRITE(p, "}\n"); + return true; } diff --git a/GPU/GLES/VertexShaderGeneratorGLES.h b/GPU/GLES/VertexShaderGeneratorGLES.h index 7801b2cd6f..0260d694b5 100644 --- a/GPU/GLES/VertexShaderGeneratorGLES.h +++ b/GPU/GLES/VertexShaderGeneratorGLES.h @@ -23,4 +23,4 @@ struct VShaderID; -void GenerateVertexShader(const VShaderID &id, char *buffer, uint32_t *attrMask, uint64_t *uniformMask); +bool GenerateVertexShaderGLSL(const VShaderID &id, char *buffer, uint32_t *attrMask, uint64_t *uniformMask, std::string *errorString); diff --git a/GPU/GPU.vcxproj b/GPU/GPU.vcxproj index 5d3468b07d..4b0224feee 100644 --- a/GPU/GPU.vcxproj +++ b/GPU/GPU.vcxproj @@ -370,14 +370,12 @@ - - @@ -387,12 +385,12 @@ - + - + @@ -549,7 +547,6 @@ - @@ -557,7 +554,6 @@ - @@ -566,14 +562,14 @@ - + - + diff --git a/GPU/GPU.vcxproj.filters b/GPU/GPU.vcxproj.filters index 04ac5cae2d..cabdce9c90 100644 --- a/GPU/GPU.vcxproj.filters +++ b/GPU/GPU.vcxproj.filters @@ -66,9 +66,6 @@ DirectX9 - - DirectX9 - DirectX9 @@ -81,9 +78,6 @@ DirectX9 - - DirectX9 - Common @@ -219,12 +213,6 @@ D3D11 - - D3D11 - - - D3D11 - D3D11 @@ -288,6 +276,12 @@ Common + + DirectX9 + + + DirectX9 + @@ -326,9 +320,6 @@ DirectX9 - - DirectX9 - DirectX9 @@ -341,9 +332,6 @@ DirectX9 - - DirectX9 - DirectX9 @@ -494,12 +482,6 @@ D3D11 - - D3D11 - - - D3D11 - D3D11 @@ -575,5 +557,11 @@ Common + + DirectX9 + + + DirectX9 + \ No newline at end of file diff --git a/GPU/Vulkan/FragmentShaderGeneratorVulkan.cpp b/GPU/Vulkan/FragmentShaderGeneratorVulkan.cpp index 78e2592be3..5bbc257173 100644 --- a/GPU/Vulkan/FragmentShaderGeneratorVulkan.cpp +++ b/GPU/Vulkan/FragmentShaderGeneratorVulkan.cpp @@ -43,8 +43,7 @@ static const char *vulkan_glsl_preamble = #define WRITE p+=sprintf -// Missing: Z depth range -bool GenerateVulkanGLSLFragmentShader(const FShaderID &id, char *buffer, uint32_t vulkanVendorId) { +bool GenerateFragmentShaderVulkanGLSL(const FShaderID &id, char *buffer, uint32_t vulkanVendorId, std::string *errorString) { char *p = buffer; const char *lastFragData = nullptr; @@ -434,6 +433,11 @@ bool GenerateVulkanGLSLFragmentShader(const FShaderID &id, char *buffer, uint32_ case GE_SRCBLEND_FIXA: srcFactor = "u_blendFixA"; break; } + if (!strcmp(srcFactor, "ERROR")) { + *errorString = "Bad replaceblend src factor"; + return false; + } + WRITE(p, " v.rgb = v.rgb * %s;\n", srcFactor); } @@ -550,7 +554,7 @@ bool GenerateVulkanGLSLFragmentShader(const FShaderID &id, char *buffer, uint32_ break; default: - ERROR_LOG(G3D, "Bad stencil-to-alpha type, corrupt ID?"); + *errorString = "Bad stencil-to-alpha type, corrupt ID?"; return false; } @@ -566,7 +570,7 @@ bool GenerateVulkanGLSLFragmentShader(const FShaderID &id, char *buffer, uint32_ break; default: - ERROR_LOG(G3D, "Bad logic op type, corrupt ID?"); + *errorString = "Bad logic op type, corrupt ID?"; return false; } diff --git a/GPU/Vulkan/FragmentShaderGeneratorVulkan.h b/GPU/Vulkan/FragmentShaderGeneratorVulkan.h index 7fb02edc62..a3c64828e9 100644 --- a/GPU/Vulkan/FragmentShaderGeneratorVulkan.h +++ b/GPU/Vulkan/FragmentShaderGeneratorVulkan.h @@ -20,4 +20,4 @@ struct FShaderID; -bool GenerateVulkanGLSLFragmentShader(const FShaderID &id, char *buffer, uint32_t vulkanVendorId); +bool GenerateFragmentShaderVulkanGLSL(const FShaderID &id, char *buffer, uint32_t vulkanVendorId, std::string *errorString); diff --git a/GPU/Vulkan/ShaderManagerVulkan.cpp b/GPU/Vulkan/ShaderManagerVulkan.cpp index 1dff1d8ce0..dff7f01d64 100644 --- a/GPU/Vulkan/ShaderManagerVulkan.cpp +++ b/GPU/Vulkan/ShaderManagerVulkan.cpp @@ -262,7 +262,8 @@ void ShaderManagerVulkan::GetShaders(int prim, u32 vertType, VulkanVertexShader VulkanVertexShader *vs = vsCache_.Get(VSID); if (!vs) { // Vertex shader not in cache. Let's compile it. - GenerateVulkanGLSLVertexShader(VSID, codeBuffer_); + std::string genErrorString; + GenerateVertexShaderVulkanGLSL(VSID, codeBuffer_, &genErrorString); vs = new VulkanVertexShader(vulkan_, VSID, codeBuffer_, useHWTransform); vsCache_.Insert(VSID, vs); } @@ -272,7 +273,9 @@ void ShaderManagerVulkan::GetShaders(int prim, u32 vertType, VulkanVertexShader if (!fs) { uint32_t vendorID = vulkan_->GetPhysicalDeviceProperties().properties.vendorID; // Fragment shader not in cache. Let's compile it. - GenerateVulkanGLSLFragmentShader(FSID, codeBuffer_, vendorID); + std::string genErrorString; + bool success = GenerateFragmentShaderVulkanGLSL(FSID, codeBuffer_, vendorID, &genErrorString); + _assert_(success); fs = new VulkanFragmentShader(vulkan_, FSID, codeBuffer_); fsCache_.Insert(FSID, fs); } @@ -388,7 +391,10 @@ bool ShaderManagerVulkan::LoadCache(FILE *f) { break; } bool useHWTransform = id.Bit(VS_BIT_USE_HW_TRANSFORM); - GenerateVulkanGLSLVertexShader(id, codeBuffer_); + std::string genErrorString; + if (!GenerateVertexShaderVulkanGLSL(id, codeBuffer_, &genErrorString)) { + return false; + } VulkanVertexShader *vs = new VulkanVertexShader(vulkan_, id, codeBuffer_, useHWTransform); vsCache_.Insert(id, vs); } @@ -399,7 +405,10 @@ bool ShaderManagerVulkan::LoadCache(FILE *f) { ERROR_LOG(G3D, "Vulkan shader cache truncated"); break; } - GenerateVulkanGLSLFragmentShader(id, codeBuffer_, vendorID); + std::string genErrorString; + if (!GenerateFragmentShaderVulkanGLSL(id, codeBuffer_, vendorID, &genErrorString)) { + return false; + } VulkanFragmentShader *fs = new VulkanFragmentShader(vulkan_, id, codeBuffer_); fsCache_.Insert(id, fs); } diff --git a/GPU/Vulkan/VertexShaderGeneratorVulkan.cpp b/GPU/Vulkan/VertexShaderGeneratorVulkan.cpp index ee5a350223..f18ea66729 100644 --- a/GPU/Vulkan/VertexShaderGeneratorVulkan.cpp +++ b/GPU/Vulkan/VertexShaderGeneratorVulkan.cpp @@ -39,7 +39,8 @@ static const char *vulkan_glsl_preamble = "#version 450\n" "#extension GL_ARB_separate_shader_objects : enable\n" -"#extension GL_ARB_shading_language_420pack : enable\n\n"; +"#extension GL_ARB_shading_language_420pack : enable\n" +"#define splat3(x) vec3(x)\n\n"; // "Varying" layout - must match fragment shader // color0 = 0 @@ -63,12 +64,6 @@ static const char * const boneWeightDecl[9] = { "layout(location = 3) in vec4 w1;\nlayout(location = 4) in vec4 w2;\n", }; -enum DoLightComputation { - LIGHT_OFF, - LIGHT_SHADE, - LIGHT_FULL, -}; - // Depth range and viewport // // After the multiplication with the projection matrix, we have a 4D vector in clip space. @@ -94,7 +89,7 @@ enum DoLightComputation { // TODO: Skip all this if we can actually get a 16-bit depth buffer along with stencil, which // is a bit of a rare configuration, although quite common on mobile. -bool GenerateVulkanGLSLVertexShader(const VShaderID &id, char *buffer) { +bool GenerateVertexShaderVulkanGLSL(const VShaderID &id, char *buffer, std::string *errorString) { char *p = buffer; WRITE(p, "%s", vulkan_glsl_preamble); diff --git a/GPU/Vulkan/VertexShaderGeneratorVulkan.h b/GPU/Vulkan/VertexShaderGeneratorVulkan.h index 1501c1cdae..51f2b56d55 100644 --- a/GPU/Vulkan/VertexShaderGeneratorVulkan.h +++ b/GPU/Vulkan/VertexShaderGeneratorVulkan.h @@ -2,4 +2,4 @@ #include "GPU/Common/ShaderId.h" -bool GenerateVulkanGLSLVertexShader(const VShaderID &id, char *buffer); +bool GenerateVertexShaderVulkanGLSL(const VShaderID &id, char *buffer, std::string *errorString); diff --git a/UWP/GPU_UWP/GPU_UWP.vcxproj b/UWP/GPU_UWP/GPU_UWP.vcxproj index be5fdc1a1f..6b735f6a38 100644 --- a/UWP/GPU_UWP/GPU_UWP.vcxproj +++ b/UWP/GPU_UWP/GPU_UWP.vcxproj @@ -404,22 +404,20 @@ - - - - + + @@ -466,7 +464,6 @@ - @@ -474,14 +471,13 @@ - - - + + diff --git a/UWP/GPU_UWP/GPU_UWP.vcxproj.filters b/UWP/GPU_UWP/GPU_UWP.vcxproj.filters index 261335da46..1a11e78ecd 100644 --- a/UWP/GPU_UWP/GPU_UWP.vcxproj.filters +++ b/UWP/GPU_UWP/GPU_UWP.vcxproj.filters @@ -29,7 +29,6 @@ - @@ -37,14 +36,13 @@ - - - + + @@ -86,22 +84,20 @@ - - - - + + diff --git a/libretro/Makefile.common b/libretro/Makefile.common index 0c03333b9d..11b8998bd6 100644 --- a/libretro/Makefile.common +++ b/libretro/Makefile.common @@ -526,7 +526,7 @@ ifeq ($(WITH_DYNAREC),1) $(COREDIR)/MIPS/ARM/ArmJit.cpp \ $(COREDIR)/MIPS/ARM/ArmRegCache.cpp \ $(COREDIR)/MIPS/ARM/ArmRegCacheFPU.cpp \ - $(EXTDIR)/disarm.cpp \ + $(EXTDIR)/disarm.cpp \ $(GPUCOMMONDIR)/VertexDecoderArm.cpp ifeq ($(HAVE_NEON),1) @@ -663,7 +663,7 @@ ifeq ($(PLATFORM_EXT), win32) SOURCES_CXX += \ $(GPUDIR)/Directx9/DepalettizeShaderDX9.cpp \ $(GPUDIR)/Directx9/DrawEngineDX9.cpp \ - $(GPUDIR)/Directx9/PixelShaderGeneratorDX9.cpp \ + $(GPUDIR)/Directx9/FragmentShaderGeneratorHLSL.cpp \ $(GPUDIR)/Directx9/FramebufferManagerDX9.cpp \ $(GPUDIR)/Directx9/GPU_DX9.cpp \ $(GPUDIR)/Directx9/ShaderManagerDX9.cpp \ @@ -671,12 +671,11 @@ SOURCES_CXX += \ $(GPUDIR)/Directx9/StencilBufferDX9.cpp \ $(GPUDIR)/Directx9/TextureCacheDX9.cpp \ $(GPUDIR)/Directx9/TextureScalerDX9.cpp \ - $(GPUDIR)/Directx9/VertexShaderGeneratorDX9.cpp + $(GPUDIR)/Directx9/VertexShaderGeneratorHLSL.cpp SOURCES_CXX += \ $(GPUDIR)/D3D11/DepalettizeShaderD3D11.cpp \ $(GPUDIR)/D3D11/DrawEngineD3D11.cpp \ - $(GPUDIR)/D3D11/FragmentShaderGeneratorD3D11.cpp \ $(GPUDIR)/D3D11/FramebufferManagerD3D11.cpp \ $(GPUDIR)/D3D11/GPU_D3D11.cpp \ $(GPUDIR)/D3D11/D3D11Util.cpp \ @@ -685,7 +684,6 @@ SOURCES_CXX += \ $(GPUDIR)/D3D11/StencilBufferD3D11.cpp \ $(GPUDIR)/D3D11/TextureCacheD3D11.cpp \ $(GPUDIR)/D3D11/TextureScalerD3D11.cpp \ - $(GPUDIR)/D3D11/VertexShaderGeneratorD3D11.cpp \ $(LIBRETRODIR)/LibretroD3D11Context.cpp SOURCES_CXX += \ diff --git a/unittest/TestShaderGenerators.cpp b/unittest/TestShaderGenerators.cpp index a045bd1359..e295ffd91d 100644 --- a/unittest/TestShaderGenerators.cpp +++ b/unittest/TestShaderGenerators.cpp @@ -7,13 +7,11 @@ #include "GPU/Vulkan/VulkanContext.h" #include "GPU/Vulkan/FragmentShaderGeneratorVulkan.h" -#include "GPU/D3D11/FragmentShaderGeneratorD3D11.h" -#include "GPU/Directx9/PixelShaderGeneratorDX9.h" +#include "GPU/Directx9/FragmentShaderGeneratorHLSL.h" #include "GPU/GLES/FragmentShaderGeneratorGLES.h" #include "GPU/Vulkan/VertexShaderGeneratorVulkan.h" -#include "GPU/D3D11/VertexShaderGeneratorD3D11.h" -#include "GPU/Directx9/VertexShaderGeneratorDX9.h" +#include "GPU/Directx9/VertexShaderGeneratorHLSL.h" #include "GPU/GLES/VertexShaderGeneratorGLES.h" #include "GPU/D3D11/D3D11Util.h" @@ -22,16 +20,16 @@ #include "GPU/D3D9/D3DCompilerLoader.h" #include "GPU/D3D9/D3D9ShaderCompiler.h" -bool GenerateFShader(FShaderID id, char *buffer, ShaderLanguage lang) { +bool GenerateFShader(FShaderID id, char *buffer, ShaderLanguage lang, std::string *errorString) { switch (lang) { case ShaderLanguage::HLSL_D3D11: - return GenerateFragmentShaderD3D11(id, buffer, ShaderLanguage::HLSL_D3D11); + return GenerateFragmentShaderHLSL(id, buffer, ShaderLanguage::HLSL_D3D11, errorString); case ShaderLanguage::HLSL_DX9: - DX9::GenerateFragmentShaderHLSL(id, buffer, ShaderLanguage::HLSL_DX9); + GenerateFragmentShaderHLSL(id, buffer, ShaderLanguage::HLSL_DX9, errorString); // TODO: Need a device :( Returning false here so it doesn't get tried. return false; case ShaderLanguage::GLSL_VULKAN: - return GenerateVulkanGLSLFragmentShader(id, buffer, 0); + return GenerateFragmentShaderVulkanGLSL(id, buffer, 0, errorString); case ShaderLanguage::GLSL_140: case ShaderLanguage::GLSL_300: // TODO: Need a device - except that maybe glslang could be used to verify these .... @@ -41,17 +39,17 @@ bool GenerateFShader(FShaderID id, char *buffer, ShaderLanguage lang) { } } -bool GenerateVShader(VShaderID id, char *buffer, ShaderLanguage lang) { +bool GenerateVShader(VShaderID id, char *buffer, ShaderLanguage lang, std::string *errorString) { switch (lang) { case ShaderLanguage::HLSL_D3D11: - return GenerateVertexShaderD3D11(id, buffer, ShaderLanguage::HLSL_D3D11); + return GenerateVertexShaderHLSL(id, buffer, ShaderLanguage::HLSL_D3D11, errorString); case ShaderLanguage::HLSL_DX9: - DX9::GenerateVertexShaderHLSL(id, buffer, ShaderLanguage::HLSL_DX9); + GenerateVertexShaderHLSL(id, buffer, ShaderLanguage::HLSL_DX9, errorString); // TODO: Need a device :( Returning false here so it doesn't get tried. return false; // return DX9::GenerateFragmentShaderHLSL(id, buffer, ShaderLanguage::HLSL_DX9); case ShaderLanguage::GLSL_VULKAN: - return GenerateVulkanGLSLVertexShader(id, buffer); + return GenerateVertexShaderVulkanGLSL(id, buffer, errorString); default: return false; } @@ -106,11 +104,12 @@ bool TestShaderGenerators() { for (int i = 0; i < numLanguages; i++) { buffer[i] = new char[65536]; } - // Generate a bunch of random fragment shader IDs, try to generate shader source. - // Then compile it and check that it's ok. GMRng rng; int successes = 0; int count = 200; + + // Generate a bunch of random fragment shader IDs, try to generate shader source. + // Then compile it and check that it's ok. for (int i = 0; i < count; i++) { uint32_t bottom = rng.R32(); uint32_t top = rng.R32(); @@ -121,9 +120,14 @@ bool TestShaderGenerators() { bool generateSuccess[numLanguages]{}; for (int j = 0; j < numLanguages; j++) { - generateSuccess[j] = GenerateFShader(id, buffer[j], languages[j]); + std::string genErrorString; + generateSuccess[j] = GenerateFShader(id, buffer[j], languages[j], &genErrorString); + if (!genErrorString.empty()) { + printf("%s\n", genErrorString.c_str()); + } + // We ignore the contents of the error string here, not even gonna try to compile if it errors. } - + // Now that we have the strings ready for easy comparison (buffer,4 in the watch window), // let's try to compile them. for (int j = 0; j < numLanguages; j++) { @@ -139,7 +143,11 @@ bool TestShaderGenerators() { printf("%d/%d fragment shaders generated (it's normal that it's not all, there are invalid bit combos)\n", successes, count * numLanguages); - // Now try vertex shaders. + successes = 0; + count = 200; + + // Generate a bunch of random vertex shader IDs, try to generate shader source. + // Then compile it and check that it's ok. for (int i = 0; i < count; i++) { uint32_t bottom = rng.R32(); uint32_t top = rng.R32(); @@ -147,10 +155,18 @@ bool TestShaderGenerators() { id.d[0] = bottom; id.d[1] = top; + // Skip testing beziers for now. I'll deal with those bugs later. + id.SetBit(VS_BIT_BEZIER, false); + id.SetBit(VS_BIT_SPLINE, false); + bool generateSuccess[numLanguages]{}; for (int j = 0; j < numLanguages; j++) { - generateSuccess[j] = GenerateVShader(id, buffer[j], languages[j]); + std::string genErrorString; + generateSuccess[j] = GenerateVShader(id, buffer[j], languages[j], &genErrorString); + if (!genErrorString.empty()) { + printf("%s\n", genErrorString.c_str()); + } } // Now that we have the strings ready for easy comparison (buffer,4 in the watch window), @@ -166,6 +182,11 @@ bool TestShaderGenerators() { } } + printf("%d/%d vertex shaders generated (it's normal that it's not all, there are invalid bit combos)\n", successes, count * numLanguages); + + successes = 0; + count = 200; + for (int i = 0; i < numLanguages; i++) { delete[] buffer[i]; } From 2c0a3c2e236dd77bbf4d8f8f372db2ae720053e4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Wed, 21 Oct 2020 23:39:34 +0200 Subject: [PATCH 068/275] Prepare for more GLSL testing --- GPU/Common/ShaderCommon.h | 12 ++ GPU/Directx9/FragmentShaderGeneratorHLSL.cpp | 33 +++-- GPU/Directx9/VertexShaderGeneratorHLSL.cpp | 6 + GPU/GLES/FragmentShaderGeneratorGLES.cpp | 139 +++++++++---------- GPU/GLES/VertexShaderGeneratorGLES.cpp | 69 ++++----- 5 files changed, 142 insertions(+), 117 deletions(-) diff --git a/GPU/Common/ShaderCommon.h b/GPU/Common/ShaderCommon.h index dd947db283..a2a2823245 100644 --- a/GPU/Common/ShaderCommon.h +++ b/GPU/Common/ShaderCommon.h @@ -137,3 +137,15 @@ enum DoLightComputation { LIGHT_SHADE, LIGHT_FULL, }; + +struct GLSLShaderCompat { + const char *varying; + const char *attribute; + const char *fragColor0; + const char *fragColor1; + const char *texture; + const char *texelFetch; + const char *lastFragData; + bool glslES30; + bool bitwiseOps; +}; diff --git a/GPU/Directx9/FragmentShaderGeneratorHLSL.cpp b/GPU/Directx9/FragmentShaderGeneratorHLSL.cpp index 9f5eb1fe7b..4cbe2c50ff 100644 --- a/GPU/Directx9/FragmentShaderGeneratorHLSL.cpp +++ b/GPU/Directx9/FragmentShaderGeneratorHLSL.cpp @@ -66,6 +66,21 @@ bool GenerateFragmentShaderHLSL(const FShaderID &id, char *buffer, ShaderLanguag StencilValueType replaceAlphaWithStencilType = (StencilValueType)id.Bits(FS_BIT_REPLACE_ALPHA_WITH_STENCIL_TYPE, 4); + // Output some compatibility defines + switch (lang) { + case ShaderLanguage::HLSL_DX9: + WRITE(p, "#define DISCARD clip(-1)\n"); + break; + case ShaderLanguage::HLSL_D3D11: + case ShaderLanguage::HLSL_D3D11_LEVEL9: + WRITE(p, "#define DISCARD discard\n"); + break; + } + WRITE(p, "#define vec2 float2\n"); + WRITE(p, "#define vec3 float3\n"); + WRITE(p, "#define vec4 float4\n"); + WRITE(p, "#define splat3(x) float3(x, x, x)\n"); + if (lang == HLSL_DX9) { if (doTexture) WRITE(p, "sampler tex : register(s0);\n"); @@ -288,7 +303,7 @@ bool GenerateFragmentShaderHLSL(const FShaderID &id, char *buffer, ShaderLanguag } else { // NEVER has been logged as used by games, although it makes little sense - statically failing. // Maybe we could discard the drawcall, but it's pretty rare. Let's just statically discard here. - WRITE(p, " clip(-1);\n"); + WRITE(p, " DISCARD;\n"); } } else { const char *alphaTestFuncs[] = { "#", "#", " != ", " == ", " >= ", " > ", " <= ", " < " }; // never/always don't make sense @@ -298,11 +313,11 @@ bool GenerateFragmentShaderHLSL(const FShaderID &id, char *buffer, ShaderLanguag WRITE(p, " if ((roundAndScaleTo255i(v.a) & u_alphacolormask.a) %s u_alphacolorref.a) discard;\n", alphaTestFuncs[alphaTestFunc]); } else { // TODO: Use a texture to lookup bitwise ops? - WRITE(p, " if (roundAndScaleTo255f(v.a) %s u_alphacolorref.a) clip(-1);\n", alphaTestFuncs[alphaTestFunc]); + WRITE(p, " if (roundAndScaleTo255f(v.a) %s u_alphacolorref.a) DISCARD;\n", alphaTestFuncs[alphaTestFunc]); } } else { // This means NEVER. See above. - WRITE(p, lang == HLSL_DX9 ? " clip(-1);\n" : " discard;\n"); + WRITE(p, " DISCARD;\n"); } } } @@ -317,14 +332,14 @@ bool GenerateFragmentShaderHLSL(const FShaderID &id, char *buffer, ShaderLanguag // When testing against 0 (common), we can avoid some math. // 0.002 is approximately half of 1.0 / 255.0. if (colorTestFunc == GE_COMP_NOTEQUAL) { - WRITE(p, " if (v.r < 0.002 && v.g < 0.002 && v.b < 0.002) clip(-1);\n"); + WRITE(p, " if (v.r < 0.002 && v.g < 0.002 && v.b < 0.002) DISCARD;\n"); } else if (colorTestFunc != GE_COMP_NEVER) { // Anything else is a test for == 0. - WRITE(p, " if (v.r > 0.002 || v.g > 0.002 || v.b > 0.002) clip(-1);\n"); + WRITE(p, " if (v.r > 0.002 || v.g > 0.002 || v.b > 0.002) DISCARD;\n"); } else { // NEVER has been logged as used by games, although it makes little sense - statically failing. // Maybe we could discard the drawcall, but it's pretty rare. Let's just statically discard here. - WRITE(p, lang == HLSL_DX9 ? " clip(-1);\n" : " discard;\n"); + WRITE(p, " DISCARD;\n"); } } else { const char *colorTestFuncs[] = { "#", "#", " != ", " == " }; // never/always don't make sense @@ -335,15 +350,15 @@ bool GenerateFragmentShaderHLSL(const FShaderID &id, char *buffer, ShaderLanguag WRITE(p, " uint3 v_masked = v_scaled & u_alphacolormask.rgb;\n"); WRITE(p, " uint3 colorTestRef = u_alphacolorref.rgb & u_alphacolormask.rgb;\n"); // We have to test the components separately, or we get incorrect results. See #10629. - WRITE(p, " if (v_masked.r %s colorTestRef.r && v_masked.g %s colorTestRef.g && v_masked.b %s colorTestRef.b) discard;\n", test, test, test); + WRITE(p, " if (v_masked.r %s colorTestRef.r && v_masked.g %s colorTestRef.g && v_masked.b %s colorTestRef.b) DISCARD;\n", test, test, test); } else { // TODO: Use a texture to lookup bitwise ops instead? WRITE(p, " float3 colortest = roundAndScaleTo255v(v.rgb);\n"); - WRITE(p, " if ((colortest.r %s u_alphacolorref.r) && (colortest.g %s u_alphacolorref.g) && (colortest.b %s u_alphacolorref.b)) clip(-1);\n", test, test, test); + WRITE(p, " if ((colortest.r %s u_alphacolorref.r) && (colortest.g %s u_alphacolorref.g) && (colortest.b %s u_alphacolorref.b)) DISCARD;\n", test, test, test); } } else { - WRITE(p, lang == HLSL_DX9 ? " clip(-1);\n" : " discard;\n"); + WRITE(p, " DISCARD;\n"); } } } diff --git a/GPU/Directx9/VertexShaderGeneratorHLSL.cpp b/GPU/Directx9/VertexShaderGeneratorHLSL.cpp index 5af4e57ba6..c8b87305cb 100644 --- a/GPU/Directx9/VertexShaderGeneratorHLSL.cpp +++ b/GPU/Directx9/VertexShaderGeneratorHLSL.cpp @@ -95,6 +95,12 @@ bool GenerateVertexShaderHLSL(const VShaderID &id, char *buffer, ShaderLanguage numBoneWeights = 1 + id.Bits(VS_BIT_BONES, 3); } + // Output some compatibility defines + WRITE(p, "#define vec2 float2\n"); + WRITE(p, "#define vec3 float3\n"); + WRITE(p, "#define vec4 float4\n"); + WRITE(p, "#define splat3(x) float3(x, x, x)\n"); + if (lang == HLSL_DX9) { WRITE(p, "#pragma warning( disable : 3571 )\n"); if (isModeThrough) { diff --git a/GPU/GLES/FragmentShaderGeneratorGLES.cpp b/GPU/GLES/FragmentShaderGeneratorGLES.cpp index f45f3ed407..66365bff31 100644 --- a/GPU/GLES/FragmentShaderGeneratorGLES.cpp +++ b/GPU/GLES/FragmentShaderGeneratorGLES.cpp @@ -42,16 +42,16 @@ bool GenerateFragmentShaderGLSL(const FShaderID &id, char *buffer, uint64_t *uni *uniformMask = 0; // In GLSL ES 3.0, you use "in" variables instead of varying. - bool glslES30 = false; - const char *varying = "varying"; - const char *fragColor0 = "gl_FragColor"; - const char *fragColor1 = "fragColor1"; - const char *texture = "texture2D"; - const char *texelFetch = NULL; + GLSLShaderCompat compat{}; + compat.varying = "varying"; + compat.fragColor0 = "gl_FragColor"; + compat.fragColor1 = "fragColor1"; + compat.texture = "texture2D"; + compat.texelFetch = NULL; + compat.bitwiseOps = false; + compat.lastFragData = nullptr; bool highpFog = false; bool highpTexcoord = false; - bool bitwiseOps = false; - const char *lastFragData = nullptr; ReplaceAlphaType stencilToAlpha = static_cast(id.Bits(FS_BIT_STENCIL_TO_ALPHA, 2)); @@ -59,11 +59,11 @@ bool GenerateFragmentShaderGLSL(const FShaderID &id, char *buffer, uint64_t *uni // ES doesn't support dual source alpha :( if (gstate_c.Supports(GPU_SUPPORTS_GLSL_ES_300)) { WRITE(p, "#version 300 es\n"); // GLSL ES 3.0 - fragColor0 = "fragColor0"; - texture = "texture"; - glslES30 = true; - bitwiseOps = true; - texelFetch = "texelFetch"; + compat.fragColor0 = "fragColor0"; + compat.texture = "texture"; + compat.glslES30 = true; + compat.bitwiseOps = true; + compat.texelFetch = "texelFetch"; if (stencilToAlpha == REPLACE_ALPHA_DUALSOURCE && gl_extensions.EXT_blend_func_extended) { WRITE(p, "#extension GL_EXT_blend_func_extended : require\n"); @@ -72,12 +72,12 @@ bool GenerateFragmentShaderGLSL(const FShaderID &id, char *buffer, uint64_t *uni WRITE(p, "#version 100\n"); // GLSL ES 1.0 if (gl_extensions.EXT_gpu_shader4) { WRITE(p, "#extension GL_EXT_gpu_shader4 : enable\n"); - bitwiseOps = true; - texelFetch = "texelFetch2D"; + compat.bitwiseOps = true; + compat.texelFetch = "texelFetch2D"; } if (gl_extensions.EXT_blend_func_extended) { // Oldy moldy GLES, so use the fixed output name. - fragColor1 = "gl_SecondaryFragColorEXT"; + compat.fragColor1 = "gl_SecondaryFragColorEXT"; if (stencilToAlpha == REPLACE_ALPHA_DUALSOURCE && gl_extensions.EXT_blend_func_extended) { WRITE(p, "#extension GL_EXT_blend_func_extended : require\n"); @@ -93,17 +93,17 @@ bool GenerateFragmentShaderGLSL(const FShaderID &id, char *buffer, uint64_t *uni if (gstate_c.Supports(GPU_SUPPORTS_ANY_FRAMEBUFFER_FETCH)) { if (gstate_c.Supports(GPU_SUPPORTS_GLSL_ES_300) && gl_extensions.EXT_shader_framebuffer_fetch) { WRITE(p, "#extension GL_EXT_shader_framebuffer_fetch : require\n"); - lastFragData = "fragColor0"; + compat.lastFragData = "fragColor0"; } else if (gl_extensions.EXT_shader_framebuffer_fetch) { WRITE(p, "#extension GL_EXT_shader_framebuffer_fetch : require\n"); - lastFragData = "gl_LastFragData[0]"; + compat.lastFragData = "gl_LastFragData[0]"; } else if (gl_extensions.NV_shader_framebuffer_fetch) { // GL_NV_shader_framebuffer_fetch is available on mobile platform and ES 2.0 only but not on desktop. WRITE(p, "#extension GL_NV_shader_framebuffer_fetch : require\n"); - lastFragData = "gl_LastFragData[0]"; + compat.lastFragData = "gl_LastFragData[0]"; } else if (gl_extensions.ARM_shader_framebuffer_fetch) { WRITE(p, "#extension GL_ARM_shader_framebuffer_fetch : require\n"); - lastFragData = "gl_LastFragColorARM"; + compat.lastFragData = "gl_LastFragColorARM"; } } @@ -111,16 +111,16 @@ bool GenerateFragmentShaderGLSL(const FShaderID &id, char *buffer, uint64_t *uni } else { if (!gl_extensions.ForceGL2 || gl_extensions.IsCoreContext) { if (gl_extensions.VersionGEThan(3, 3, 0)) { - fragColor0 = "fragColor0"; - texture = "texture"; - glslES30 = true; - bitwiseOps = true; - texelFetch = "texelFetch"; + compat.fragColor0 = "fragColor0"; + compat.texture = "texture"; + compat.glslES30 = true; + compat.bitwiseOps = true; + compat.texelFetch = "texelFetch"; WRITE(p, "#version 330\n"); } else if (gl_extensions.VersionGEThan(3, 0, 0)) { - fragColor0 = "fragColor0"; - bitwiseOps = true; - texelFetch = "texelFetch"; + compat.fragColor0 = "fragColor0"; + compat.bitwiseOps = true; + compat.texelFetch = "texelFetch"; WRITE(p, "#version 130\n"); if (gl_extensions.EXT_gpu_shader4) { WRITE(p, "#extension GL_EXT_gpu_shader4 : enable\n"); @@ -129,8 +129,8 @@ bool GenerateFragmentShaderGLSL(const FShaderID &id, char *buffer, uint64_t *uni WRITE(p, "#version 110\n"); if (gl_extensions.EXT_gpu_shader4) { WRITE(p, "#extension GL_EXT_gpu_shader4 : enable\n"); - bitwiseOps = true; - texelFetch = "texelFetch2D"; + compat.bitwiseOps = true; + compat.texelFetch = "texelFetch2D"; } } } @@ -141,8 +141,8 @@ bool GenerateFragmentShaderGLSL(const FShaderID &id, char *buffer, uint64_t *uni WRITE(p, "#define highp\n"); } - if (glslES30 || gl_extensions.IsCoreContext) { - varying = "in"; + if (compat.glslES30 || gl_extensions.IsCoreContext) { + compat.varying = "in"; } bool lmode = id.Bit(FS_BIT_LMODE); @@ -180,7 +180,7 @@ bool GenerateFragmentShaderGLSL(const FShaderID &id, char *buffer, uint64_t *uni } const char *shading = ""; - if (glslES30) + if (compat.glslES30) shading = doFlatShading ? "flat" : ""; if (doTexture) @@ -189,7 +189,7 @@ bool GenerateFragmentShaderGLSL(const FShaderID &id, char *buffer, uint64_t *uni if (!isModeClear && replaceBlend > REPLACE_BLEND_STANDARD) { *uniformMask |= DIRTY_SHADERBLEND; if (!gstate_c.Supports(GPU_SUPPORTS_ANY_FRAMEBUFFER_FETCH) && replaceBlend == REPLACE_BLEND_COPY_FBO) { - if (!texelFetch) { + if (!compat.texelFetch) { WRITE(p, "uniform vec2 u_fbotexSize;\n"); } WRITE(p, "uniform sampler2D fbotex;\n"); @@ -216,7 +216,7 @@ bool GenerateFragmentShaderGLSL(const FShaderID &id, char *buffer, uint64_t *uni } else { *uniformMask |= DIRTY_ALPHACOLORREF; WRITE(p, "uniform vec4 u_alphacolorref;\n"); - if (bitwiseOps && ((enableColorTest && !colorTestAgainstZero) || (enableAlphaTest && !alphaTestAgainstZero))) { + if (compat.bitwiseOps && ((enableColorTest && !colorTestAgainstZero) || (enableAlphaTest && !alphaTestAgainstZero))) { *uniformMask |= DIRTY_ALPHACOLORMASK; WRITE(p, "uniform ivec4 u_alphacolormask;\n"); } @@ -239,21 +239,21 @@ bool GenerateFragmentShaderGLSL(const FShaderID &id, char *buffer, uint64_t *uni WRITE(p, "uniform vec3 u_texenv;\n"); } - WRITE(p, "%s %s vec4 v_color0;\n", shading, varying); + WRITE(p, "%s %s vec4 v_color0;\n", shading, compat.varying); if (lmode) - WRITE(p, "%s %s vec3 v_color1;\n", shading, varying); + WRITE(p, "%s %s vec3 v_color1;\n", shading, compat.varying); if (enableFog) { *uniformMask |= DIRTY_FOGCOLOR; WRITE(p, "uniform vec3 u_fogcolor;\n"); - WRITE(p, "%s %s float v_fogdepth;\n", varying, highpFog ? "highp" : "mediump"); + WRITE(p, "%s %s float v_fogdepth;\n", compat.varying, highpFog ? "highp" : "mediump"); } if (doTexture) { - WRITE(p, "%s %s vec3 v_texcoord;\n", varying, highpTexcoord ? "highp" : "mediump"); + WRITE(p, "%s %s vec3 v_texcoord;\n", compat.varying, highpTexcoord ? "highp" : "mediump"); } if (!g_Config.bFragmentTestCache) { if (enableAlphaTest && !alphaTestAgainstZero) { - if (bitwiseOps) { + if (compat.bitwiseOps) { WRITE(p, "int roundAndScaleTo255i(in float x) { return int(floor(x * 255.0 + 0.5)); }\n"); } else if (gl_extensions.gpuVendor == GPU_VENDOR_IMGTEC) { WRITE(p, "float roundTo255thf(in mediump float x) { mediump float y = x + (0.5/255.0); return y - fract(y * 255.0) * (1.0 / 255.0); }\n"); @@ -262,7 +262,7 @@ bool GenerateFragmentShaderGLSL(const FShaderID &id, char *buffer, uint64_t *uni } } if (enableColorTest && !colorTestAgainstZero) { - if (bitwiseOps) { + if (compat.bitwiseOps) { WRITE(p, "ivec3 roundAndScaleTo255iv(in vec3 x) { return ivec3(floor(x * 255.0 + 0.5)); }\n"); } else if (gl_extensions.gpuVendor == GPU_VENDOR_IMGTEC) { WRITE(p, "vec3 roundTo255thv(in vec3 x) { vec3 y = x + (0.5/255.0); return y - fract(y * 255.0) * (1.0 / 255.0); }\n"); @@ -272,9 +272,9 @@ bool GenerateFragmentShaderGLSL(const FShaderID &id, char *buffer, uint64_t *uni } } - if (!strcmp(fragColor0, "fragColor0")) { + if (!strcmp(compat.fragColor0, "fragColor0")) { const char *qualifierColor0 = "out"; - if (lastFragData && !strcmp(lastFragData, fragColor0)) { + if (compat.lastFragData && !strcmp(compat.lastFragData, compat.fragColor0)) { qualifierColor0 = "inout"; } // Output the output color definitions. @@ -353,9 +353,9 @@ bool GenerateFragmentShaderGLSL(const FShaderID &id, char *buffer, uint64_t *uni if (!shaderDepal) { if (doTextureProjection) { - WRITE(p, " vec4 t = %sProj(tex, %s);\n", texture, texcoord); + WRITE(p, " vec4 t = %sProj(tex, %s);\n", compat.texture, texcoord); } else { - WRITE(p, " vec4 t = %s(tex, %s.xy);\n", texture, texcoord); + WRITE(p, " vec4 t = %s(tex, %s.xy);\n", compat.texture, texcoord); } } else { if (doTextureProjection) { @@ -375,10 +375,10 @@ bool GenerateFragmentShaderGLSL(const FShaderID &id, char *buffer, uint64_t *uni WRITE(p, " } else {\n"); WRITE(p, " uv_round = uv;\n"); WRITE(p, " }\n"); - WRITE(p, " vec4 t = %s(tex, uv_round);\n", texture); - WRITE(p, " vec4 t1 = %sOffset(tex, uv_round, ivec2(1, 0));\n", texture); - WRITE(p, " vec4 t2 = %sOffset(tex, uv_round, ivec2(0, 1));\n", texture); - WRITE(p, " vec4 t3 = %sOffset(tex, uv_round, ivec2(1, 1));\n", texture); + WRITE(p, " vec4 t = %s(tex, uv_round);\n", compat.texture); + WRITE(p, " vec4 t1 = %sOffset(tex, uv_round, ivec2(1, 0));\n", compat.texture); + WRITE(p, " vec4 t2 = %sOffset(tex, uv_round, ivec2(0, 1));\n", compat.texture); + WRITE(p, " vec4 t3 = %sOffset(tex, uv_round, ivec2(1, 1));\n", compat.texture); WRITE(p, " int depalMask = (u_depal & 0xFF);\n"); WRITE(p, " int depalShift = ((u_depal >> 8) & 0xFF);\n"); WRITE(p, " int depalOffset = (((u_depal >> 16) & 0xFF) << 4);\n"); @@ -552,12 +552,12 @@ bool GenerateFragmentShaderGLSL(const FShaderID &id, char *buffer, uint64_t *uni WRITE(p, " %s\n", discardStatement); } } else if (g_Config.bFragmentTestCache) { - WRITE(p, " float aResult = %s(testtex, vec2(%s, 0)).a;\n", texture, alphaTestXCoord.c_str()); + WRITE(p, " float aResult = %s(testtex, vec2(%s, 0)).a;\n", compat.texture, alphaTestXCoord.c_str()); WRITE(p, " if (aResult < 0.5) %s\n", discardStatement); } else { const char *alphaTestFuncs[] = { "#", "#", " != ", " == ", " >= ", " > ", " <= ", " < " }; if (alphaTestFuncs[alphaTestFunc][0] != '#') { - if (bitwiseOps) { + if (compat.bitwiseOps) { WRITE(p, " if ((roundAndScaleTo255i(v.a) & u_alphacolormask.a) %s int(u_alphacolorref.a)) %s\n", alphaTestFuncs[alphaTestFunc], discardStatement); } else if (gl_extensions.gpuVendor == GPU_VENDOR_IMGTEC) { // Work around bad PVR driver problem where equality check + discard just doesn't work. @@ -589,9 +589,9 @@ bool GenerateFragmentShaderGLSL(const FShaderID &id, char *buffer, uint64_t *uni WRITE(p, " %s\n", discardStatement); } } else if (g_Config.bFragmentTestCache) { - WRITE(p, " float rResult = %s(testtex, vec2(vScale256.r, 0)).r;\n", texture); - WRITE(p, " float gResult = %s(testtex, vec2(vScale256.g, 0)).g;\n", texture); - WRITE(p, " float bResult = %s(testtex, vec2(vScale256.b, 0)).b;\n", texture); + WRITE(p, " float rResult = %s(testtex, vec2(vScale256.r, 0)).r;\n", compat.texture); + WRITE(p, " float gResult = %s(testtex, vec2(vScale256.g, 0)).g;\n", compat.texture); + WRITE(p, " float bResult = %s(testtex, vec2(vScale256.b, 0)).b;\n", compat.texture); if (colorTestFunc == GE_COMP_EQUAL) { // Equal means all parts must be equal (so discard if any is not.) WRITE(p, " if (rResult < 0.5 || gResult < 0.5 || bResult < 0.5) %s\n", discardStatement); @@ -602,7 +602,7 @@ bool GenerateFragmentShaderGLSL(const FShaderID &id, char *buffer, uint64_t *uni } else { const char *colorTestFuncs[] = { "#", "#", " != ", " == " }; if (colorTestFuncs[colorTestFunc][0] != '#') { - if (bitwiseOps) { + if (compat.bitwiseOps) { // Apparently GLES3 does not support vector bitwise ops. WRITE(p, " ivec3 v_scaled = roundAndScaleTo255iv(v.rgb);\n"); const char *maskedFragColor = "ivec3(v_scaled.r & u_alphacolormask.r, v_scaled.g & u_alphacolormask.g, v_scaled.b & u_alphacolormask.b)"; @@ -649,11 +649,11 @@ bool GenerateFragmentShaderGLSL(const FShaderID &id, char *buffer, uint64_t *uni // If we have NV_shader_framebuffer_fetch / EXT_shader_framebuffer_fetch, we skip the blit. // We can just read the prev value more directly. if (gstate_c.Supports(GPU_SUPPORTS_ANY_FRAMEBUFFER_FETCH)) { - WRITE(p, " lowp vec4 destColor = %s;\n", lastFragData); - } else if (!texelFetch) { - WRITE(p, " lowp vec4 destColor = %s(fbotex, gl_FragCoord.xy * u_fbotexSize.xy);\n", texture); + WRITE(p, " lowp vec4 destColor = %s;\n", compat.lastFragData); + } else if (!compat.texelFetch) { + WRITE(p, " lowp vec4 destColor = %s(fbotex, gl_FragCoord.xy * u_fbotexSize.xy);\n", compat.texture); } else { - WRITE(p, " lowp vec4 destColor = %s(fbotex, ivec2(gl_FragCoord.x, gl_FragCoord.y), 0);\n", texelFetch); + WRITE(p, " lowp vec4 destColor = %s(fbotex, ivec2(gl_FragCoord.x, gl_FragCoord.y), 0);\n", compat.texelFetch); } const char *srcFactor = "vec3(1.0)"; @@ -755,16 +755,16 @@ bool GenerateFragmentShaderGLSL(const FShaderID &id, char *buffer, uint64_t *uni switch (stencilToAlpha) { case REPLACE_ALPHA_DUALSOURCE: - WRITE(p, " %s = vec4(v.rgb, %s);\n", fragColor0, replacedAlpha.c_str()); - WRITE(p, " %s = vec4(0.0, 0.0, 0.0, v.a);\n", fragColor1); + WRITE(p, " %s = vec4(v.rgb, %s);\n", compat.fragColor0, replacedAlpha.c_str()); + WRITE(p, " %s = vec4(0.0, 0.0, 0.0, v.a);\n", compat.fragColor1); break; case REPLACE_ALPHA_YES: - WRITE(p, " %s = vec4(v.rgb, %s);\n", fragColor0, replacedAlpha.c_str()); + WRITE(p, " %s = vec4(v.rgb, %s);\n", compat.fragColor0, replacedAlpha.c_str()); break; case REPLACE_ALPHA_NO: - WRITE(p, " %s = v;\n", fragColor0); + WRITE(p, " %s = v;\n", compat.fragColor0); break; default: @@ -775,10 +775,10 @@ bool GenerateFragmentShaderGLSL(const FShaderID &id, char *buffer, uint64_t *uni LogicOpReplaceType replaceLogicOpType = (LogicOpReplaceType)id.Bits(FS_BIT_REPLACE_LOGIC_OP_TYPE, 2); switch (replaceLogicOpType) { case LOGICOPTYPE_ONE: - WRITE(p, " %s.rgb = vec3(1.0, 1.0, 1.0);\n", fragColor0); + WRITE(p, " %s.rgb = vec3(1.0, 1.0, 1.0);\n", compat.fragColor0); break; case LOGICOPTYPE_INVERT: - WRITE(p, " %s.rgb = vec3(1.0, 1.0, 1.0) - %s.rgb;\n", fragColor0, fragColor0); + WRITE(p, " %s.rgb = vec3(1.0, 1.0, 1.0) - %s.rgb;\n", compat.fragColor0, compat.fragColor0); break; case LOGICOPTYPE_NORMAL: break; @@ -788,15 +788,6 @@ bool GenerateFragmentShaderGLSL(const FShaderID &id, char *buffer, uint64_t *uni return false; } -#ifdef DEBUG_SHADER - if (doTexture) { - WRITE(p, " %s = texture2D(tex, v_texcoord.xy);\n", fragColor0); - WRITE(p, " %s += vec4(0.3,0,0.3,0.3);\n", fragColor0); - } else { - WRITE(p, " %s = vec4(1,0,1,1);\n", fragColor0); - } -#endif - if (gstate_c.Supports(GPU_ROUND_FRAGMENT_DEPTH_TO_16BIT)) { const double scale = DepthSliceFactor() * 65535.0; diff --git a/GPU/GLES/VertexShaderGeneratorGLES.cpp b/GPU/GLES/VertexShaderGeneratorGLES.cpp index c6b623e58d..3e8f03e5d4 100644 --- a/GPU/GLES/VertexShaderGeneratorGLES.cpp +++ b/GPU/GLES/VertexShaderGeneratorGLES.cpp @@ -94,24 +94,25 @@ bool GenerateVertexShaderGLSL(const VShaderID &id, char *buffer, uint32_t *attrM // #define USE_FOR_LOOP // In GLSL ES 3.0, you use "out" variables instead. - bool glslES30 = false; - const char *varying = "varying"; - const char *attribute = "attribute"; + GLSLShaderCompat compat{}; + compat.glslES30 = false; + compat.varying = "varying"; + compat.attribute = "attribute"; const char * const * boneWeightDecl = boneWeightAttrDecl; - const char *texelFetch = NULL; + compat.texelFetch = NULL; bool highpFog = false; bool highpTexcoord = false; if (gl_extensions.IsGLES) { if (gstate_c.Supports(GPU_SUPPORTS_GLSL_ES_300)) { WRITE(p, "#version 300 es\n"); - glslES30 = true; - texelFetch = "texelFetch"; + compat.glslES30 = true; + compat.texelFetch = "texelFetch"; } else { WRITE(p, "#version 100\n"); // GLSL ES 1.0 if (gl_extensions.EXT_gpu_shader4) { WRITE(p, "#extension GL_EXT_gpu_shader4 : enable\n"); - texelFetch = "texelFetch2D"; + compat.texelFetch = "texelFetch2D"; } } WRITE(p, "precision highp float;\n"); @@ -123,20 +124,20 @@ bool GenerateVertexShaderGLSL(const VShaderID &id, char *buffer, uint32_t *attrM } else { if (!gl_extensions.ForceGL2 || gl_extensions.IsCoreContext) { if (gl_extensions.VersionGEThan(3, 3, 0)) { - glslES30 = true; + compat.glslES30 = true; WRITE(p, "#version 330\n"); - texelFetch = "texelFetch"; + compat.texelFetch = "texelFetch"; } else if (gl_extensions.VersionGEThan(3, 0, 0)) { WRITE(p, "#version 130\n"); if (gl_extensions.EXT_gpu_shader4) { WRITE(p, "#extension GL_EXT_gpu_shader4 : enable\n"); - texelFetch = "texelFetch"; + compat.texelFetch = "texelFetch"; } } else { WRITE(p, "#version 110\n"); if (gl_extensions.EXT_gpu_shader4) { WRITE(p, "#extension GL_EXT_gpu_shader4 : enable\n"); - texelFetch = "texelFetch2D"; + compat.texelFetch = "texelFetch2D"; } } } @@ -148,9 +149,9 @@ bool GenerateVertexShaderGLSL(const VShaderID &id, char *buffer, uint32_t *attrM } WRITE(p, "#define splat3(x) vec3(x)\n"); - if (glslES30 || gl_extensions.IsCoreContext) { - attribute = "in"; - varying = "out"; + if (compat.glslES30 || gl_extensions.IsCoreContext) { + compat.attribute = "in"; + compat.varying = "out"; boneWeightDecl = boneWeightInDecl; } @@ -186,7 +187,7 @@ bool GenerateVertexShaderGLSL(const VShaderID &id, char *buffer, uint32_t *attrM bool flipNormalTess = id.Bit(VS_BIT_NORM_REVERSE_TESS); const char *shading = ""; - if (glslES30) + if (compat.glslES30) shading = doFlatShading ? "flat " : ""; DoLightComputation doLight[4] = { LIGHT_OFF, LIGHT_OFF, LIGHT_OFF, LIGHT_OFF }; @@ -212,31 +213,31 @@ bool GenerateVertexShaderGLSL(const VShaderID &id, char *buffer, uint32_t *attrM } if (useHWTransform) - WRITE(p, "%s vec3 position;\n", attribute); + WRITE(p, "%s vec3 position;\n", compat.attribute); else - WRITE(p, "%s vec4 position;\n", attribute); // need to pass the fog coord in w + WRITE(p, "%s vec4 position;\n", compat.attribute); // need to pass the fog coord in w *attrMask |= 1 << ATTR_POSITION; if (useHWTransform && hasNormal) { - WRITE(p, "%s mediump vec3 normal;\n", attribute); + WRITE(p, "%s mediump vec3 normal;\n", compat.attribute); *attrMask |= 1 << ATTR_NORMAL; } bool texcoordVec3In = false; if (doTexture && hasTexcoord) { if (!useHWTransform && doTextureProjection && !isModeThrough) { - WRITE(p, "%s vec3 texcoord;\n", attribute); + WRITE(p, "%s vec3 texcoord;\n", compat.attribute); texcoordVec3In = true; } else { - WRITE(p, "%s vec2 texcoord;\n", attribute); + WRITE(p, "%s vec2 texcoord;\n", compat.attribute); } *attrMask |= 1 << ATTR_TEXCOORD; } if (hasColor) { - WRITE(p, "%s lowp vec4 color0;\n", attribute); + WRITE(p, "%s lowp vec4 color0;\n", compat.attribute); *attrMask |= 1 << ATTR_COLOR0; if (lmode && !useHWTransform) { // only software transform supplies color1 as vertex data - WRITE(p, "%s lowp vec3 color1;\n", attribute); + WRITE(p, "%s lowp vec3 color1;\n", compat.attribute); *attrMask |= 1 << ATTR_COLOR1; } } @@ -335,21 +336,21 @@ bool GenerateVertexShaderGLSL(const VShaderID &id, char *buffer, uint32_t *attrM *uniformMask |= DIRTY_CULLRANGE; } - WRITE(p, "%s%s lowp vec4 v_color0;\n", shading, varying); + WRITE(p, "%s%s lowp vec4 v_color0;\n", shading, compat.varying); if (lmode) { - WRITE(p, "%s%s lowp vec3 v_color1;\n", shading, varying); + WRITE(p, "%s%s lowp vec3 v_color1;\n", shading, compat.varying); } if (doTexture) { - WRITE(p, "%s %s vec3 v_texcoord;\n", varying, highpTexcoord ? "highp" : "mediump"); + WRITE(p, "%s %s vec3 v_texcoord;\n", compat.varying, highpTexcoord ? "highp" : "mediump"); } if (enableFog) { // See the fragment shader generator if (highpFog) { - WRITE(p, "%s highp float v_fogdepth;\n", varying); + WRITE(p, "%s highp float v_fogdepth;\n", compat.varying); } else { - WRITE(p, "%s mediump float v_fogdepth;\n", varying); + WRITE(p, "%s mediump float v_fogdepth;\n", compat.varying); } } @@ -416,17 +417,17 @@ bool GenerateVertexShaderGLSL(const VShaderID &id, char *buffer, uint32_t *attrM for (int j = 0; j < 4; j++) { WRITE(p, " index_u = (%i + point_pos.x);\n", j); WRITE(p, " index_v = (%i + point_pos.y);\n", i); - WRITE(p, " _pos[%i] = %s(u_tess_points, ivec2(index_u, index_v), 0).xyz;\n", i * 4 + j, texelFetch); + WRITE(p, " _pos[%i] = %s(u_tess_points, ivec2(index_u, index_v), 0).xyz;\n", i * 4 + j, compat.texelFetch); if (doTexture && hasTexcoordTess) - WRITE(p, " _tex[%i] = %s(u_tess_points, ivec2(index_u + u_spline_counts, index_v), 0).xy;\n", i * 4 + j, texelFetch); + WRITE(p, " _tex[%i] = %s(u_tess_points, ivec2(index_u + u_spline_counts, index_v), 0).xy;\n", i * 4 + j, compat.texelFetch); if (hasColorTess) - WRITE(p, " _col[%i] = %s(u_tess_points, ivec2(index_u + u_spline_counts * 2, index_v), 0).rgba;\n", i * 4 + j, texelFetch); + WRITE(p, " _col[%i] = %s(u_tess_points, ivec2(index_u + u_spline_counts * 2, index_v), 0).rgba;\n", i * 4 + j, compat.texelFetch); } } // Basis polynomials as weight coefficients - WRITE(p, " vec4 basis_u = %s(u_tess_weights_u, %s, 0);\n", texelFetch, "ivec2(weight_idx.x * 2, 0)"); - WRITE(p, " vec4 basis_v = %s(u_tess_weights_v, %s, 0);\n", texelFetch, "ivec2(weight_idx.y * 2, 0)"); + WRITE(p, " vec4 basis_u = %s(u_tess_weights_u, %s, 0);\n", compat.texelFetch, "ivec2(weight_idx.x * 2, 0)"); + WRITE(p, " vec4 basis_v = %s(u_tess_weights_v, %s, 0);\n", compat.texelFetch, "ivec2(weight_idx.y * 2, 0)"); WRITE(p, " mat4 basis = outerProduct(basis_u, basis_v);\n"); // Tessellate @@ -443,8 +444,8 @@ bool GenerateVertexShaderGLSL(const VShaderID &id, char *buffer, uint32_t *attrM WRITE(p, " tess.col = u_matambientalpha;\n"); if (hasNormalTess) { // Derivatives as weight coefficients - WRITE(p, " vec4 deriv_u = %s(u_tess_weights_u, %s, 0);\n", texelFetch, "ivec2(weight_idx.x * 2 + 1, 0)"); - WRITE(p, " vec4 deriv_v = %s(u_tess_weights_v, %s, 0);\n", texelFetch, "ivec2(weight_idx.y * 2 + 1, 0)"); + WRITE(p, " vec4 deriv_u = %s(u_tess_weights_u, %s, 0);\n", compat.texelFetch, "ivec2(weight_idx.x * 2 + 1, 0)"); + WRITE(p, " vec4 deriv_v = %s(u_tess_weights_v, %s, 0);\n", compat.texelFetch, "ivec2(weight_idx.y * 2 + 1, 0)"); WRITE(p, " vec3 du = tess_sample(_pos, outerProduct(deriv_u, basis_v));\n"); WRITE(p, " vec3 dv = tess_sample(_pos, outerProduct(basis_u, deriv_v));\n"); From 3a870a9d814080045f769425bc64f2ffa9401f4f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Thu, 22 Oct 2020 00:03:26 +0200 Subject: [PATCH 069/275] OpenGL: Allow texture wrapping on framebuffers if supported Fixes minor texture glitch in Wipeout, and probably more --- Common/GPU/OpenGL/GLQueueRunner.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Common/GPU/OpenGL/GLQueueRunner.cpp b/Common/GPU/OpenGL/GLQueueRunner.cpp index 642db6a143..4b3ead17bf 100644 --- a/Common/GPU/OpenGL/GLQueueRunner.cpp +++ b/Common/GPU/OpenGL/GLQueueRunner.cpp @@ -426,6 +426,10 @@ void GLQueueRunner::InitCreateFramebuffer(const GLRInitStep &step) { tex.magFilter = linear ? GL_LINEAR : GL_NEAREST; tex.minFilter = linear ? GL_LINEAR : GL_NEAREST; tex.canWrap = isPowerOf2(fbo->width) && isPowerOf2(fbo->height); + if (gl_extensions.OES_texture_npot) { + tex.canWrap = true; + } + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, tex.wrapS); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, tex.wrapT); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, tex.magFilter); From 43ce4e7493d54991ee223dfeed9cbd17926dc656 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Thu, 22 Oct 2020 00:04:00 +0200 Subject: [PATCH 070/275] Remove an unmotivated ifdef. Additional cleanup --- Common/GPU/OpenGL/GLQueueRunner.cpp | 3 ++- GPU/GLES/GPU_GLES.cpp | 10 ---------- GPU/GLES/TextureCacheGLES.cpp | 4 ---- UI/DevScreens.cpp | 12 +----------- 4 files changed, 3 insertions(+), 26 deletions(-) diff --git a/Common/GPU/OpenGL/GLQueueRunner.cpp b/Common/GPU/OpenGL/GLQueueRunner.cpp index 4b3ead17bf..1d5c024379 100644 --- a/Common/GPU/OpenGL/GLQueueRunner.cpp +++ b/Common/GPU/OpenGL/GLQueueRunner.cpp @@ -425,9 +425,10 @@ void GLQueueRunner::InitCreateFramebuffer(const GLRInitStep &step) { tex.wrapT = GL_CLAMP_TO_EDGE; tex.magFilter = linear ? GL_LINEAR : GL_NEAREST; tex.minFilter = linear ? GL_LINEAR : GL_NEAREST; - tex.canWrap = isPowerOf2(fbo->width) && isPowerOf2(fbo->height); if (gl_extensions.OES_texture_npot) { tex.canWrap = true; + } else { + tex.canWrap = isPowerOf2(fbo->width) && isPowerOf2(fbo->height); } glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, tex.wrapS); diff --git a/GPU/GLES/GPU_GLES.cpp b/GPU/GLES/GPU_GLES.cpp index 5abe3d9274..86fd6d8acf 100644 --- a/GPU/GLES/GPU_GLES.cpp +++ b/GPU/GLES/GPU_GLES.cpp @@ -400,16 +400,6 @@ void GPU_GLES::CopyDisplayToOutput(bool reallyDirty) { framebufferManagerGL_->CopyDisplayToOutput(reallyDirty); framebufferManagerGL_->EndFrame(); - - // If buffered, discard the depth buffer of the backbuffer. Don't even know if we need one. -#if 0 -#ifdef USING_GLES2 - if (gl_extensions.EXT_discard_framebuffer && framebufferManager_->UseBufferedRendering()) { - GLenum attachments[] = {GL_DEPTH_EXT, GL_STENCIL_EXT}; - glDiscardFramebufferEXT(GL_FRAMEBUFFER, 2, attachments); - } -#endif -#endif } void GPU_GLES::FinishDeferred() { diff --git a/GPU/GLES/TextureCacheGLES.cpp b/GPU/GLES/TextureCacheGLES.cpp index 822143f3df..6389431226 100644 --- a/GPU/GLES/TextureCacheGLES.cpp +++ b/GPU/GLES/TextureCacheGLES.cpp @@ -708,7 +708,6 @@ void TextureCacheGLES::LoadTextureLevel(TexCacheEntry &entry, ReplacedTexture &r } bool TextureCacheGLES::GetCurrentTextureDebug(GPUDebugBuffer &buffer, int level) { -#ifndef USING_GLES2 GPUgstate saved; if (level != 0) { saved = gstate; @@ -769,9 +768,6 @@ bool TextureCacheGLES::GetCurrentTextureDebug(GPUDebugBuffer &buffer, int level) framebufferManager_->RebindFramebuffer("RebindFramebuffer - GetCurrentTextureDebug"); return result; -#else - return false; -#endif } void TextureCacheGLES::DeviceLost() { diff --git a/UI/DevScreens.cpp b/UI/DevScreens.cpp index 79be85c785..f2dad07e1d 100644 --- a/UI/DevScreens.cpp +++ b/UI/DevScreens.cpp @@ -538,16 +538,6 @@ void SystemInfoScreen::CreateViews() { deviceSpecs->Add(new InfoItem(si->T("Refresh rate"), StringFromFormat("%0.3f Hz", (float)System_GetPropertyFloat(SYSPROP_DISPLAY_REFRESH_RATE)))); #endif -#if 0 - // For debugging, DO NOT translate - deviceSpecs->Add(new InfoItem("Resolution1", - StringFromFormat("dp: %dx%d px: %dx%d dpi_s: %0.1fx%0.1f", - dp_xres, dp_yres, pixel_xres, pixel_yres, g_dpi_scale_x, g_dpi_scale_y))); - deviceSpecs->Add(new InfoItem("Resolution2", - StringFromFormat("dpi_s_r: %0.1fx%0.1f px_in_dp: %0.1fx%0.1f", - g_dpi_scale_real_x, g_dpi_scale_real_y, pixel_in_dps_x, pixel_in_dps_y))); -#endif - deviceSpecs->Add(new ItemHeader(si->T("Version Information"))); std::string apiVersion; if (GetGPUBackend() == GPUBackend::OPENGL) { @@ -564,7 +554,7 @@ void SystemInfoScreen::CreateViews() { deviceSpecs->Add(new InfoItem(si->T("API Version"), apiVersion)); deviceSpecs->Add(new InfoItem(si->T("Shading Language"), draw->GetInfoString(InfoField::SHADELANGVERSION))); -#ifdef __ANDROID__ +#if PPSSPP_PLATFORM(ANDROID) std::string moga = System_GetProperty(SYSPROP_MOGA_VERSION); if (moga.empty()) { moga = si->T("(none detected)"); From 0f647684a30601a9a18ebc51b173760b1b1f17da Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Thu, 22 Oct 2020 10:12:21 +0200 Subject: [PATCH 071/275] Try my theory about memory mirrors on iOS 14. See #13451 --- Core/MemMap.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Core/MemMap.h b/Core/MemMap.h index d5df36cad7..85e8fb6548 100644 --- a/Core/MemMap.h +++ b/Core/MemMap.h @@ -84,7 +84,8 @@ extern u32 g_PSPModel; // UWP has such limited memory management that we need to mask // even in 64-bit mode. Also, when using the sanitizer, we need to mask as well. -#if PPSSPP_ARCH(32BIT) || PPSSPP_PLATFORM(UWP) || USE_ADDRESS_SANITIZER +// Regarding iOS, see #13451. +#if PPSSPP_ARCH(32BIT) || PPSSPP_PLATFORM(UWP) || PPSSPP_PLATFORM(IOS) || USE_ADDRESS_SANITIZER #define MASKED_PSP_MEMORY #endif From a0fe0e38c161b09566d38ffb85b36419f600fef6 Mon Sep 17 00:00:00 2001 From: shenweip <1037567878@qq.com> Date: Thu, 22 Oct 2020 17:14:35 +0800 Subject: [PATCH 072/275] SwicthUMD:Only update Switch UMD item of Windows menu instead of entire UI. --- Core/HLE/sceUmd.cpp | 12 ++++++++---- Core/Host.h | 2 ++ Qt/QtHost.h | 2 ++ UI/HostTypes.h | 2 ++ UWP/UWPHost.h | 2 ++ Windows/MainWindow.cpp | 4 ++++ Windows/MainWindow.h | 2 ++ Windows/MainWindowMenu.cpp | 7 +++++++ Windows/WindowsHost.cpp | 4 ++++ Windows/WindowsHost.h | 2 ++ headless/StubHost.h | 2 ++ 11 files changed, 37 insertions(+), 4 deletions(-) diff --git a/Core/HLE/sceUmd.cpp b/Core/HLE/sceUmd.cpp index 5cb209c6c4..51c44b72ae 100644 --- a/Core/HLE/sceUmd.cpp +++ b/Core/HLE/sceUmd.cpp @@ -515,17 +515,21 @@ bool getUMDReplacePermit() { static u32 sceUmdReplaceProhibit() { - UMDReplacePermit = false; DEBUG_LOG(SCEIO,"sceUmdReplaceProhibit()"); - host->UpdateUI(); + if (UMDReplacePermit) { + UMDReplacePermit = false; + host->NotifySwitchUMDUpdated(); + } return 0; } static u32 sceUmdReplacePermit() { - UMDReplacePermit = true; DEBUG_LOG(SCEIO,"sceUmdReplacePermit()"); - host->UpdateUI(); + if (!UMDReplacePermit) { + UMDReplacePermit = true; + host->NotifySwitchUMDUpdated(); + } return 0; } diff --git a/Core/Host.h b/Core/Host.h index 35838c8083..4a4c739c3d 100644 --- a/Core/Host.h +++ b/Core/Host.h @@ -57,6 +57,8 @@ public: virtual void NotifyUserMessage(const std::string &message, float duration = 1.0f, u32 color = 0x00FFFFFF, const char *id = nullptr) {} virtual void SendUIMessage(const std::string &message, const std::string &value) {} + virtual void NotifySwitchUMDUpdated() {} + // Used for headless. virtual bool ShouldSkipUI() { return false; } virtual void SendDebugOutput(const std::string &output) {} diff --git a/Qt/QtHost.h b/Qt/QtHost.h index e0c7ef4b7e..2aa9bc1870 100644 --- a/Qt/QtHost.h +++ b/Qt/QtHost.h @@ -92,6 +92,8 @@ public: NativeMessageReceived(message.c_str(), value.c_str()); } + void NotifySwitchUMDUpdated() override {} + private: std::string SymbolMapFilename(std::string currentFilename); MainWindow* mainWindow; diff --git a/UI/HostTypes.h b/UI/HostTypes.h index 134c808862..c801859b07 100644 --- a/UI/HostTypes.h +++ b/UI/HostTypes.h @@ -53,4 +53,6 @@ public: void SendUIMessage(const std::string &message, const std::string &value) override { NativeMessageReceived(message.c_str(), value.c_str()); } + + void NotifySwitchUMDUpdated() override {} }; diff --git a/UWP/UWPHost.h b/UWP/UWPHost.h index 3c70db9991..ee49d0cba5 100644 --- a/UWP/UWPHost.h +++ b/UWP/UWPHost.h @@ -40,6 +40,8 @@ public: void NotifyUserMessage(const std::string &message, float duration = 1.0f, u32 color = 0x00FFFFFF, const char *id = nullptr) override; + void NotifySwitchUMDUpdated() override {} + GraphicsContext *GetGraphicsContext() { return nullptr; } private: diff --git a/Windows/MainWindow.cpp b/Windows/MainWindow.cpp index f925f05fe8..7ef4340741 100644 --- a/Windows/MainWindow.cpp +++ b/Windows/MainWindow.cpp @@ -970,6 +970,10 @@ namespace MainWindow InputDevice::BeginPolling(); break; + case WM_USER_SWITCHUMD_UPDATED: + UpdateSwitchUMD(); + break; + case WM_MENUSELECT: // Called when a menu is opened. Also when an item is selected, but meh. UpdateMenus(true); diff --git a/Windows/MainWindow.h b/Windows/MainWindow.h index 0341e897e7..c0bb7a8f84 100644 --- a/Windows/MainWindow.h +++ b/Windows/MainWindow.h @@ -21,6 +21,7 @@ namespace MainWindow WM_USER_BROWSE_BOOT_DONE = WM_USER + 104, WM_USER_TOGGLE_FULLSCREEN = WM_USER + 105, WM_USER_RESTART_EMUTHREAD = WM_USER + 106, + WM_USER_SWITCHUMD_UPDATED = WM_USER + 107 }; enum { @@ -66,6 +67,7 @@ namespace MainWindow void Close(); void UpdateMenus(bool isMenuSelect = false); void UpdateCommands(); + void UpdateSwitchUMD(); void SetWindowTitle(const wchar_t *title); void Redraw(); HWND GetHWND(); diff --git a/Windows/MainWindowMenu.cpp b/Windows/MainWindowMenu.cpp index ee9500291d..979a60ecb7 100644 --- a/Windows/MainWindowMenu.cpp +++ b/Windows/MainWindowMenu.cpp @@ -1379,6 +1379,13 @@ namespace MainWindow { TranslateMenuItem(menu, ID_TOGGLE_BREAK, L"\tF8", isPaused ? "Run" : "Break"); } + void UpdateSwitchUMD() { + HMENU menu = GetMenu(GetHWND()); + GlobalUIState state = GetUIState(); + UINT umdSwitchEnable = state == UISTATE_INGAME && getUMDReplacePermit() ? MF_ENABLED : MF_GRAYED; + EnableMenuItem(menu, ID_EMULATION_SWITCH_UMD, umdSwitchEnable); + } + // Message handler for about box. LRESULT CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) { switch (message) { diff --git a/Windows/WindowsHost.cpp b/Windows/WindowsHost.cpp index 210344033f..d7b3d93396 100644 --- a/Windows/WindowsHost.cpp +++ b/Windows/WindowsHost.cpp @@ -407,3 +407,7 @@ void WindowsHost::NotifyUserMessage(const std::string &message, float duration, void WindowsHost::SendUIMessage(const std::string &message, const std::string &value) { NativeMessageReceived(message.c_str(), value.c_str()); } + +void WindowsHost::NotifySwitchUMDUpdated() { + PostMessage(mainWindow_, MainWindow::WM_USER_SWITCHUMD_UPDATED, 0, 0); +} diff --git a/Windows/WindowsHost.h b/Windows/WindowsHost.h index 581a8064d3..492d47a9db 100644 --- a/Windows/WindowsHost.h +++ b/Windows/WindowsHost.h @@ -63,6 +63,8 @@ public: void NotifyUserMessage(const std::string &message, float duration = 1.0f, u32 color = 0x00FFFFFF, const char *id = nullptr) override; void SendUIMessage(const std::string &message, const std::string &value) override; + void NotifySwitchUMDUpdated() override; + GraphicsContext *GetGraphicsContext() { return gfx_; } private: diff --git a/headless/StubHost.h b/headless/StubHost.h index 8ac54ddff8..571444ce0b 100644 --- a/headless/StubHost.h +++ b/headless/StubHost.h @@ -72,6 +72,8 @@ public: void SendDebugScreenshot(const u8 *pixbuf, u32 w, u32 h) override; + void NotifySwitchUMDUpdated() override {} + // Unique for HeadlessHost virtual void SwapBuffers() {} From d5ea12d08bd00c21312ce4cdf1808e9183592441 Mon Sep 17 00:00:00 2001 From: gary-ts Date: Fri, 23 Oct 2020 03:17:02 +0900 Subject: [PATCH 073/275] Fix a section of the translatable message I don't know this is OK. Please check it. --- UI/GameSettingsScreen.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/UI/GameSettingsScreen.cpp b/UI/GameSettingsScreen.cpp index 2fdc03ec1b..6e2da8a3a0 100644 --- a/UI/GameSettingsScreen.cpp +++ b/UI/GameSettingsScreen.cpp @@ -870,7 +870,7 @@ void GameSettingsScreen::CreateViews() { systemSettings->Add(new ItemHeader(sy->T("UI Language"))); // Should be renamed "UI"? systemSettings->Add(new Choice(dev->T("Language", "Language")))->OnClick.Handle(this, &GameSettingsScreen::OnLanguage); - systemSettings->Add(new CheckBox(&g_Config.bUISound, dev->T("UI Sound"))); + systemSettings->Add(new CheckBox(&g_Config.bUISound, sy->T("UI Sound"))); systemSettings->Add(new ItemHeader(sy->T("Help the PPSSPP team"))); enableReports_ = Reporting::IsEnabled(); From 624998becd7f689b15e54873095607923886a354 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Thu, 22 Oct 2020 23:11:37 +0200 Subject: [PATCH 074/275] Android gradle update --- build.gradle | 2 +- gradle/wrapper/gradle-wrapper.properties | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/build.gradle b/build.gradle index 11479e334c..c260ed8c66 100644 --- a/build.gradle +++ b/build.gradle @@ -5,7 +5,7 @@ buildscript { jcenter() } dependencies { - classpath 'com.android.tools.build:gradle:4.0.2' + classpath 'com.android.tools.build:gradle:4.1.0' } } diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 3967b35ba1..92d368b388 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ -#Thu May 28 22:53:27 CEST 2020 +#Thu Oct 22 23:11:13 CEST 2020 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-6.1.1-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-6.5-bin.zip From ee11c796a1fdacce3b4067391d8afb2bcfd4e343 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Fri, 23 Oct 2020 06:57:56 +0200 Subject: [PATCH 075/275] Revert "Try my theory about memory mirrors on iOS 14. See #13451" This reverts commit 0f647684a30601a9a18ebc51b173760b1b1f17da. --- Core/MemMap.h | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/Core/MemMap.h b/Core/MemMap.h index 85e8fb6548..d5df36cad7 100644 --- a/Core/MemMap.h +++ b/Core/MemMap.h @@ -84,8 +84,7 @@ extern u32 g_PSPModel; // UWP has such limited memory management that we need to mask // even in 64-bit mode. Also, when using the sanitizer, we need to mask as well. -// Regarding iOS, see #13451. -#if PPSSPP_ARCH(32BIT) || PPSSPP_PLATFORM(UWP) || PPSSPP_PLATFORM(IOS) || USE_ADDRESS_SANITIZER +#if PPSSPP_ARCH(32BIT) || PPSSPP_PLATFORM(UWP) || USE_ADDRESS_SANITIZER #define MASKED_PSP_MEMORY #endif From e30de2f6a598e9afd502cffe707d7aa6dc2be14b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Thu, 22 Oct 2020 00:02:30 +0200 Subject: [PATCH 076/275] More splat3 --- GPU/GLES/FragmentShaderGeneratorGLES.cpp | 2 ++ GPU/Vulkan/FragmentShaderGeneratorVulkan.cpp | 7 ++++--- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/GPU/GLES/FragmentShaderGeneratorGLES.cpp b/GPU/GLES/FragmentShaderGeneratorGLES.cpp index 66365bff31..587f425ed7 100644 --- a/GPU/GLES/FragmentShaderGeneratorGLES.cpp +++ b/GPU/GLES/FragmentShaderGeneratorGLES.cpp @@ -141,6 +141,8 @@ bool GenerateFragmentShaderGLSL(const FShaderID &id, char *buffer, uint64_t *uni WRITE(p, "#define highp\n"); } + WRITE(p, "#define splat3(x) vec3(x)\n"); + if (compat.glslES30 || gl_extensions.IsCoreContext) { compat.varying = "in"; } diff --git a/GPU/Vulkan/FragmentShaderGeneratorVulkan.cpp b/GPU/Vulkan/FragmentShaderGeneratorVulkan.cpp index 5bbc257173..06ddde1bd4 100644 --- a/GPU/Vulkan/FragmentShaderGeneratorVulkan.cpp +++ b/GPU/Vulkan/FragmentShaderGeneratorVulkan.cpp @@ -39,7 +39,8 @@ static const char *vulkan_glsl_preamble = "#extension GL_ARB_separate_shader_objects : enable\n" "#extension GL_ARB_shading_language_420pack : enable\n" "#extension GL_ARB_conservative_depth : enable\n" - "#extension GL_ARB_shader_image_load_store : enable\n\n"; + "#extension GL_ARB_shader_image_load_store : enable\n" + "#define splat3(x) vec3(x)\n\n"; #define WRITE p+=sprintf @@ -561,10 +562,10 @@ bool GenerateFragmentShaderVulkanGLSL(const FShaderID &id, char *buffer, uint32_ LogicOpReplaceType replaceLogicOpType = (LogicOpReplaceType)id.Bits(FS_BIT_REPLACE_LOGIC_OP_TYPE, 2); switch (replaceLogicOpType) { case LOGICOPTYPE_ONE: - WRITE(p, " fragColor0.rgb = vec3(1.0, 1.0, 1.0);\n"); + WRITE(p, " fragColor0.rgb = splat3(1.0);\n"); break; case LOGICOPTYPE_INVERT: - WRITE(p, " fragColor0.rgb = vec3(1.0, 1.0, 1.0) - fragColor0.rgb;\n"); + WRITE(p, " fragColor0.rgb = splat3(1.0) - fragColor0.rgb;\n"); break; case LOGICOPTYPE_NORMAL: break; From 2917b0e9e6cf9624ff1dbcd3975e59c72ac466d3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Thu, 22 Oct 2020 00:35:09 +0200 Subject: [PATCH 077/275] GLES: Read compat params first, emit code later. --- GPU/Common/ShaderCommon.h | 3 + GPU/GLES/FragmentShaderGeneratorGLES.cpp | 79 ++++++++++++------------ GPU/GLES/VertexShaderGeneratorGLES.cpp | 31 ++++++---- 3 files changed, 59 insertions(+), 54 deletions(-) diff --git a/GPU/Common/ShaderCommon.h b/GPU/Common/ShaderCommon.h index a2a2823245..34f1dca676 100644 --- a/GPU/Common/ShaderCommon.h +++ b/GPU/Common/ShaderCommon.h @@ -18,6 +18,7 @@ #pragma once #include +#include namespace Draw { class DrawContext; @@ -139,6 +140,7 @@ enum DoLightComputation { }; struct GLSLShaderCompat { + const char *versionString; const char *varying; const char *attribute; const char *fragColor0; @@ -146,6 +148,7 @@ struct GLSLShaderCompat { const char *texture; const char *texelFetch; const char *lastFragData; + bool gles; bool glslES30; bool bitwiseOps; }; diff --git a/GPU/GLES/FragmentShaderGeneratorGLES.cpp b/GPU/GLES/FragmentShaderGeneratorGLES.cpp index 587f425ed7..edd7629614 100644 --- a/GPU/GLES/FragmentShaderGeneratorGLES.cpp +++ b/GPU/GLES/FragmentShaderGeneratorGLES.cpp @@ -47,41 +47,32 @@ bool GenerateFragmentShaderGLSL(const FShaderID &id, char *buffer, uint64_t *uni compat.fragColor0 = "gl_FragColor"; compat.fragColor1 = "fragColor1"; compat.texture = "texture2D"; - compat.texelFetch = NULL; + compat.texelFetch = nullptr; compat.bitwiseOps = false; compat.lastFragData = nullptr; + compat.gles = gl_extensions.IsGLES; bool highpFog = false; bool highpTexcoord = false; ReplaceAlphaType stencilToAlpha = static_cast(id.Bits(FS_BIT_STENCIL_TO_ALPHA, 2)); - if (gl_extensions.IsGLES) { - // ES doesn't support dual source alpha :( + if (compat.gles) { if (gstate_c.Supports(GPU_SUPPORTS_GLSL_ES_300)) { - WRITE(p, "#version 300 es\n"); // GLSL ES 3.0 + compat.versionString = "#version 300 es"; // GLSL ES 3.0 compat.fragColor0 = "fragColor0"; compat.texture = "texture"; compat.glslES30 = true; compat.bitwiseOps = true; compat.texelFetch = "texelFetch"; - - if (stencilToAlpha == REPLACE_ALPHA_DUALSOURCE && gl_extensions.EXT_blend_func_extended) { - WRITE(p, "#extension GL_EXT_blend_func_extended : require\n"); - } } else { - WRITE(p, "#version 100\n"); // GLSL ES 1.0 + compat.versionString = "#version 100"; // GLSL ES 1.0 if (gl_extensions.EXT_gpu_shader4) { - WRITE(p, "#extension GL_EXT_gpu_shader4 : enable\n"); compat.bitwiseOps = true; compat.texelFetch = "texelFetch2D"; } if (gl_extensions.EXT_blend_func_extended) { // Oldy moldy GLES, so use the fixed output name. compat.fragColor1 = "gl_SecondaryFragColorEXT"; - - if (stencilToAlpha == REPLACE_ALPHA_DUALSOURCE && gl_extensions.EXT_blend_func_extended) { - WRITE(p, "#extension GL_EXT_blend_func_extended : require\n"); - } } } @@ -89,25 +80,6 @@ bool GenerateFragmentShaderGLSL(const FShaderID &id, char *buffer, uint64_t *uni // Others don't, and some can't handle highp in the fragment shader. highpFog = (gl_extensions.bugs & BUG_PVR_SHADER_PRECISION_BAD) ? true : false; highpTexcoord = highpFog; - - if (gstate_c.Supports(GPU_SUPPORTS_ANY_FRAMEBUFFER_FETCH)) { - if (gstate_c.Supports(GPU_SUPPORTS_GLSL_ES_300) && gl_extensions.EXT_shader_framebuffer_fetch) { - WRITE(p, "#extension GL_EXT_shader_framebuffer_fetch : require\n"); - compat.lastFragData = "fragColor0"; - } else if (gl_extensions.EXT_shader_framebuffer_fetch) { - WRITE(p, "#extension GL_EXT_shader_framebuffer_fetch : require\n"); - compat.lastFragData = "gl_LastFragData[0]"; - } else if (gl_extensions.NV_shader_framebuffer_fetch) { - // GL_NV_shader_framebuffer_fetch is available on mobile platform and ES 2.0 only but not on desktop. - WRITE(p, "#extension GL_NV_shader_framebuffer_fetch : require\n"); - compat.lastFragData = "gl_LastFragData[0]"; - } else if (gl_extensions.ARM_shader_framebuffer_fetch) { - WRITE(p, "#extension GL_ARM_shader_framebuffer_fetch : require\n"); - compat.lastFragData = "gl_LastFragColorARM"; - } - } - - WRITE(p, "precision lowp float;\n"); } else { if (!gl_extensions.ForceGL2 || gl_extensions.IsCoreContext) { if (gl_extensions.VersionGEThan(3, 3, 0)) { @@ -116,29 +88,54 @@ bool GenerateFragmentShaderGLSL(const FShaderID &id, char *buffer, uint64_t *uni compat.glslES30 = true; compat.bitwiseOps = true; compat.texelFetch = "texelFetch"; - WRITE(p, "#version 330\n"); + compat.versionString = "#version 330"; } else if (gl_extensions.VersionGEThan(3, 0, 0)) { compat.fragColor0 = "fragColor0"; compat.bitwiseOps = true; compat.texelFetch = "texelFetch"; - WRITE(p, "#version 130\n"); - if (gl_extensions.EXT_gpu_shader4) { - WRITE(p, "#extension GL_EXT_gpu_shader4 : enable\n"); - } + compat.versionString = "#version 130"; } else { - WRITE(p, "#version 110\n"); + compat.versionString = "#version 110"; if (gl_extensions.EXT_gpu_shader4) { - WRITE(p, "#extension GL_EXT_gpu_shader4 : enable\n"); compat.bitwiseOps = true; compat.texelFetch = "texelFetch2D"; } } } + } - // We remove these everywhere - GL4, GL3, Mac-forced-GL2, etc. + // Here the writing starts! + WRITE(p, "%s\n", compat.versionString); + + if (gstate_c.Supports(GPU_SUPPORTS_ANY_FRAMEBUFFER_FETCH)) { + if (gstate_c.Supports(GPU_SUPPORTS_GLSL_ES_300) && gl_extensions.EXT_shader_framebuffer_fetch) { + WRITE(p, "#extension GL_EXT_shader_framebuffer_fetch : require\n"); + compat.lastFragData = "fragColor0"; + } else if (gl_extensions.EXT_shader_framebuffer_fetch) { + WRITE(p, "#extension GL_EXT_shader_framebuffer_fetch : require\n"); + compat.lastFragData = "gl_LastFragData[0]"; + } else if (gl_extensions.NV_shader_framebuffer_fetch) { + // GL_NV_shader_framebuffer_fetch is available on mobile platform and ES 2.0 only but not on desktop. + WRITE(p, "#extension GL_NV_shader_framebuffer_fetch : require\n"); + compat.lastFragData = "gl_LastFragData[0]"; + } else if (gl_extensions.ARM_shader_framebuffer_fetch) { + WRITE(p, "#extension GL_ARM_shader_framebuffer_fetch : require\n"); + compat.lastFragData = "gl_LastFragColorARM"; + } + } + + if (stencilToAlpha == REPLACE_ALPHA_DUALSOURCE && gl_extensions.EXT_blend_func_extended) { + WRITE(p, "#extension GL_EXT_blend_func_extended : require\n"); + } + if (gl_extensions.EXT_gpu_shader4) { + WRITE(p, "#extension GL_EXT_gpu_shader4 : enable\n"); + } + if (!compat.gles) { WRITE(p, "#define lowp\n"); WRITE(p, "#define mediump\n"); WRITE(p, "#define highp\n"); + } else { + WRITE(p, "precision lowp float;\n"); } WRITE(p, "#define splat3(x) vec3(x)\n"); diff --git a/GPU/GLES/VertexShaderGeneratorGLES.cpp b/GPU/GLES/VertexShaderGeneratorGLES.cpp index 3e8f03e5d4..0f1242e28a 100644 --- a/GPU/GLES/VertexShaderGeneratorGLES.cpp +++ b/GPU/GLES/VertexShaderGeneratorGLES.cpp @@ -99,23 +99,22 @@ bool GenerateVertexShaderGLSL(const VShaderID &id, char *buffer, uint32_t *attrM compat.varying = "varying"; compat.attribute = "attribute"; const char * const * boneWeightDecl = boneWeightAttrDecl; - compat.texelFetch = NULL; + compat.texelFetch = nullptr; + compat.gles = gl_extensions.IsGLES; bool highpFog = false; bool highpTexcoord = false; - if (gl_extensions.IsGLES) { + if (compat.gles) { if (gstate_c.Supports(GPU_SUPPORTS_GLSL_ES_300)) { - WRITE(p, "#version 300 es\n"); + compat.versionString = "#version 300 es"; // GLSL ES 3.0 compat.glslES30 = true; compat.texelFetch = "texelFetch"; } else { - WRITE(p, "#version 100\n"); // GLSL ES 1.0 + compat.versionString = "#version 100"; // GLSL ES 1.0 if (gl_extensions.EXT_gpu_shader4) { - WRITE(p, "#extension GL_EXT_gpu_shader4 : enable\n"); compat.texelFetch = "texelFetch2D"; } } - WRITE(p, "precision highp float;\n"); // PowerVR needs highp to do the fog in MHU correctly. // Others don't, and some can't handle highp in the fragment shader. @@ -125,29 +124,35 @@ bool GenerateVertexShaderGLSL(const VShaderID &id, char *buffer, uint32_t *attrM if (!gl_extensions.ForceGL2 || gl_extensions.IsCoreContext) { if (gl_extensions.VersionGEThan(3, 3, 0)) { compat.glslES30 = true; - WRITE(p, "#version 330\n"); + compat.versionString = "#version 330"; compat.texelFetch = "texelFetch"; } else if (gl_extensions.VersionGEThan(3, 0, 0)) { - WRITE(p, "#version 130\n"); + compat.versionString = "#version 130"; if (gl_extensions.EXT_gpu_shader4) { - WRITE(p, "#extension GL_EXT_gpu_shader4 : enable\n"); compat.texelFetch = "texelFetch"; } } else { - WRITE(p, "#version 110\n"); + compat.versionString = "#version 110"; if (gl_extensions.EXT_gpu_shader4) { - WRITE(p, "#extension GL_EXT_gpu_shader4 : enable\n"); compat.texelFetch = "texelFetch2D"; } } } + } - // We remove these everywhere - GL4, GL3, Mac-forced-GL2, etc. + if (gl_extensions.EXT_gpu_shader4) { + WRITE(p, "#extension GL_EXT_gpu_shader4 : enable\n"); + } + + WRITE(p, "#define splat3(x) vec3(x)\n"); + + if (compat.gles) { + WRITE(p, "precision highp float;\n"); + } else { WRITE(p, "#define lowp\n"); WRITE(p, "#define mediump\n"); WRITE(p, "#define highp\n"); } - WRITE(p, "#define splat3(x) vec3(x)\n"); if (compat.glslES30 || gl_extensions.IsCoreContext) { compat.attribute = "in"; From c45515866b9462e13baef86bd457d0ece2a01697 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Thu, 22 Oct 2020 00:37:11 +0200 Subject: [PATCH 078/275] Cleanup Clean up GLSL language setup further --- GPU/Common/ShaderCommon.h | 4 +- GPU/Directx9/VertexShaderGeneratorHLSL.cpp | 24 ------- GPU/GLES/FragmentShaderGeneratorGLES.cpp | 67 ++++++++++--------- GPU/GLES/VertexShaderGeneratorGLES.cpp | 78 +++++++++------------- GPU/GLES/VertexShaderGeneratorGLES.h | 2 - 5 files changed, 70 insertions(+), 105 deletions(-) diff --git a/GPU/Common/ShaderCommon.h b/GPU/Common/ShaderCommon.h index 34f1dca676..d1d25edb5e 100644 --- a/GPU/Common/ShaderCommon.h +++ b/GPU/Common/ShaderCommon.h @@ -141,13 +141,15 @@ enum DoLightComputation { struct GLSLShaderCompat { const char *versionString; - const char *varying; + const char *varying_fs; + const char *varying_vs; const char *attribute; const char *fragColor0; const char *fragColor1; const char *texture; const char *texelFetch; const char *lastFragData; + const char *framebufferFetchExtension; bool gles; bool glslES30; bool bitwiseOps; diff --git a/GPU/Directx9/VertexShaderGeneratorHLSL.cpp b/GPU/Directx9/VertexShaderGeneratorHLSL.cpp index c8b87305cb..78cb8d1265 100644 --- a/GPU/Directx9/VertexShaderGeneratorHLSL.cpp +++ b/GPU/Directx9/VertexShaderGeneratorHLSL.cpp @@ -423,29 +423,6 @@ bool GenerateVertexShaderHLSL(const VShaderID &id, char *buffer, ShaderLanguage "a_w2.x", "a_w2.y", "a_w2.z", "a_w2.w", }; -#if defined(USE_FOR_LOOP) && defined(USE_BONE_ARRAY) - - // To loop through the weights, we unfortunately need to put them in a float array. - // GLSL ES sucks - no way to directly initialize an array! - switch (numBoneWeights) { - case 1: WRITE(p, " float w[1]; w[0] = a_w1;\n"); break; - case 2: WRITE(p, " float w[2]; w[0] = a_w1.x; w[1] = a_w1.y;\n"); break; - case 3: WRITE(p, " float w[3]; w[0] = a_w1.x; w[1] = a_w1.y; w[2] = a_w1.z;\n"); break; - case 4: WRITE(p, " float w[4]; w[0] = a_w1.x; w[1] = a_w1.y; w[2] = a_w1.z; w[3] = a_w1.w;\n"); break; - case 5: WRITE(p, " float w[5]; w[0] = a_w1.x; w[1] = a_w1.y; w[2] = a_w1.z; w[3] = a_w1.w; w[4] = a_w2;\n"); break; - case 6: WRITE(p, " float w[6]; w[0] = a_w1.x; w[1] = a_w1.y; w[2] = a_w1.z; w[3] = a_w1.w; w[4] = a_w2.x; w[5] = a_w2.y;\n"); break; - case 7: WRITE(p, " float w[7]; w[0] = a_w1.x; w[1] = a_w1.y; w[2] = a_w1.z; w[3] = a_w1.w; w[4] = a_w2.x; w[5] = a_w2.y; w[6] = a_w2.z;\n"); break; - case 8: WRITE(p, " float w[8]; w[0] = a_w1.x; w[1] = a_w1.y; w[2] = a_w1.z; w[3] = a_w1.w; w[4] = a_w2.x; w[5] = a_w2.y; w[6] = a_w2.z; w[7] = a_w2.w;\n"); break; - } - - WRITE(p, " mat4 skinMatrix = w[0] * u_bone[0];\n"); - if (numBoneWeights > 1) { - WRITE(p, " for (int i = 1; i < %i; i++) {\n", numBoneWeights); - WRITE(p, " skinMatrix += w[i] * u_bone[i];\n"); - WRITE(p, " }\n"); - } - -#else if (lang == HLSL_D3D11 || lang == HLSL_D3D11_LEVEL9) { if (numBoneWeights == 1) WRITE(p, " float4x3 skinMatrix = mul(In.a_w1, u_bone[0])"); @@ -471,7 +448,6 @@ bool GenerateVertexShaderHLSL(const VShaderID &id, char *buffer, ShaderLanguage WRITE(p, " + mul(In.%s, u_bone%i)", weightAttr, i); } } -#endif WRITE(p, ";\n"); diff --git a/GPU/GLES/FragmentShaderGeneratorGLES.cpp b/GPU/GLES/FragmentShaderGeneratorGLES.cpp index edd7629614..3747efadc4 100644 --- a/GPU/GLES/FragmentShaderGeneratorGLES.cpp +++ b/GPU/GLES/FragmentShaderGeneratorGLES.cpp @@ -37,13 +37,11 @@ // Missing: Z depth range bool GenerateFragmentShaderGLSL(const FShaderID &id, char *buffer, uint64_t *uniformMask, std::string *errorString) { - char *p = buffer; - *uniformMask = 0; - // In GLSL ES 3.0, you use "in" variables instead of varying. GLSLShaderCompat compat{}; - compat.varying = "varying"; + compat.varying_vs = "varying"; + compat.varying_fs = "varying"; compat.fragColor0 = "gl_FragColor"; compat.fragColor1 = "fragColor1"; compat.texture = "texture2D"; @@ -51,10 +49,6 @@ bool GenerateFragmentShaderGLSL(const FShaderID &id, char *buffer, uint64_t *uni compat.bitwiseOps = false; compat.lastFragData = nullptr; compat.gles = gl_extensions.IsGLES; - bool highpFog = false; - bool highpTexcoord = false; - - ReplaceAlphaType stencilToAlpha = static_cast(id.Bits(FS_BIT_STENCIL_TO_ALPHA, 2)); if (compat.gles) { if (gstate_c.Supports(GPU_SUPPORTS_GLSL_ES_300)) { @@ -75,25 +69,20 @@ bool GenerateFragmentShaderGLSL(const FShaderID &id, char *buffer, uint64_t *uni compat.fragColor1 = "gl_SecondaryFragColorEXT"; } } - - // PowerVR needs highp to do the fog in MHU correctly. - // Others don't, and some can't handle highp in the fragment shader. - highpFog = (gl_extensions.bugs & BUG_PVR_SHADER_PRECISION_BAD) ? true : false; - highpTexcoord = highpFog; } else { if (!gl_extensions.ForceGL2 || gl_extensions.IsCoreContext) { if (gl_extensions.VersionGEThan(3, 3, 0)) { + compat.versionString = "#version 330"; compat.fragColor0 = "fragColor0"; compat.texture = "texture"; compat.glslES30 = true; compat.bitwiseOps = true; compat.texelFetch = "texelFetch"; - compat.versionString = "#version 330"; } else if (gl_extensions.VersionGEThan(3, 0, 0)) { + compat.versionString = "#version 130"; compat.fragColor0 = "fragColor0"; compat.bitwiseOps = true; compat.texelFetch = "texelFetch"; - compat.versionString = "#version 130"; } else { compat.versionString = "#version 110"; if (gl_extensions.EXT_gpu_shader4) { @@ -104,32 +93,54 @@ bool GenerateFragmentShaderGLSL(const FShaderID &id, char *buffer, uint64_t *uni } } - // Here the writing starts! - WRITE(p, "%s\n", compat.versionString); - if (gstate_c.Supports(GPU_SUPPORTS_ANY_FRAMEBUFFER_FETCH)) { if (gstate_c.Supports(GPU_SUPPORTS_GLSL_ES_300) && gl_extensions.EXT_shader_framebuffer_fetch) { - WRITE(p, "#extension GL_EXT_shader_framebuffer_fetch : require\n"); + compat.framebufferFetchExtension = "#extension GL_EXT_shader_framebuffer_fetch : require"; compat.lastFragData = "fragColor0"; } else if (gl_extensions.EXT_shader_framebuffer_fetch) { - WRITE(p, "#extension GL_EXT_shader_framebuffer_fetch : require\n"); + compat.framebufferFetchExtension = "#extension GL_EXT_shader_framebuffer_fetch : require"; compat.lastFragData = "gl_LastFragData[0]"; } else if (gl_extensions.NV_shader_framebuffer_fetch) { // GL_NV_shader_framebuffer_fetch is available on mobile platform and ES 2.0 only but not on desktop. - WRITE(p, "#extension GL_NV_shader_framebuffer_fetch : require\n"); + compat.framebufferFetchExtension = "#extension GL_NV_shader_framebuffer_fetch : require"; compat.lastFragData = "gl_LastFragData[0]"; } else if (gl_extensions.ARM_shader_framebuffer_fetch) { - WRITE(p, "#extension GL_ARM_shader_framebuffer_fetch : require\n"); + compat.framebufferFetchExtension = "#extension GL_ARM_shader_framebuffer_fetch : require"; compat.lastFragData = "gl_LastFragColorARM"; } } + if (compat.glslES30 || gl_extensions.IsCoreContext) { + compat.varying_vs = "out"; + compat.varying_fs = "in"; + compat.attribute = "in"; + } + + bool highpFog = false; + bool highpTexcoord = false; + if (compat.gles) { + // PowerVR needs highp to do the fog in MHU correctly. + // Others don't, and some can't handle highp in the fragment shader. + highpFog = (gl_extensions.bugs & BUG_PVR_SHADER_PRECISION_BAD) ? true : false; + highpTexcoord = highpFog; + } + + ReplaceAlphaType stencilToAlpha = static_cast(id.Bits(FS_BIT_STENCIL_TO_ALPHA, 2)); + + char *p = buffer; + + // Here the writing starts! + WRITE(p, "%s\n", compat.versionString); + if (stencilToAlpha == REPLACE_ALPHA_DUALSOURCE && gl_extensions.EXT_blend_func_extended) { WRITE(p, "#extension GL_EXT_blend_func_extended : require\n"); } if (gl_extensions.EXT_gpu_shader4) { WRITE(p, "#extension GL_EXT_gpu_shader4 : enable\n"); } + if (compat.framebufferFetchExtension) { + WRITE(p, "%s\n", compat.framebufferFetchExtension); + } if (!compat.gles) { WRITE(p, "#define lowp\n"); WRITE(p, "#define mediump\n"); @@ -140,10 +151,6 @@ bool GenerateFragmentShaderGLSL(const FShaderID &id, char *buffer, uint64_t *uni WRITE(p, "#define splat3(x) vec3(x)\n"); - if (compat.glslES30 || gl_extensions.IsCoreContext) { - compat.varying = "in"; - } - bool lmode = id.Bit(FS_BIT_LMODE); bool doTexture = id.Bit(FS_BIT_DO_TEXTURE); bool enableFog = id.Bit(FS_BIT_ENABLE_FOG); @@ -238,16 +245,16 @@ bool GenerateFragmentShaderGLSL(const FShaderID &id, char *buffer, uint64_t *uni WRITE(p, "uniform vec3 u_texenv;\n"); } - WRITE(p, "%s %s vec4 v_color0;\n", shading, compat.varying); + WRITE(p, "%s %s vec4 v_color0;\n", shading, compat.varying_fs); if (lmode) - WRITE(p, "%s %s vec3 v_color1;\n", shading, compat.varying); + WRITE(p, "%s %s vec3 v_color1;\n", shading, compat.varying_fs); if (enableFog) { *uniformMask |= DIRTY_FOGCOLOR; WRITE(p, "uniform vec3 u_fogcolor;\n"); - WRITE(p, "%s %s float v_fogdepth;\n", compat.varying, highpFog ? "highp" : "mediump"); + WRITE(p, "%s %s float v_fogdepth;\n", compat.varying_fs, highpFog ? "highp" : "mediump"); } if (doTexture) { - WRITE(p, "%s %s vec3 v_texcoord;\n", compat.varying, highpTexcoord ? "highp" : "mediump"); + WRITE(p, "%s %s vec3 v_texcoord;\n", compat.varying_fs, highpTexcoord ? "highp" : "mediump"); } if (!g_Config.bFragmentTestCache) { diff --git a/GPU/GLES/VertexShaderGeneratorGLES.cpp b/GPU/GLES/VertexShaderGeneratorGLES.cpp index 0f1242e28a..5ffc4d6982 100644 --- a/GPU/GLES/VertexShaderGeneratorGLES.cpp +++ b/GPU/GLES/VertexShaderGeneratorGLES.cpp @@ -88,21 +88,17 @@ static const char * const boneWeightInDecl[9] = { // is a bit of a rare configuration, although quite common on mobile. bool GenerateVertexShaderGLSL(const VShaderID &id, char *buffer, uint32_t *attrMask, uint64_t *uniformMask, std::string *errorString) { - char *p = buffer; *attrMask = 0; *uniformMask = 0; - // #define USE_FOR_LOOP // In GLSL ES 3.0, you use "out" variables instead. GLSLShaderCompat compat{}; compat.glslES30 = false; - compat.varying = "varying"; + compat.varying_vs = "varying"; + compat.varying_fs = "varying"; compat.attribute = "attribute"; - const char * const * boneWeightDecl = boneWeightAttrDecl; compat.texelFetch = nullptr; compat.gles = gl_extensions.IsGLES; - bool highpFog = false; - bool highpTexcoord = false; if (compat.gles) { if (gstate_c.Supports(GPU_SUPPORTS_GLSL_ES_300)) { @@ -115,11 +111,6 @@ bool GenerateVertexShaderGLSL(const VShaderID &id, char *buffer, uint32_t *attrM compat.texelFetch = "texelFetch2D"; } } - - // PowerVR needs highp to do the fog in MHU correctly. - // Others don't, and some can't handle highp in the fragment shader. - highpFog = (gl_extensions.bugs & BUG_PVR_SHADER_PRECISION_BAD) ? true : false; - highpTexcoord = highpFog; } else { if (!gl_extensions.ForceGL2 || gl_extensions.IsCoreContext) { if (gl_extensions.VersionGEThan(3, 3, 0)) { @@ -140,6 +131,25 @@ bool GenerateVertexShaderGLSL(const VShaderID &id, char *buffer, uint32_t *attrM } } + if (compat.glslES30 || gl_extensions.IsCoreContext) { + compat.attribute = "in"; + compat.varying_vs = "out"; + compat.varying_fs = "in"; + } + + char *p = buffer; + // Here the writing starts! + WRITE(p, "%s\n", compat.versionString); + + bool highpFog = false; + bool highpTexcoord = false; + if (compat.gles) { + // PowerVR needs highp to do the fog in MHU correctly. + // Others don't, and some can't handle highp in the fragment shader. + highpFog = (gl_extensions.bugs & BUG_PVR_SHADER_PRECISION_BAD) ? true : false; + highpTexcoord = highpFog; + } + if (gl_extensions.EXT_gpu_shader4) { WRITE(p, "#extension GL_EXT_gpu_shader4 : enable\n"); } @@ -154,12 +164,6 @@ bool GenerateVertexShaderGLSL(const VShaderID &id, char *buffer, uint32_t *attrM WRITE(p, "#define highp\n"); } - if (compat.glslES30 || gl_extensions.IsCoreContext) { - compat.attribute = "in"; - compat.varying = "out"; - boneWeightDecl = boneWeightInDecl; - } - bool isModeThrough = id.Bit(VS_BIT_IS_THROUGH); bool lmode = id.Bit(VS_BIT_LMODE); bool doTexture = id.Bit(VS_BIT_DO_TEXTURE); @@ -211,6 +215,10 @@ bool GenerateVertexShaderGLSL(const VShaderID &id, char *buffer, uint32_t *attrM int boneWeightScale = id.Bits(VS_BIT_WEIGHT_FMTSCALE, 2); if (enableBones) { numBoneWeights = 1 + id.Bits(VS_BIT_BONES, 3); + const char * const * boneWeightDecl = boneWeightAttrDecl; + if (!strcmp(compat.attribute, "in")) { + boneWeightDecl = boneWeightInDecl; + } WRITE(p, "%s", boneWeightDecl[numBoneWeights]); *attrMask |= 1 << ATTR_W1; if (numBoneWeights >= 5) @@ -341,21 +349,21 @@ bool GenerateVertexShaderGLSL(const VShaderID &id, char *buffer, uint32_t *attrM *uniformMask |= DIRTY_CULLRANGE; } - WRITE(p, "%s%s lowp vec4 v_color0;\n", shading, compat.varying); + WRITE(p, "%s%s lowp vec4 v_color0;\n", shading, compat.varying_vs); if (lmode) { - WRITE(p, "%s%s lowp vec3 v_color1;\n", shading, compat.varying); + WRITE(p, "%s%s lowp vec3 v_color1;\n", shading, compat.varying_vs); } if (doTexture) { - WRITE(p, "%s %s vec3 v_texcoord;\n", compat.varying, highpTexcoord ? "highp" : "mediump"); + WRITE(p, "%s %s vec3 v_texcoord;\n", compat.varying_vs, highpTexcoord ? "highp" : "mediump"); } if (enableFog) { // See the fragment shader generator if (highpFog) { - WRITE(p, "%s highp float v_fogdepth;\n", compat.varying); + WRITE(p, "%s highp float v_fogdepth;\n", compat.varying_vs); } else { - WRITE(p, "%s mediump float v_fogdepth;\n", compat.varying); + WRITE(p, "%s mediump float v_fogdepth;\n", compat.varying_vs); } } @@ -523,30 +531,6 @@ bool GenerateVertexShaderGLSL(const VShaderID &id, char *buffer, uint32_t *attrM "w2.x", "w2.y", "w2.z", "w2.w", }; -#if defined(USE_FOR_LOOP) && defined(USE_BONE_ARRAY) - - // To loop through the weights, we unfortunately need to put them in a float array. - // GLSL ES sucks - no way to directly initialize an array! - switch (numBoneWeights) { - case 1: WRITE(p, " float w[1]; w[0] = w1;\n"); break; - case 2: WRITE(p, " float w[2]; w[0] = w1.x; w[1] = w1.y;\n"); break; - case 3: WRITE(p, " float w[3]; w[0] = w1.x; w[1] = w1.y; w[2] = w1.z;\n"); break; - case 4: WRITE(p, " float w[4]; w[0] = w1.x; w[1] = w1.y; w[2] = w1.z; w[3] = w1.w;\n"); break; - case 5: WRITE(p, " float w[5]; w[0] = w1.x; w[1] = w1.y; w[2] = w1.z; w[3] = w1.w; w[4] = w2;\n"); break; - case 6: WRITE(p, " float w[6]; w[0] = w1.x; w[1] = w1.y; w[2] = w1.z; w[3] = w1.w; w[4] = w2.x; w[5] = w2.y;\n"); break; - case 7: WRITE(p, " float w[7]; w[0] = w1.x; w[1] = w1.y; w[2] = w1.z; w[3] = w1.w; w[4] = w2.x; w[5] = w2.y; w[6] = w2.z;\n"); break; - case 8: WRITE(p, " float w[8]; w[0] = w1.x; w[1] = w1.y; w[2] = w1.z; w[3] = w1.w; w[4] = w2.x; w[5] = w2.y; w[6] = w2.z; w[7] = w2.w;\n"); break; - } - - WRITE(p, " mat4 skinMatrix = w[0] * u_bone[0];\n"); - if (numBoneWeights > 1) { - WRITE(p, " for (int i = 1; i < %i; i++) {\n", numBoneWeights); - WRITE(p, " skinMatrix += w[i] * u_bone[i];\n"); - WRITE(p, " }\n"); - } - -#else - #ifdef USE_BONE_ARRAY if (numBoneWeights == 1) WRITE(p, " mat4 skinMatrix = w1 * u_bone[0]"); @@ -573,8 +557,6 @@ bool GenerateVertexShaderGLSL(const VShaderID &id, char *buffer, uint32_t *attrM if (numBoneWeights == 5 && i == 4) weightAttr = "w2"; WRITE(p, " + %s * u_bone%i", weightAttr, i); } -#endif - #endif WRITE(p, ";\n"); diff --git a/GPU/GLES/VertexShaderGeneratorGLES.h b/GPU/GLES/VertexShaderGeneratorGLES.h index 0260d694b5..e1287e040d 100644 --- a/GPU/GLES/VertexShaderGeneratorGLES.h +++ b/GPU/GLES/VertexShaderGeneratorGLES.h @@ -19,8 +19,6 @@ #include "Common/CommonTypes.h" -// #define USE_BONE_ARRAY - struct VShaderID; bool GenerateVertexShaderGLSL(const VShaderID &id, char *buffer, uint32_t *attrMask, uint64_t *uniformMask, std::string *errorString); From 9e245d68357d76a921ff86bc7d732ebd8533650f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Thu, 22 Oct 2020 09:04:42 +0200 Subject: [PATCH 079/275] OpenGL: Share the shader version detection. Use a version integer instead of a string --- GPU/Common/ShaderCommon.h | 4 +- GPU/GLES/FragmentShaderGeneratorGLES.cpp | 85 +----------------------- GPU/GLES/FragmentShaderGeneratorGLES.h | 4 +- GPU/GLES/ShaderManagerGLES.cpp | 85 +++++++++++++++++++++++- GPU/GLES/ShaderManagerGLES.h | 2 + GPU/GLES/VertexShaderGeneratorGLES.cpp | 51 +------------- GPU/GLES/VertexShaderGeneratorGLES.h | 2 +- 7 files changed, 95 insertions(+), 138 deletions(-) diff --git a/GPU/Common/ShaderCommon.h b/GPU/Common/ShaderCommon.h index d1d25edb5e..16fcae3ae1 100644 --- a/GPU/Common/ShaderCommon.h +++ b/GPU/Common/ShaderCommon.h @@ -140,7 +140,8 @@ enum DoLightComputation { }; struct GLSLShaderCompat { - const char *versionString; + int glslVersionNumber; + bool gles; const char *varying_fs; const char *varying_vs; const char *attribute; @@ -150,7 +151,6 @@ struct GLSLShaderCompat { const char *texelFetch; const char *lastFragData; const char *framebufferFetchExtension; - bool gles; bool glslES30; bool bitwiseOps; }; diff --git a/GPU/GLES/FragmentShaderGeneratorGLES.cpp b/GPU/GLES/FragmentShaderGeneratorGLES.cpp index 3747efadc4..1dd89bb2b4 100644 --- a/GPU/GLES/FragmentShaderGeneratorGLES.cpp +++ b/GPU/GLES/FragmentShaderGeneratorGLES.cpp @@ -33,89 +33,9 @@ #define WRITE p+=sprintf -// #define DEBUG_SHADER - -// Missing: Z depth range -bool GenerateFragmentShaderGLSL(const FShaderID &id, char *buffer, uint64_t *uniformMask, std::string *errorString) { +bool GenerateFragmentShaderGLSL(const FShaderID &id, char *buffer, const GLSLShaderCompat &compat, uint64_t *uniformMask, std::string *errorString) { *uniformMask = 0; - GLSLShaderCompat compat{}; - compat.varying_vs = "varying"; - compat.varying_fs = "varying"; - compat.fragColor0 = "gl_FragColor"; - compat.fragColor1 = "fragColor1"; - compat.texture = "texture2D"; - compat.texelFetch = nullptr; - compat.bitwiseOps = false; - compat.lastFragData = nullptr; - compat.gles = gl_extensions.IsGLES; - - if (compat.gles) { - if (gstate_c.Supports(GPU_SUPPORTS_GLSL_ES_300)) { - compat.versionString = "#version 300 es"; // GLSL ES 3.0 - compat.fragColor0 = "fragColor0"; - compat.texture = "texture"; - compat.glslES30 = true; - compat.bitwiseOps = true; - compat.texelFetch = "texelFetch"; - } else { - compat.versionString = "#version 100"; // GLSL ES 1.0 - if (gl_extensions.EXT_gpu_shader4) { - compat.bitwiseOps = true; - compat.texelFetch = "texelFetch2D"; - } - if (gl_extensions.EXT_blend_func_extended) { - // Oldy moldy GLES, so use the fixed output name. - compat.fragColor1 = "gl_SecondaryFragColorEXT"; - } - } - } else { - if (!gl_extensions.ForceGL2 || gl_extensions.IsCoreContext) { - if (gl_extensions.VersionGEThan(3, 3, 0)) { - compat.versionString = "#version 330"; - compat.fragColor0 = "fragColor0"; - compat.texture = "texture"; - compat.glslES30 = true; - compat.bitwiseOps = true; - compat.texelFetch = "texelFetch"; - } else if (gl_extensions.VersionGEThan(3, 0, 0)) { - compat.versionString = "#version 130"; - compat.fragColor0 = "fragColor0"; - compat.bitwiseOps = true; - compat.texelFetch = "texelFetch"; - } else { - compat.versionString = "#version 110"; - if (gl_extensions.EXT_gpu_shader4) { - compat.bitwiseOps = true; - compat.texelFetch = "texelFetch2D"; - } - } - } - } - - if (gstate_c.Supports(GPU_SUPPORTS_ANY_FRAMEBUFFER_FETCH)) { - if (gstate_c.Supports(GPU_SUPPORTS_GLSL_ES_300) && gl_extensions.EXT_shader_framebuffer_fetch) { - compat.framebufferFetchExtension = "#extension GL_EXT_shader_framebuffer_fetch : require"; - compat.lastFragData = "fragColor0"; - } else if (gl_extensions.EXT_shader_framebuffer_fetch) { - compat.framebufferFetchExtension = "#extension GL_EXT_shader_framebuffer_fetch : require"; - compat.lastFragData = "gl_LastFragData[0]"; - } else if (gl_extensions.NV_shader_framebuffer_fetch) { - // GL_NV_shader_framebuffer_fetch is available on mobile platform and ES 2.0 only but not on desktop. - compat.framebufferFetchExtension = "#extension GL_NV_shader_framebuffer_fetch : require"; - compat.lastFragData = "gl_LastFragData[0]"; - } else if (gl_extensions.ARM_shader_framebuffer_fetch) { - compat.framebufferFetchExtension = "#extension GL_ARM_shader_framebuffer_fetch : require"; - compat.lastFragData = "gl_LastFragColorARM"; - } - } - - if (compat.glslES30 || gl_extensions.IsCoreContext) { - compat.varying_vs = "out"; - compat.varying_fs = "in"; - compat.attribute = "in"; - } - bool highpFog = false; bool highpTexcoord = false; if (compat.gles) { @@ -129,8 +49,7 @@ bool GenerateFragmentShaderGLSL(const FShaderID &id, char *buffer, uint64_t *uni char *p = buffer; - // Here the writing starts! - WRITE(p, "%s\n", compat.versionString); + WRITE(p, "#version %d%s\n", compat.glslVersionNumber, compat.gles ? " es" : ""); if (stencilToAlpha == REPLACE_ALPHA_DUALSOURCE && gl_extensions.EXT_blend_func_extended) { WRITE(p, "#extension GL_EXT_blend_func_extended : require\n"); diff --git a/GPU/GLES/FragmentShaderGeneratorGLES.h b/GPU/GLES/FragmentShaderGeneratorGLES.h index 6f0aa73b23..fde1158e93 100644 --- a/GPU/GLES/FragmentShaderGeneratorGLES.h +++ b/GPU/GLES/FragmentShaderGeneratorGLES.h @@ -17,6 +17,8 @@ #pragma once +#include "GPU/Common/ShaderCommon.h" + struct FShaderID; -bool GenerateFragmentShaderGLSL(const FShaderID &id, char *buffer, uint64_t *uniformMask, std::string *errorString); +bool GenerateFragmentShaderGLSL(const FShaderID &id, char *buffer, const GLSLShaderCompat &compat, uint64_t *uniformMask, std::string *errorString); diff --git a/GPU/GLES/ShaderManagerGLES.cpp b/GPU/GLES/ShaderManagerGLES.cpp index eda3294c0e..4be9aace83 100644 --- a/GPU/GLES/ShaderManagerGLES.cpp +++ b/GPU/GLES/ShaderManagerGLES.cpp @@ -576,12 +576,93 @@ ShaderManagerGLES::ShaderManagerGLES(Draw::DrawContext *draw) codeBuffer_ = new char[16384]; lastFSID_.set_invalid(); lastVSID_.set_invalid(); + DetectShaderLanguage(); } ShaderManagerGLES::~ShaderManagerGLES() { delete [] codeBuffer_; } +void ShaderManagerGLES::DetectShaderLanguage() { + GLSLShaderCompat &compat = compat_; + compat.attribute = "attribute"; + compat.varying_vs = "varying"; + compat.varying_fs = "varying"; + compat.fragColor0 = "gl_FragColor"; + compat.fragColor1 = "fragColor1"; + compat.texture = "texture2D"; + compat.texelFetch = nullptr; + compat.bitwiseOps = false; + compat.lastFragData = nullptr; + compat.gles = gl_extensions.IsGLES; + + if (compat.gles) { + if (gstate_c.Supports(GPU_SUPPORTS_GLSL_ES_300)) { + compat.glslVersionNumber = 300; // GLSL ES 3.0 + compat.fragColor0 = "fragColor0"; + compat.texture = "texture"; + compat.glslES30 = true; + compat.bitwiseOps = true; + compat.texelFetch = "texelFetch"; + } else { + compat.glslVersionNumber = 100; // GLSL ES 1.0 + if (gl_extensions.EXT_gpu_shader4) { + compat.bitwiseOps = true; + compat.texelFetch = "texelFetch2D"; + } + if (gl_extensions.EXT_blend_func_extended) { + // Oldy moldy GLES, so use the fixed output name. + compat.fragColor1 = "gl_SecondaryFragColorEXT"; + } + } + } else { + if (!gl_extensions.ForceGL2 || gl_extensions.IsCoreContext) { + if (gl_extensions.VersionGEThan(3, 3, 0)) { + compat.glslVersionNumber = 330; + compat.fragColor0 = "fragColor0"; + compat.texture = "texture"; + compat.glslES30 = true; + compat.bitwiseOps = true; + compat.texelFetch = "texelFetch"; + } else if (gl_extensions.VersionGEThan(3, 0, 0)) { + compat.glslVersionNumber = 130; + compat.fragColor0 = "fragColor0"; + compat.bitwiseOps = true; + compat.texelFetch = "texelFetch"; + } else { + compat.glslVersionNumber = 110; + if (gl_extensions.EXT_gpu_shader4) { + compat.bitwiseOps = true; + compat.texelFetch = "texelFetch2D"; + } + } + } + } + + if (gstate_c.Supports(GPU_SUPPORTS_ANY_FRAMEBUFFER_FETCH)) { + if (gstate_c.Supports(GPU_SUPPORTS_GLSL_ES_300) && gl_extensions.EXT_shader_framebuffer_fetch) { + compat.framebufferFetchExtension = "#extension GL_EXT_shader_framebuffer_fetch : require"; + compat.lastFragData = "fragColor0"; + } else if (gl_extensions.EXT_shader_framebuffer_fetch) { + compat.framebufferFetchExtension = "#extension GL_EXT_shader_framebuffer_fetch : require"; + compat.lastFragData = "gl_LastFragData[0]"; + } else if (gl_extensions.NV_shader_framebuffer_fetch) { + // GL_NV_shader_framebuffer_fetch is available on mobile platform and ES 2.0 only but not on desktop. + compat.framebufferFetchExtension = "#extension GL_NV_shader_framebuffer_fetch : require"; + compat.lastFragData = "gl_LastFragData[0]"; + } else if (gl_extensions.ARM_shader_framebuffer_fetch) { + compat.framebufferFetchExtension = "#extension GL_ARM_shader_framebuffer_fetch : require"; + compat.lastFragData = "gl_LastFragColorARM"; + } + } + + if (compat.glslES30 || gl_extensions.IsCoreContext) { + compat.varying_vs = "out"; + compat.varying_fs = "in"; + compat.attribute = "in"; + } +} + void ShaderManagerGLES::Clear() { DirtyLastShader(); for (auto iter = linkedShaderCache_.begin(); iter != linkedShaderCache_.end(); ++iter) { @@ -630,7 +711,7 @@ void ShaderManagerGLES::DirtyLastShader() { Shader *ShaderManagerGLES::CompileFragmentShader(FShaderID FSID) { uint64_t uniformMask; std::string errorString; - if (!GenerateFragmentShaderGLSL(FSID, codeBuffer_, &uniformMask, &errorString)) { + if (!GenerateFragmentShaderGLSL(FSID, codeBuffer_, compat_, &uniformMask, &errorString)) { ERROR_LOG(G3D, "Shader gen error: %s", errorString.c_str()); return nullptr; } @@ -643,7 +724,7 @@ Shader *ShaderManagerGLES::CompileVertexShader(VShaderID VSID) { uint32_t attrMask; uint64_t uniformMask; std::string errorString; - if (!GenerateVertexShaderGLSL(VSID, codeBuffer_, &attrMask, &uniformMask, &errorString)) { + if (!GenerateVertexShaderGLSL(VSID, codeBuffer_, compat_, &attrMask, &uniformMask, &errorString)) { ERROR_LOG(G3D, "Shader gen error: %s", errorString.c_str()); return nullptr; } diff --git a/GPU/GLES/ShaderManagerGLES.h b/GPU/GLES/ShaderManagerGLES.h index 613fab8eaf..7d652311f1 100644 --- a/GPU/GLES/ShaderManagerGLES.h +++ b/GPU/GLES/ShaderManagerGLES.h @@ -183,6 +183,7 @@ private: void Clear(); Shader *CompileFragmentShader(FShaderID id); Shader *CompileVertexShader(VShaderID id); + void DetectShaderLanguage(); struct LinkedShaderCacheEntry { LinkedShaderCacheEntry(Shader *vs_, Shader *fs_, LinkedShader *ls_) @@ -195,6 +196,7 @@ private: typedef std::vector LinkedShaderCache; GLRenderManager *render_; + GLSLShaderCompat compat_{}; LinkedShaderCache linkedShaderCache_; bool lastVShaderSame_; diff --git a/GPU/GLES/VertexShaderGeneratorGLES.cpp b/GPU/GLES/VertexShaderGeneratorGLES.cpp index 5ffc4d6982..b2fde269c8 100644 --- a/GPU/GLES/VertexShaderGeneratorGLES.cpp +++ b/GPU/GLES/VertexShaderGeneratorGLES.cpp @@ -87,59 +87,12 @@ static const char * const boneWeightInDecl[9] = { // TODO: Skip all this if we can actually get a 16-bit depth buffer along with stencil, which // is a bit of a rare configuration, although quite common on mobile. -bool GenerateVertexShaderGLSL(const VShaderID &id, char *buffer, uint32_t *attrMask, uint64_t *uniformMask, std::string *errorString) { +bool GenerateVertexShaderGLSL(const VShaderID &id, char *buffer, const GLSLShaderCompat &compat, uint32_t *attrMask, uint64_t *uniformMask, std::string *errorString) { *attrMask = 0; *uniformMask = 0; - // In GLSL ES 3.0, you use "out" variables instead. - GLSLShaderCompat compat{}; - compat.glslES30 = false; - compat.varying_vs = "varying"; - compat.varying_fs = "varying"; - compat.attribute = "attribute"; - compat.texelFetch = nullptr; - compat.gles = gl_extensions.IsGLES; - - if (compat.gles) { - if (gstate_c.Supports(GPU_SUPPORTS_GLSL_ES_300)) { - compat.versionString = "#version 300 es"; // GLSL ES 3.0 - compat.glslES30 = true; - compat.texelFetch = "texelFetch"; - } else { - compat.versionString = "#version 100"; // GLSL ES 1.0 - if (gl_extensions.EXT_gpu_shader4) { - compat.texelFetch = "texelFetch2D"; - } - } - } else { - if (!gl_extensions.ForceGL2 || gl_extensions.IsCoreContext) { - if (gl_extensions.VersionGEThan(3, 3, 0)) { - compat.glslES30 = true; - compat.versionString = "#version 330"; - compat.texelFetch = "texelFetch"; - } else if (gl_extensions.VersionGEThan(3, 0, 0)) { - compat.versionString = "#version 130"; - if (gl_extensions.EXT_gpu_shader4) { - compat.texelFetch = "texelFetch"; - } - } else { - compat.versionString = "#version 110"; - if (gl_extensions.EXT_gpu_shader4) { - compat.texelFetch = "texelFetch2D"; - } - } - } - } - - if (compat.glslES30 || gl_extensions.IsCoreContext) { - compat.attribute = "in"; - compat.varying_vs = "out"; - compat.varying_fs = "in"; - } - char *p = buffer; - // Here the writing starts! - WRITE(p, "%s\n", compat.versionString); + WRITE(p, "#version %d%s\n", compat.glslVersionNumber, compat.gles ? " es" : ""); bool highpFog = false; bool highpTexcoord = false; diff --git a/GPU/GLES/VertexShaderGeneratorGLES.h b/GPU/GLES/VertexShaderGeneratorGLES.h index e1287e040d..9617e47a97 100644 --- a/GPU/GLES/VertexShaderGeneratorGLES.h +++ b/GPU/GLES/VertexShaderGeneratorGLES.h @@ -21,4 +21,4 @@ struct VShaderID; -bool GenerateVertexShaderGLSL(const VShaderID &id, char *buffer, uint32_t *attrMask, uint64_t *uniformMask, std::string *errorString); +bool GenerateVertexShaderGLSL(const VShaderID &id, char *buffer, const GLSLShaderCompat &compat, uint32_t *attrMask, uint64_t *uniformMask, std::string *errorString); From ef18938aa07379f550428d3f67f839f45a8dd559 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Thu, 22 Oct 2020 22:36:02 +0200 Subject: [PATCH 080/275] Hack up a test comparing Vulkan fragment haders generated by the GL GLSL generator to the ones generated by the Vulkan generator. --- GPU/Common/ShaderCommon.h | 3 + GPU/GLES/FragmentShaderGeneratorGLES.cpp | 314 ++++++++++++------- GPU/GLES/ShaderManagerGLES.cpp | 4 +- GPU/GLES/ShaderManagerGLES.h | 2 +- GPU/Vulkan/FragmentShaderGeneratorVulkan.cpp | 4 +- unittest/TestShaderGenerators.cpp | 75 ++++- 6 files changed, 276 insertions(+), 126 deletions(-) diff --git a/GPU/Common/ShaderCommon.h b/GPU/Common/ShaderCommon.h index 16fcae3ae1..2b945ad426 100644 --- a/GPU/Common/ShaderCommon.h +++ b/GPU/Common/ShaderCommon.h @@ -31,6 +31,8 @@ enum ShaderLanguage { HLSL_DX9, HLSL_D3D11, HLSL_D3D11_LEVEL9, + + TEST_GLSL_VULKAN, }; enum DebugShaderType { @@ -142,6 +144,7 @@ enum DoLightComputation { struct GLSLShaderCompat { int glslVersionNumber; bool gles; + bool vulkan; const char *varying_fs; const char *varying_vs; const char *attribute; diff --git a/GPU/GLES/FragmentShaderGeneratorGLES.cpp b/GPU/GLES/FragmentShaderGeneratorGLES.cpp index 1dd89bb2b4..11ce7cf1c1 100644 --- a/GPU/GLES/FragmentShaderGeneratorGLES.cpp +++ b/GPU/GLES/FragmentShaderGeneratorGLES.cpp @@ -25,6 +25,7 @@ #include "Core/Config.h" #include "GPU/Common/GPUStateUtils.h" #include "GPU/Common/ShaderId.h" +#include "GPU/Common/ShaderUniforms.h" #include "GPU/GLES/FragmentShaderGeneratorGLES.h" #include "GPU/GLES/FramebufferManagerGLES.h" #include "GPU/GLES/ShaderManagerGLES.h" @@ -33,11 +34,21 @@ #define WRITE p+=sprintf +static const char *vulkan_glsl_preamble = +"#version 450\n" +"#extension GL_ARB_separate_shader_objects : enable\n" +"#extension GL_ARB_shading_language_420pack : enable\n" +"#extension GL_ARB_conservative_depth : enable\n" +"#extension GL_ARB_shader_image_load_store : enable\n" +"#define splat3(x) vec3(x)\n\n"; + bool GenerateFragmentShaderGLSL(const FShaderID &id, char *buffer, const GLSLShaderCompat &compat, uint64_t *uniformMask, std::string *errorString) { *uniformMask = 0; bool highpFog = false; bool highpTexcoord = false; + bool fragmentTestCache = g_Config.bFragmentTestCache && !compat.vulkan; + if (compat.gles) { // PowerVR needs highp to do the fog in MHU correctly. // Others don't, and some can't handle highp in the fragment shader. @@ -49,26 +60,30 @@ bool GenerateFragmentShaderGLSL(const FShaderID &id, char *buffer, const GLSLSha char *p = buffer; - WRITE(p, "#version %d%s\n", compat.glslVersionNumber, compat.gles ? " es" : ""); - - if (stencilToAlpha == REPLACE_ALPHA_DUALSOURCE && gl_extensions.EXT_blend_func_extended) { - WRITE(p, "#extension GL_EXT_blend_func_extended : require\n"); - } - if (gl_extensions.EXT_gpu_shader4) { - WRITE(p, "#extension GL_EXT_gpu_shader4 : enable\n"); - } - if (compat.framebufferFetchExtension) { - WRITE(p, "%s\n", compat.framebufferFetchExtension); - } - if (!compat.gles) { - WRITE(p, "#define lowp\n"); - WRITE(p, "#define mediump\n"); - WRITE(p, "#define highp\n"); + if (compat.vulkan) { + WRITE(p, vulkan_glsl_preamble); } else { - WRITE(p, "precision lowp float;\n"); - } + WRITE(p, "#version %d%s\n", compat.glslVersionNumber, compat.gles ? " es" : ""); - WRITE(p, "#define splat3(x) vec3(x)\n"); + if (stencilToAlpha == REPLACE_ALPHA_DUALSOURCE && gl_extensions.EXT_blend_func_extended) { + WRITE(p, "#extension GL_EXT_blend_func_extended : require\n"); + } + if (gl_extensions.EXT_gpu_shader4) { + WRITE(p, "#extension GL_EXT_gpu_shader4 : enable\n"); + } + if (compat.framebufferFetchExtension) { + WRITE(p, "%s\n", compat.framebufferFetchExtension); + } + if (!compat.gles) { + WRITE(p, "#define lowp\n"); + WRITE(p, "#define mediump\n"); + WRITE(p, "#define highp\n"); + } else { + WRITE(p, "precision lowp float;\n"); + } + + WRITE(p, "#define splat3(x) vec3(x)\n"); + } bool lmode = id.Bit(FS_BIT_LMODE); bool doTexture = id.Bit(FS_BIT_DO_TEXTURE); @@ -97,118 +112,167 @@ bool GenerateFragmentShaderGLSL(const FShaderID &id, char *buffer, const GLSLSha GEBlendSrcFactor replaceBlendFuncA = (GEBlendSrcFactor)id.Bits(FS_BIT_BLENDFUNC_A, 4); GEBlendDstFactor replaceBlendFuncB = (GEBlendDstFactor)id.Bits(FS_BIT_BLENDFUNC_B, 4); GEBlendMode replaceBlendEq = (GEBlendMode)id.Bits(FS_BIT_BLENDEQ, 3); + StencilValueType replaceAlphaWithStencilType = (StencilValueType)id.Bits(FS_BIT_REPLACE_ALPHA_WITH_STENCIL_TYPE, 4); bool isModeClear = id.Bit(FS_BIT_CLEARMODE); - if (shaderDepal && gl_extensions.IsGLES) { - WRITE(p, "precision highp int;\n"); - } - const char *shading = ""; - if (compat.glslES30) + if (compat.glslES30 || compat.vulkan) shading = doFlatShading ? "flat" : ""; - if (doTexture) - WRITE(p, "uniform sampler2D tex;\n"); + bool earlyFragmentTests = ((!enableAlphaTest && !enableColorTest) || testForceToZero) && !gstate_c.Supports(GPU_ROUND_FRAGMENT_DEPTH_TO_16BIT); + bool useAdrenoBugWorkaround = id.Bit(FS_BIT_NO_DEPTH_CANNOT_DISCARD_STENCIL); - if (!isModeClear && replaceBlend > REPLACE_BLEND_STANDARD) { - *uniformMask |= DIRTY_SHADERBLEND; - if (!gstate_c.Supports(GPU_SUPPORTS_ANY_FRAMEBUFFER_FETCH) && replaceBlend == REPLACE_BLEND_COPY_FBO) { - if (!compat.texelFetch) { - WRITE(p, "uniform vec2 u_fbotexSize;\n"); - } - WRITE(p, "uniform sampler2D fbotex;\n"); + if (compat.vulkan) { + if (earlyFragmentTests) { + WRITE(p, "layout (early_fragment_tests) in;\n"); + } else if (useAdrenoBugWorkaround && !gstate_c.Supports(GPU_ROUND_FRAGMENT_DEPTH_TO_16BIT)) { + WRITE(p, "layout (depth_unchanged) out float gl_FragDepth;\n"); } - if (replaceBlendFuncA >= GE_SRCBLEND_FIXA) { - WRITE(p, "uniform vec3 u_blendFixA;\n"); - } - if (replaceBlendFuncB >= GE_DSTBLEND_FIXB) { - WRITE(p, "uniform vec3 u_blendFixB;\n"); - } - } - if (needShaderTexClamp && doTexture) { - *uniformMask |= DIRTY_TEXCLAMP; - WRITE(p, "uniform vec4 u_texclamp;\n"); - if (id.Bit(FS_BIT_TEXTURE_AT_OFFSET)) { - WRITE(p, "uniform vec2 u_texclampoff;\n"); + WRITE(p, "layout (std140, set = 0, binding = 3) uniform baseUBO {\n%s};\n", ub_baseStr); + if (doTexture) { + WRITE(p, "layout (binding = 0) uniform sampler2D tex;\n"); } - } - if (enableAlphaTest || enableColorTest) { - if (g_Config.bFragmentTestCache) { - WRITE(p, "uniform sampler2D testtex;\n"); - } else { - *uniformMask |= DIRTY_ALPHACOLORREF; - WRITE(p, "uniform vec4 u_alphacolorref;\n"); - if (compat.bitwiseOps && ((enableColorTest && !colorTestAgainstZero) || (enableAlphaTest && !alphaTestAgainstZero))) { - *uniformMask |= DIRTY_ALPHACOLORMASK; - WRITE(p, "uniform ivec4 u_alphacolormask;\n"); + if (!isModeClear && replaceBlend > REPLACE_BLEND_STANDARD) { + if (replaceBlend == REPLACE_BLEND_COPY_FBO) { + WRITE(p, "layout (binding = 1) uniform sampler2D fbotex;\n"); } } - } - if (shaderDepal) { - WRITE(p, "uniform sampler2D pal;\n"); - WRITE(p, "uniform int u_depal;\n"); - *uniformMask |= DIRTY_DEPAL; - } + if (shaderDepal) { + WRITE(p, "layout (binding = 2) uniform sampler2D pal;\n"); + } - StencilValueType replaceAlphaWithStencilType = (StencilValueType)id.Bits(FS_BIT_REPLACE_ALPHA_WITH_STENCIL_TYPE, 4); - if (stencilToAlpha && replaceAlphaWithStencilType == STENCIL_VALUE_UNIFORM) { - *uniformMask |= DIRTY_STENCILREPLACEVALUE; - WRITE(p, "uniform float u_stencilReplaceValue;\n"); - } - if (doTexture && texFunc == GE_TEXFUNC_BLEND) { - *uniformMask |= DIRTY_TEXENV; - WRITE(p, "uniform vec3 u_texenv;\n"); - } + WRITE(p, "layout (location = 1) %s in vec4 v_color0;\n", shading); + if (lmode) + WRITE(p, "layout (location = 2) %s in vec3 v_color1;\n", shading); + if (enableFog) { + WRITE(p, "layout (location = 3) in float v_fogdepth;\n"); + } + if (doTexture) { + WRITE(p, "layout (location = 0) in vec3 v_texcoord;\n"); + } - WRITE(p, "%s %s vec4 v_color0;\n", shading, compat.varying_fs); - if (lmode) - WRITE(p, "%s %s vec3 v_color1;\n", shading, compat.varying_fs); - if (enableFog) { - *uniformMask |= DIRTY_FOGCOLOR; - WRITE(p, "uniform vec3 u_fogcolor;\n"); - WRITE(p, "%s %s float v_fogdepth;\n", compat.varying_fs, highpFog ? "highp" : "mediump"); - } - if (doTexture) { - WRITE(p, "%s %s vec3 v_texcoord;\n", compat.varying_fs, highpTexcoord ? "highp" : "mediump"); - } - - if (!g_Config.bFragmentTestCache) { if (enableAlphaTest && !alphaTestAgainstZero) { - if (compat.bitwiseOps) { - WRITE(p, "int roundAndScaleTo255i(in float x) { return int(floor(x * 255.0 + 0.5)); }\n"); - } else if (gl_extensions.gpuVendor == GPU_VENDOR_IMGTEC) { - WRITE(p, "float roundTo255thf(in mediump float x) { mediump float y = x + (0.5/255.0); return y - fract(y * 255.0) * (1.0 / 255.0); }\n"); - } else { - WRITE(p, "float roundAndScaleTo255f(in float x) { return floor(x * 255.0 + 0.5); }\n"); - } + WRITE(p, "int roundAndScaleTo255i(in float x) { return int(floor(x * 255.0 + 0.5)); }\n"); } if (enableColorTest && !colorTestAgainstZero) { - if (compat.bitwiseOps) { - WRITE(p, "ivec3 roundAndScaleTo255iv(in vec3 x) { return ivec3(floor(x * 255.0 + 0.5)); }\n"); - } else if (gl_extensions.gpuVendor == GPU_VENDOR_IMGTEC) { - WRITE(p, "vec3 roundTo255thv(in vec3 x) { vec3 y = x + (0.5/255.0); return y - fract(y * 255.0) * (1.0 / 255.0); }\n"); - } else { - WRITE(p, "vec3 roundAndScaleTo255v(in vec3 x) { return floor(x * 255.0 + 0.5); }\n"); + WRITE(p, "ivec3 roundAndScaleTo255iv(in vec3 x) { return ivec3(floor(x * 255.0 + 0.5)); }\n"); + } + + WRITE(p, "layout (location = 0, index = 0) out vec4 fragColor0;\n"); + if (stencilToAlpha == REPLACE_ALPHA_DUALSOURCE) { + WRITE(p, "layout (location = 0, index = 1) out vec4 fragColor1;\n"); + } + } else { + if (shaderDepal && gl_extensions.IsGLES) { + WRITE(p, "precision highp int;\n"); + } + + if (doTexture) + WRITE(p, "uniform sampler2D tex;\n"); + + if (!isModeClear && replaceBlend > REPLACE_BLEND_STANDARD) { + *uniformMask |= DIRTY_SHADERBLEND; + if (!gstate_c.Supports(GPU_SUPPORTS_ANY_FRAMEBUFFER_FETCH) && replaceBlend == REPLACE_BLEND_COPY_FBO) { + if (!compat.texelFetch) { + WRITE(p, "uniform vec2 u_fbotexSize;\n"); + } + WRITE(p, "uniform sampler2D fbotex;\n"); + } + if (replaceBlendFuncA >= GE_SRCBLEND_FIXA) { + WRITE(p, "uniform vec3 u_blendFixA;\n"); + } + if (replaceBlendFuncB >= GE_DSTBLEND_FIXB) { + WRITE(p, "uniform vec3 u_blendFixB;\n"); } } - } - if (!strcmp(compat.fragColor0, "fragColor0")) { - const char *qualifierColor0 = "out"; - if (compat.lastFragData && !strcmp(compat.lastFragData, compat.fragColor0)) { - qualifierColor0 = "inout"; + if (needShaderTexClamp && doTexture) { + *uniformMask |= DIRTY_TEXCLAMP; + WRITE(p, "uniform vec4 u_texclamp;\n"); + if (id.Bit(FS_BIT_TEXTURE_AT_OFFSET)) { + WRITE(p, "uniform vec2 u_texclampoff;\n"); + } } - // Output the output color definitions. - if (stencilToAlpha == REPLACE_ALPHA_DUALSOURCE) { - WRITE(p, "%s vec4 fragColor0;\n", qualifierColor0); - WRITE(p, "out vec4 fragColor1;\n"); - } else { - WRITE(p, "%s vec4 fragColor0;\n", qualifierColor0); + + if (enableAlphaTest || enableColorTest) { + if (g_Config.bFragmentTestCache) { + WRITE(p, "uniform sampler2D testtex;\n"); + } else { + *uniformMask |= DIRTY_ALPHACOLORREF; + WRITE(p, "uniform vec4 u_alphacolorref;\n"); + if (compat.bitwiseOps && ((enableColorTest && !colorTestAgainstZero) || (enableAlphaTest && !alphaTestAgainstZero))) { + *uniformMask |= DIRTY_ALPHACOLORMASK; + WRITE(p, "uniform ivec4 u_alphacolormask;\n"); + } + } } + + if (shaderDepal) { + WRITE(p, "uniform sampler2D pal;\n"); + WRITE(p, "uniform int u_depal_mask_shift_off_fmt;\n"); + *uniformMask |= DIRTY_DEPAL; + } + + if (stencilToAlpha && replaceAlphaWithStencilType == STENCIL_VALUE_UNIFORM) { + *uniformMask |= DIRTY_STENCILREPLACEVALUE; + WRITE(p, "uniform float u_stencilReplaceValue;\n"); + } + if (doTexture && texFunc == GE_TEXFUNC_BLEND) { + *uniformMask |= DIRTY_TEXENV; + WRITE(p, "uniform vec3 u_texenv;\n"); + } + + WRITE(p, "%s %s vec4 v_color0;\n", shading, compat.varying_fs); + if (lmode) + WRITE(p, "%s %s vec3 v_color1;\n", shading, compat.varying_fs); + if (enableFog) { + *uniformMask |= DIRTY_FOGCOLOR; + WRITE(p, "uniform vec3 u_fogcolor;\n"); + WRITE(p, "%s %s float v_fogdepth;\n", compat.varying_fs, highpFog ? "highp" : "mediump"); + } + if (doTexture) { + WRITE(p, "%s %s vec3 v_texcoord;\n", compat.varying_fs, highpTexcoord ? "highp" : "mediump"); + } + + if (!g_Config.bFragmentTestCache) { + if (enableAlphaTest && !alphaTestAgainstZero) { + if (compat.bitwiseOps) { + WRITE(p, "int roundAndScaleTo255i(in float x) { return int(floor(x * 255.0 + 0.5)); }\n"); + } else if (gl_extensions.gpuVendor == GPU_VENDOR_IMGTEC) { + WRITE(p, "float roundTo255thf(in mediump float x) { mediump float y = x + (0.5/255.0); return y - fract(y * 255.0) * (1.0 / 255.0); }\n"); + } else { + WRITE(p, "float roundAndScaleTo255f(in float x) { return floor(x * 255.0 + 0.5); }\n"); + } + } + if (enableColorTest && !colorTestAgainstZero) { + if (compat.bitwiseOps) { + WRITE(p, "ivec3 roundAndScaleTo255iv(in vec3 x) { return ivec3(floor(x * 255.0 + 0.5)); }\n"); + } else if (gl_extensions.gpuVendor == GPU_VENDOR_IMGTEC) { + WRITE(p, "vec3 roundTo255thv(in vec3 x) { vec3 y = x + (0.5/255.0); return y - fract(y * 255.0) * (1.0 / 255.0); }\n"); + } else { + WRITE(p, "vec3 roundAndScaleTo255v(in vec3 x) { return floor(x * 255.0 + 0.5); }\n"); + } + } + } + + if (!strcmp(compat.fragColor0, "fragColor0")) { + const char *qualifierColor0 = "out"; + if (compat.lastFragData && !strcmp(compat.lastFragData, compat.fragColor0)) { + qualifierColor0 = "inout"; + } + // Output the output color definitions. + if (stencilToAlpha == REPLACE_ALPHA_DUALSOURCE) { + WRITE(p, "%s vec4 fragColor0;\n", qualifierColor0); + WRITE(p, "out vec4 fragColor1;\n"); + } else { + WRITE(p, "%s vec4 fragColor0;\n", qualifierColor0); + } + } + } // PowerVR needs a custom modulo function. For some reason, this has far higher precision than the builtin one. @@ -217,7 +281,6 @@ bool GenerateFragmentShaderGLSL(const FShaderID &id, char *buffer, const GLSLSha } WRITE(p, "void main() {\n"); - if (isModeClear) { // Clear mode does not allow any fancy shading. WRITE(p, " vec4 v = v_color0;\n"); @@ -292,7 +355,7 @@ bool GenerateFragmentShaderGLSL(const FShaderID &id, char *buffer, const GLSLSha } WRITE(p, " vec2 tsize = vec2(textureSize(tex, 0));\n"); WRITE(p, " vec2 fraction;\n"); - WRITE(p, " bool bilinear = (u_depal >> 31) != 0;\n"); + WRITE(p, " bool bilinear = (u_depal_mask_shift_off_fmt >> 31) != 0;\n"); WRITE(p, " if (bilinear) {\n"); WRITE(p, " uv_round = uv * tsize - vec2(0.5, 0.5);\n"); WRITE(p, " fraction = fract(uv_round);\n"); @@ -304,10 +367,10 @@ bool GenerateFragmentShaderGLSL(const FShaderID &id, char *buffer, const GLSLSha WRITE(p, " vec4 t1 = %sOffset(tex, uv_round, ivec2(1, 0));\n", compat.texture); WRITE(p, " vec4 t2 = %sOffset(tex, uv_round, ivec2(0, 1));\n", compat.texture); WRITE(p, " vec4 t3 = %sOffset(tex, uv_round, ivec2(1, 1));\n", compat.texture); - WRITE(p, " int depalMask = (u_depal & 0xFF);\n"); - WRITE(p, " int depalShift = ((u_depal >> 8) & 0xFF);\n"); - WRITE(p, " int depalOffset = (((u_depal >> 16) & 0xFF) << 4);\n"); - WRITE(p, " int depalFmt = ((u_depal >> 24) & 0x3);\n"); + WRITE(p, " int depalMask = (u_depal_mask_shift_off_fmt & 0xFF);\n"); + WRITE(p, " int depalShift = ((u_depal_mask_shift_off_fmt >> 8) & 0xFF);\n"); + WRITE(p, " int depalOffset = (((u_depal_mask_shift_off_fmt >> 16) & 0xFF) << 4);\n"); + WRITE(p, " int depalFmt = ((u_depal_mask_shift_off_fmt >> 24) & 0x3);\n"); WRITE(p, " ivec4 col; int index0; int index1; int index2; int index3;\n"); WRITE(p, " switch (depalFmt) {\n"); // We might want to include fmt in the shader ID if this is a performance issue. WRITE(p, " case 0:\n"); // 565 @@ -450,7 +513,7 @@ bool GenerateFragmentShaderGLSL(const FShaderID &id, char *buffer, const GLSLSha // Texture access is at half texels [0.5/256, 255.5/256], but colors are normalized [0, 255]. // So we have to scale to account for the difference. std::string alphaTestXCoord = "0"; - if (g_Config.bFragmentTestCache) { + if (fragmentTestCache) { if (enableColorTest && !colorTestAgainstZero) { WRITE(p, " vec4 vScale256 = v * %f + %f;\n", 255.0 / 256.0, 0.5 / 256.0); alphaTestXCoord = "vScale256.a"; @@ -476,7 +539,7 @@ bool GenerateFragmentShaderGLSL(const FShaderID &id, char *buffer, const GLSLSha // Maybe we could discard the drawcall, but it's pretty rare. Let's just statically discard here. WRITE(p, " %s\n", discardStatement); } - } else if (g_Config.bFragmentTestCache) { + } else if (fragmentTestCache) { WRITE(p, " float aResult = %s(testtex, vec2(%s, 0)).a;\n", compat.texture, alphaTestXCoord.c_str()); WRITE(p, " if (aResult < 0.5) %s\n", discardStatement); } else { @@ -530,9 +593,14 @@ bool GenerateFragmentShaderGLSL(const FShaderID &id, char *buffer, const GLSLSha if (compat.bitwiseOps) { // Apparently GLES3 does not support vector bitwise ops. WRITE(p, " ivec3 v_scaled = roundAndScaleTo255iv(v.rgb);\n"); - const char *maskedFragColor = "ivec3(v_scaled.r & u_alphacolormask.r, v_scaled.g & u_alphacolormask.g, v_scaled.b & u_alphacolormask.b)"; - const char *maskedColorRef = "ivec3(int(u_alphacolorref.r) & u_alphacolormask.r, int(u_alphacolorref.g) & u_alphacolormask.g, int(u_alphacolorref.b) & u_alphacolormask.b)"; - WRITE(p, " if (%s %s %s) %s\n", maskedFragColor, colorTestFuncs[colorTestFunc], maskedColorRef, discardStatement); + if (compat.vulkan) { + // TODO: Use this for GL as well? + WRITE(p, " if ((v_scaled & u_alphacolormask.rgb) %s (u_alphacolorref.rgb & u_alphacolormask.rgb)) %s\n", colorTestFuncs[colorTestFunc], discardStatement); + } else { + const char *maskedFragColor = "ivec3(v_scaled.r & u_alphacolormask.r, v_scaled.g & u_alphacolormask.g, v_scaled.b & u_alphacolormask.b)"; + const char *maskedColorRef = "ivec3(int(u_alphacolorref.r) & u_alphacolormask.r, int(u_alphacolorref.g) & u_alphacolormask.g, int(u_alphacolorref.b) & u_alphacolormask.b)"; + WRITE(p, " if (%s %s %s) %s\n", maskedFragColor, colorTestFuncs[colorTestFunc], maskedColorRef, discardStatement); + } } else if (gl_extensions.gpuVendor == GPU_VENDOR_IMGTEC) { WRITE(p, " if (roundTo255thv(v.rgb) %s u_alphacolorref.rgb) %s\n", colorTestFuncs[colorTestFunc], discardStatement); } else { @@ -567,6 +635,11 @@ bool GenerateFragmentShaderGLSL(const FShaderID &id, char *buffer, const GLSLSha default: srcFactor = "u_blendFixA"; break; } + if (!strcmp(srcFactor, "ERROR")) { + *errorString = "Bad replaceblend src factor"; + return false; + } + WRITE(p, " v.rgb = v.rgb * %s;\n", srcFactor); } @@ -632,6 +705,9 @@ bool GenerateFragmentShaderGLSL(const FShaderID &id, char *buffer, const GLSLSha case GE_BLENDMODE_ABSDIFF: WRITE(p, " v.rgb = abs(v.rgb - destColor.rgb);\n"); break; + default: + *errorString = "Bad replace blend eq"; + return false; } } @@ -729,6 +805,10 @@ bool GenerateFragmentShaderGLSL(const FShaderID &id, char *buffer, const GLSLSha WRITE(p, " z = (1.0/65535.0) * floor(z * 65535.0);\n"); } WRITE(p, " gl_FragDepth = z;\n"); + } else if (!earlyFragmentTests && useAdrenoBugWorkaround) { + // Adreno (and possibly MESA/others) apply early frag tests even with discard in the shader. + // Writing depth prevents the bug, even with depth_unchanged specified. + WRITE(p, " gl_FragDepth = gl_FragCoord.z;\n"); } WRITE(p, "}\n"); diff --git a/GPU/GLES/ShaderManagerGLES.cpp b/GPU/GLES/ShaderManagerGLES.cpp index 4be9aace83..ccae98787a 100644 --- a/GPU/GLES/ShaderManagerGLES.cpp +++ b/GPU/GLES/ShaderManagerGLES.cpp @@ -166,7 +166,7 @@ LinkedShader::LinkedShader(GLRenderManager *render, VShaderID VSID, Shader *vs, queries.push_back({ &u_tess_weights_u, "u_tess_weights_u" }); queries.push_back({ &u_tess_weights_v, "u_tess_weights_v" }); queries.push_back({ &u_spline_counts, "u_spline_counts" }); - queries.push_back({ &u_depal, "u_depal" }); + queries.push_back({ &u_depal_mask_shift_off_fmt, "u_depal_mask_shift_off_fmt" }); attrMask = vs->GetAttrMask(); availableUniforms = vs->GetUniformMask() | fs->GetUniformMask(); @@ -298,7 +298,7 @@ void LinkedShader::UpdateUniforms(u32 vertType, const ShaderID &vsid, bool useBu uint32_t val = BytesToUint32(indexMask, indexShift, indexOffset, format); // Poke in a bilinear filter flag in the top bit. val |= gstate.isMagnifyFilteringEnabled() << 31; - render_->SetUniformI1(&u_depal, val); + render_->SetUniformI1(&u_depal_mask_shift_off_fmt, val); } // Update any dirty uniforms before we draw diff --git a/GPU/GLES/ShaderManagerGLES.h b/GPU/GLES/ShaderManagerGLES.h index 7d652311f1..c1c968dc76 100644 --- a/GPU/GLES/ShaderManagerGLES.h +++ b/GPU/GLES/ShaderManagerGLES.h @@ -88,7 +88,7 @@ public: // Shader depal int u_pal; // the texture - int u_depal; // the params + int u_depal_mask_shift_off_fmt; // the params // Fragment processing inputs int u_alphacolorref; diff --git a/GPU/Vulkan/FragmentShaderGeneratorVulkan.cpp b/GPU/Vulkan/FragmentShaderGeneratorVulkan.cpp index 06ddde1bd4..29579a11e4 100644 --- a/GPU/Vulkan/FragmentShaderGeneratorVulkan.cpp +++ b/GPU/Vulkan/FragmentShaderGeneratorVulkan.cpp @@ -562,10 +562,10 @@ bool GenerateFragmentShaderVulkanGLSL(const FShaderID &id, char *buffer, uint32_ LogicOpReplaceType replaceLogicOpType = (LogicOpReplaceType)id.Bits(FS_BIT_REPLACE_LOGIC_OP_TYPE, 2); switch (replaceLogicOpType) { case LOGICOPTYPE_ONE: - WRITE(p, " fragColor0.rgb = splat3(1.0);\n"); + WRITE(p, " fragColor0.rgb = vec3(1.0, 1.0, 1.0);\n"); break; case LOGICOPTYPE_INVERT: - WRITE(p, " fragColor0.rgb = splat3(1.0) - fragColor0.rgb;\n"); + WRITE(p, " fragColor0.rgb = vec3(1.0, 1.0, 1.0) - fragColor0.rgb;\n"); break; case LOGICOPTYPE_NORMAL: break; diff --git a/unittest/TestShaderGenerators.cpp b/unittest/TestShaderGenerators.cpp index e295ffd91d..cb28331bb0 100644 --- a/unittest/TestShaderGenerators.cpp +++ b/unittest/TestShaderGenerators.cpp @@ -1,3 +1,5 @@ +#include + #include "Common/StringUtils.h" #include "GPU/Common/ShaderId.h" @@ -20,6 +22,23 @@ #include "GPU/D3D9/D3DCompilerLoader.h" #include "GPU/D3D9/D3D9ShaderCompiler.h" +void SetupCompatForVulkan(GLSLShaderCompat &compat) { + compat.fragColor0 = "fragColor0"; + compat.fragColor1 = "fragColor1"; + compat.varying_fs = "in"; + compat.varying_vs = "out"; + compat.attribute = "in"; + compat.bitwiseOps = true; + compat.framebufferFetchExtension = false; + compat.gles = false; + compat.glslES30 = true; + compat.glslVersionNumber = 450; + compat.lastFragData = nullptr; + compat.texture = "texture"; + compat.texelFetch = "texelFetch"; + compat.vulkan = true; +} + bool GenerateFShader(FShaderID id, char *buffer, ShaderLanguage lang, std::string *errorString) { switch (lang) { case ShaderLanguage::HLSL_D3D11: @@ -30,6 +49,13 @@ bool GenerateFShader(FShaderID id, char *buffer, ShaderLanguage lang, std::strin return false; case ShaderLanguage::GLSL_VULKAN: return GenerateFragmentShaderVulkanGLSL(id, buffer, 0, errorString); + case ShaderLanguage::TEST_GLSL_VULKAN: + { + GLSLShaderCompat compat{}; + SetupCompatForVulkan(compat); + uint64_t uniformMask; + return GenerateFragmentShaderGLSL(id, buffer, compat, &uniformMask, errorString); + } case ShaderLanguage::GLSL_140: case ShaderLanguage::GLSL_300: // TODO: Need a device - except that maybe glslang could be used to verify these .... @@ -75,24 +101,54 @@ bool TestCompileShader(const char *buffer, ShaderLanguage lang, bool vertex) { return result; } case ShaderLanguage::GLSL_140: - return false; case ShaderLanguage::GLSL_300: - return false; + case ShaderLanguage::TEST_GLSL_VULKAN: + // Temporary while testing the vulkan->glsl merge + return true; + default: return false; } } +void PrintDiff(const char *a, const char *b) { + // Stupidest diff ever: Just print both lines, and a few around it, when we find a mismatch. + std::vector a_lines; + std::vector b_lines; + SplitString(a, '\n', a_lines); + SplitString(b, '\n', b_lines); + for (size_t i = 0; i < a_lines.size() && i < b_lines.size(); i++) { + if (a_lines[i] != b_lines[i]) { + // Print some context + for (size_t j = std::max((int)i - 4, 0); j < i; j++) { + printf("%s\n", a_lines[j].c_str()); + } + printf("DIFF found at line %d:\n", (int)i); + printf("a: %s\n", a_lines[i].c_str()); + printf("b: %s\n", b_lines[i].c_str()); + printf("...continues...\n"); + for (size_t j = i; j < i + 4 && j < a_lines.size(); j++) { + printf("a: %s\n", a_lines[j].c_str()); + printf("b: %s\n", b_lines[j].c_str()); + } + printf("==================\n"); + return; + } + } +} + + bool TestShaderGenerators() { LoadD3D11(); init_glslang(); LoadD3DCompilerDynamic(); ShaderLanguage languages[] = { - ShaderLanguage::HLSL_D3D11, + ShaderLanguage::TEST_GLSL_VULKAN, ShaderLanguage::GLSL_VULKAN, + ShaderLanguage::HLSL_D3D11, ShaderLanguage::GLSL_140, ShaderLanguage::GLSL_300, ShaderLanguage::HLSL_DX9, @@ -106,7 +162,7 @@ bool TestShaderGenerators() { } GMRng rng; int successes = 0; - int count = 200; + int count = 700; // Generate a bunch of random fragment shader IDs, try to generate shader source. // Then compile it and check that it's ok. @@ -128,6 +184,17 @@ bool TestShaderGenerators() { // We ignore the contents of the error string here, not even gonna try to compile if it errors. } + // Temporary test: Compare GLSL-in-Vulkan-mode vs Vulkan + if (generateSuccess[0] != generateSuccess[1]) { + printf("mismatching success!\n"); + return 1; + } + if (generateSuccess[0] && strcmp(buffer[0], buffer[1])) { + printf("mismatching shaders!\n"); + PrintDiff(buffer[0], buffer[1]); + return 1; + } + // Now that we have the strings ready for easy comparison (buffer,4 in the watch window), // let's try to compile them. for (int j = 0; j < numLanguages; j++) { From aea4635d60b7e2b19b10d2084d442ef998c9a7c5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Thu, 22 Oct 2020 22:50:24 +0200 Subject: [PATCH 081/275] Fix minute differences between the shader generators found by the new tester --- GPU/Directx9/FragmentShaderGeneratorHLSL.cpp | 10 ++++---- GPU/Vulkan/FragmentShaderGeneratorVulkan.cpp | 25 +++++++++++++------- unittest/TestShaderGenerators.cpp | 12 ++++++---- 3 files changed, 28 insertions(+), 19 deletions(-) diff --git a/GPU/Directx9/FragmentShaderGeneratorHLSL.cpp b/GPU/Directx9/FragmentShaderGeneratorHLSL.cpp index 4cbe2c50ff..a48f1d17e9 100644 --- a/GPU/Directx9/FragmentShaderGeneratorHLSL.cpp +++ b/GPU/Directx9/FragmentShaderGeneratorHLSL.cpp @@ -291,6 +291,11 @@ bool GenerateFragmentShaderHLSL(const FShaderID &id, char *buffer, ShaderLanguag WRITE(p, " float4 v = In.v_color0 %s;\n", secondary); } + if (enableFog) { + WRITE(p, " float fogCoef = clamp(In.v_fogdepth, 0.0, 1.0);\n"); + WRITE(p, " v = lerp(float4(u_fogcolor, v.a), v, fogCoef);\n"); + } + if (enableAlphaTest) { if (alphaTestAgainstZero) { // When testing against 0 (extremely common), we can avoid some math. @@ -322,11 +327,6 @@ bool GenerateFragmentShaderHLSL(const FShaderID &id, char *buffer, ShaderLanguag } } - if (enableFog) { - WRITE(p, " float fogCoef = clamp(In.v_fogdepth, 0.0, 1.0);\n"); - WRITE(p, " v = lerp(float4(u_fogcolor, v.a), v, fogCoef);\n"); - } - if (enableColorTest) { if (colorTestAgainstZero) { // When testing against 0 (common), we can avoid some math. diff --git a/GPU/Vulkan/FragmentShaderGeneratorVulkan.cpp b/GPU/Vulkan/FragmentShaderGeneratorVulkan.cpp index 29579a11e4..a726a8558a 100644 --- a/GPU/Vulkan/FragmentShaderGeneratorVulkan.cpp +++ b/GPU/Vulkan/FragmentShaderGeneratorVulkan.cpp @@ -352,6 +352,11 @@ bool GenerateFragmentShaderVulkanGLSL(const FShaderID &id, char *buffer, uint32_ WRITE(p, " vec4 v = v_color0 %s;\n", secondary); } + if (enableFog) { + WRITE(p, " float fogCoef = clamp(v_fogdepth, 0.0, 1.0);\n"); + WRITE(p, " v = mix(vec4(u_fogcolor, v.a), v, fogCoef);\n"); + } + // Texture access is at half texels [0.5/256, 255.5/256], but colors are normalized [0, 255]. // So we have to scale to account for the difference. std::string alphaTestXCoord = "0"; @@ -374,7 +379,7 @@ bool GenerateFragmentShaderVulkanGLSL(const FShaderID &id, char *buffer, uint32_ } else { const char *alphaTestFuncs[] = { "#", "#", " != ", " == ", " >= ", " > ", " <= ", " < " }; if (alphaTestFuncs[alphaTestFunc][0] != '#') { - WRITE(p, " if ((roundAndScaleTo255i(v.a) & u_alphacolormask.a) %s u_alphacolorref.a) %s\n", alphaTestFuncs[alphaTestFunc], discardStatement); + WRITE(p, " if ((roundAndScaleTo255i(v.a) & u_alphacolormask.a) %s int(u_alphacolorref.a)) %s\n", alphaTestFuncs[alphaTestFunc], discardStatement); } else { // This means NEVER. See above. WRITE(p, " %s\n", discardStatement); @@ -382,12 +387,6 @@ bool GenerateFragmentShaderVulkanGLSL(const FShaderID &id, char *buffer, uint32_ } } - if (enableFog) { - WRITE(p, " float fogCoef = clamp(v_fogdepth, 0.0, 1.0);\n"); - WRITE(p, " v = mix(vec4(u_fogcolor, v.a), v, fogCoef);\n"); - // WRITE(p, " v.x = v_depth;\n"); - } - if (enableColorTest) { if (colorTestAgainstZero) { // When testing against 0 (common), we can avoid some math. @@ -419,7 +418,7 @@ bool GenerateFragmentShaderVulkanGLSL(const FShaderID &id, char *buffer, uint32_ } if (replaceBlend == REPLACE_BLEND_PRE_SRC || replaceBlend == REPLACE_BLEND_PRE_SRC_2X_ALPHA) { - const char *srcFactor = "ERROR"; + const char *srcFactor = nullptr; switch (replaceBlendFuncA) { case GE_SRCBLEND_DSTCOLOR: srcFactor = "ERROR"; break; case GE_SRCBLEND_INVDSTCOLOR: srcFactor = "ERROR"; break; @@ -429,9 +428,12 @@ bool GenerateFragmentShaderVulkanGLSL(const FShaderID &id, char *buffer, uint32_ case GE_SRCBLEND_INVDSTALPHA: srcFactor = "ERROR"; break; case GE_SRCBLEND_DOUBLESRCALPHA: srcFactor = "vec3(v.a * 2.0)"; break; case GE_SRCBLEND_DOUBLEINVSRCALPHA: srcFactor = "vec3(1.0 - v.a * 2.0)"; break; - case GE_SRCBLEND_DOUBLEDSTALPHA: srcFactor = "ERROR"; break; + // PRE_SRC for REPLACE_BLEND_PRE_SRC_2X_ALPHA means "double the src." + // It's close to the same, but clamping can still be an issue. + case GE_SRCBLEND_DOUBLEDSTALPHA: srcFactor = "vec3(2.0)"; break; case GE_SRCBLEND_DOUBLEINVDSTALPHA: srcFactor = "ERROR"; break; case GE_SRCBLEND_FIXA: srcFactor = "u_blendFixA"; break; + default: srcFactor = "u_blendFixA"; break; } if (!strcmp(srcFactor, "ERROR")) { @@ -460,6 +462,7 @@ bool GenerateFragmentShaderVulkanGLSL(const FShaderID &id, char *buffer, uint32_ case GE_SRCBLEND_DOUBLEDSTALPHA: srcFactor = "vec3(destColor.a * 2.0)"; break; case GE_SRCBLEND_DOUBLEINVDSTALPHA: srcFactor = "vec3(1.0 - destColor.a * 2.0)"; break; case GE_SRCBLEND_FIXA: srcFactor = "u_blendFixA"; break; + default: srcFactor = "u_blendFixA"; break; } switch (replaceBlendFuncB) { case GE_DSTBLEND_SRCCOLOR: dstFactor = "v.rgb"; break; @@ -473,6 +476,7 @@ bool GenerateFragmentShaderVulkanGLSL(const FShaderID &id, char *buffer, uint32_ case GE_DSTBLEND_DOUBLEDSTALPHA: dstFactor = "vec3(destColor.a * 2.0)"; break; case GE_DSTBLEND_DOUBLEINVDSTALPHA: dstFactor = "vec3(1.0 - destColor.a * 2.0)"; break; case GE_DSTBLEND_FIXB: dstFactor = "u_blendFixB"; break; + default: dstFactor = "u_blendFixB"; break; } switch (replaceBlendEq) { @@ -494,6 +498,9 @@ bool GenerateFragmentShaderVulkanGLSL(const FShaderID &id, char *buffer, uint32_ case GE_BLENDMODE_ABSDIFF: WRITE(p, " v.rgb = abs(v.rgb - destColor.rgb);\n"); break; + default: + *errorString = "Bad replace blend eq"; + return false; } } diff --git a/unittest/TestShaderGenerators.cpp b/unittest/TestShaderGenerators.cpp index cb28331bb0..7fea59c9bb 100644 --- a/unittest/TestShaderGenerators.cpp +++ b/unittest/TestShaderGenerators.cpp @@ -174,19 +174,21 @@ bool TestShaderGenerators() { id.d[1] = top; bool generateSuccess[numLanguages]{}; + std::string genErrorString[numLanguages]; for (int j = 0; j < numLanguages; j++) { - std::string genErrorString; - generateSuccess[j] = GenerateFShader(id, buffer[j], languages[j], &genErrorString); - if (!genErrorString.empty()) { - printf("%s\n", genErrorString.c_str()); + generateSuccess[j] = GenerateFShader(id, buffer[j], languages[j], &genErrorString[j]); + if (!genErrorString[j].empty()) { + printf("%s\n", genErrorString[j].c_str()); } // We ignore the contents of the error string here, not even gonna try to compile if it errors. } // Temporary test: Compare GLSL-in-Vulkan-mode vs Vulkan if (generateSuccess[0] != generateSuccess[1]) { - printf("mismatching success!\n"); + printf("mismatching success! %s %s\n", genErrorString[0].c_str(), genErrorString[1].c_str()); + printf("%s\n", buffer[0]); + printf("%s\n", buffer[1]); return 1; } if (generateSuccess[0] && strcmp(buffer[0], buffer[1])) { From fe8691fba71ef8b6c42787022989cb51f34ac36e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Thu, 22 Oct 2020 22:54:27 +0200 Subject: [PATCH 082/275] Fix additional differences --- GPU/Vulkan/FragmentShaderGeneratorVulkan.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/GPU/Vulkan/FragmentShaderGeneratorVulkan.cpp b/GPU/Vulkan/FragmentShaderGeneratorVulkan.cpp index a726a8558a..584a9cc6ea 100644 --- a/GPU/Vulkan/FragmentShaderGeneratorVulkan.cpp +++ b/GPU/Vulkan/FragmentShaderGeneratorVulkan.cpp @@ -201,7 +201,7 @@ bool GenerateFragmentShaderVulkanGLSL(const FShaderID &id, char *buffer, uint32_ } else { WRITE(p, " vec2 uv = %s.xy;\n vec2 uv_round;\n", texcoord); } - WRITE(p, " vec2 tsize = textureSize(tex, 0);\n"); + WRITE(p, " vec2 tsize = vec2(textureSize(tex, 0));\n"); WRITE(p, " vec2 fraction;\n"); WRITE(p, " bool bilinear = (u_depal_mask_shift_off_fmt >> 31) != 0;\n"); WRITE(p, " if (bilinear) {\n"); @@ -396,7 +396,7 @@ bool GenerateFragmentShaderVulkanGLSL(const FShaderID &id, char *buffer, uint32_ WRITE(p, " if (v.r + v.g + v.b < 0.002) %s\n", discardStatement); } else if (colorTestFunc != GE_COMP_NEVER) { // Anything else is a test for == 0. - WRITE(p, " if (v.r + v.g + v.b > 0.002) %s\n", discardStatement); + WRITE(p, " if (v.r > 0.002 || v.g > 0.002 || v.b > 0.002) %s\n", discardStatement); } else { // NEVER has been logged as used by games, although it makes little sense - statically failing. // Maybe we could discard the drawcall, but it's pretty rare. Let's just statically discard here. From 56ddd597c16a5fd51268e493da6086ab5769c758 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Thu, 22 Oct 2020 23:05:53 +0200 Subject: [PATCH 083/275] Fix more tiny differences. The fragment shader generators now match! --- GPU/GLES/FragmentShaderGeneratorGLES.cpp | 46 ++++++++++---------- GPU/Vulkan/FragmentShaderGeneratorVulkan.cpp | 2 +- 2 files changed, 24 insertions(+), 24 deletions(-) diff --git a/GPU/GLES/FragmentShaderGeneratorGLES.cpp b/GPU/GLES/FragmentShaderGeneratorGLES.cpp index 11ce7cf1c1..391dd950bd 100644 --- a/GPU/GLES/FragmentShaderGeneratorGLES.cpp +++ b/GPU/GLES/FragmentShaderGeneratorGLES.cpp @@ -61,7 +61,7 @@ bool GenerateFragmentShaderGLSL(const FShaderID &id, char *buffer, const GLSLSha char *p = buffer; if (compat.vulkan) { - WRITE(p, vulkan_glsl_preamble); + WRITE(p, "%s", vulkan_glsl_preamble); } else { WRITE(p, "#version %d%s\n", compat.glslVersionNumber, compat.gles ? " es" : ""); @@ -367,57 +367,57 @@ bool GenerateFragmentShaderGLSL(const FShaderID &id, char *buffer, const GLSLSha WRITE(p, " vec4 t1 = %sOffset(tex, uv_round, ivec2(1, 0));\n", compat.texture); WRITE(p, " vec4 t2 = %sOffset(tex, uv_round, ivec2(0, 1));\n", compat.texture); WRITE(p, " vec4 t3 = %sOffset(tex, uv_round, ivec2(1, 1));\n", compat.texture); - WRITE(p, " int depalMask = (u_depal_mask_shift_off_fmt & 0xFF);\n"); - WRITE(p, " int depalShift = ((u_depal_mask_shift_off_fmt >> 8) & 0xFF);\n"); - WRITE(p, " int depalOffset = (((u_depal_mask_shift_off_fmt >> 16) & 0xFF) << 4);\n"); - WRITE(p, " int depalFmt = ((u_depal_mask_shift_off_fmt >> 24) & 0x3);\n"); - WRITE(p, " ivec4 col; int index0; int index1; int index2; int index3;\n"); + WRITE(p, " uint depalMask = (u_depal_mask_shift_off_fmt & 0xFF);\n"); + WRITE(p, " uint depalShift = (u_depal_mask_shift_off_fmt >> 8) & 0xFF;\n"); + WRITE(p, " uint depalOffset = ((u_depal_mask_shift_off_fmt >> 16) & 0xFF) << 4;\n"); + WRITE(p, " uint depalFmt = (u_depal_mask_shift_off_fmt >> 24) & 0x3;\n"); + WRITE(p, " uvec4 col; uint index0; uint index1; uint index2; uint index3;\n"); WRITE(p, " switch (depalFmt) {\n"); // We might want to include fmt in the shader ID if this is a performance issue. WRITE(p, " case 0:\n"); // 565 - WRITE(p, " col = ivec4(t.rgb * vec3(31.99, 63.99, 31.99), 0);\n"); + WRITE(p, " col = uvec4(t.rgb * vec3(31.99, 63.99, 31.99), 0);\n"); WRITE(p, " index0 = (col.b << 11) | (col.g << 5) | (col.r);\n"); WRITE(p, " if (bilinear) {\n"); - WRITE(p, " col = ivec4(t1.rgb * vec3(31.99, 63.99, 31.99), 0);\n"); + WRITE(p, " col = uvec4(t1.rgb * vec3(31.99, 63.99, 31.99), 0);\n"); WRITE(p, " index1 = (col.b << 11) | (col.g << 5) | (col.r);\n"); - WRITE(p, " col = ivec4(t2.rgb * vec3(31.99, 63.99, 31.99), 0);\n"); + WRITE(p, " col = uvec4(t2.rgb * vec3(31.99, 63.99, 31.99), 0);\n"); WRITE(p, " index2 = (col.b << 11) | (col.g << 5) | (col.r);\n"); - WRITE(p, " col = ivec4(t3.rgb * vec3(31.99, 63.99, 31.99), 0);\n"); + WRITE(p, " col = uvec4(t3.rgb * vec3(31.99, 63.99, 31.99), 0);\n"); WRITE(p, " index3 = (col.b << 11) | (col.g << 5) | (col.r);\n"); WRITE(p, " }\n"); WRITE(p, " break;\n"); WRITE(p, " case 1:\n"); // 5551 - WRITE(p, " col = ivec4(t.rgba * vec4(31.99, 31.99, 31.99, 1.0));\n"); + WRITE(p, " col = uvec4(t.rgba * vec4(31.99, 31.99, 31.99, 1.0));\n"); WRITE(p, " index0 = (col.a << 15) | (col.b << 10) | (col.g << 5) | (col.r);\n"); WRITE(p, " if (bilinear) {\n"); - WRITE(p, " col = ivec4(t1.rgba * vec4(31.99, 31.99, 31.99, 1.0));\n"); + WRITE(p, " col = uvec4(t1.rgba * vec4(31.99, 31.99, 31.99, 1.0));\n"); WRITE(p, " index1 = (col.a << 15) | (col.b << 10) | (col.g << 5) | (col.r);\n"); - WRITE(p, " col = ivec4(t2.rgba * vec4(31.99, 31.99, 31.99, 1.0));\n"); + WRITE(p, " col = uvec4(t2.rgba * vec4(31.99, 31.99, 31.99, 1.0));\n"); WRITE(p, " index2 = (col.a << 15) | (col.b << 10) | (col.g << 5) | (col.r);\n"); - WRITE(p, " col = ivec4(t3.rgba * vec4(31.99, 31.99, 31.99, 1.0));\n"); + WRITE(p, " col = uvec4(t3.rgba * vec4(31.99, 31.99, 31.99, 1.0));\n"); WRITE(p, " index3 = (col.a << 15) | (col.b << 10) | (col.g << 5) | (col.r);\n"); WRITE(p, " }\n"); WRITE(p, " break;\n"); WRITE(p, " case 2:\n"); // 4444 - WRITE(p, " col = ivec4(t.rgba * vec4(15.99, 15.99, 15.99, 15.99));\n"); + WRITE(p, " col = uvec4(t.rgba * 15.99);\n"); WRITE(p, " index0 = (col.a << 12) | (col.b << 8) | (col.g << 4) | (col.r);\n"); WRITE(p, " if (bilinear) {\n"); - WRITE(p, " col = ivec4(t1.rgba * vec4(15.99, 15.99, 15.99, 15.99));\n"); + WRITE(p, " col = uvec4(t1.rgba * 15.99);\n"); WRITE(p, " index1 = (col.a << 12) | (col.b << 8) | (col.g << 4) | (col.r);\n"); - WRITE(p, " col = ivec4(t2.rgba * vec4(15.99, 15.99, 15.99, 15.99));\n"); + WRITE(p, " col = uvec4(t2.rgba * 15.99);\n"); WRITE(p, " index2 = (col.a << 12) | (col.b << 8) | (col.g << 4) | (col.r);\n"); - WRITE(p, " col = ivec4(t3.rgba * vec4(15.99, 15.99, 15.99, 15.99));\n"); + WRITE(p, " col = uvec4(t3.rgba * 15.99);\n"); WRITE(p, " index3 = (col.a << 12) | (col.b << 8) | (col.g << 4) | (col.r);\n"); WRITE(p, " }\n"); WRITE(p, " break;\n"); WRITE(p, " case 3:\n"); // 8888 - WRITE(p, " col = ivec4(t.rgba * vec4(255.99, 255.99, 255.99, 255.99));\n"); + WRITE(p, " col = uvec4(t.rgba * 255.99);\n"); WRITE(p, " index0 = (col.a << 24) | (col.b << 16) | (col.g << 8) | (col.r);\n"); WRITE(p, " if (bilinear) {\n"); - WRITE(p, " col = ivec4(t1.rgba * vec4(255.99, 255.99, 255.99, 255.99));\n"); + WRITE(p, " col = uvec4(t1.rgba * 255.99);\n"); WRITE(p, " index1 = (col.a << 24) | (col.b << 16) | (col.g << 8) | (col.r);\n"); - WRITE(p, " col = ivec4(t2.rgba * vec4(255.99, 255.99, 255.99, 255.99));\n"); + WRITE(p, " col = uvec4(t2.rgba * 255.99);\n"); WRITE(p, " index2 = (col.a << 24) | (col.b << 16) | (col.g << 8) | (col.r);\n"); - WRITE(p, " col = ivec4(t3.rgba * vec4(255.99, 255.99, 255.99, 255.99));\n"); + WRITE(p, " col = uvec4(t3.rgba * 255.99);\n"); WRITE(p, " index3 = (col.a << 24) | (col.b << 16) | (col.g << 8) | (col.r);\n"); WRITE(p, " }\n"); WRITE(p, " break;\n"); @@ -683,7 +683,7 @@ bool GenerateFragmentShaderGLSL(const FShaderID &id, char *buffer, const GLSLSha case GE_DSTBLEND_DOUBLEDSTALPHA: dstFactor = "vec3(destColor.a * 2.0)"; break; case GE_DSTBLEND_DOUBLEINVDSTALPHA: dstFactor = "vec3(1.0 - destColor.a * 2.0)"; break; case GE_DSTBLEND_FIXB: dstFactor = "u_blendFixB"; break; - default: srcFactor = "u_blendFixB"; break; + default: dstFactor = "u_blendFixB"; break; } switch (replaceBlendEq) { diff --git a/GPU/Vulkan/FragmentShaderGeneratorVulkan.cpp b/GPU/Vulkan/FragmentShaderGeneratorVulkan.cpp index 584a9cc6ea..07dd7f9bdc 100644 --- a/GPU/Vulkan/FragmentShaderGeneratorVulkan.cpp +++ b/GPU/Vulkan/FragmentShaderGeneratorVulkan.cpp @@ -393,7 +393,7 @@ bool GenerateFragmentShaderVulkanGLSL(const FShaderID &id, char *buffer, uint32_ // Have my doubts that this special case is actually worth it, but whatever. // 0.002 is approximately half of 1.0 / 255.0. if (colorTestFunc == GE_COMP_NOTEQUAL) { - WRITE(p, " if (v.r + v.g + v.b < 0.002) %s\n", discardStatement); + WRITE(p, " if (v.r < 0.002 && v.g < 0.002 && v.b < 0.002) %s\n", discardStatement); } else if (colorTestFunc != GE_COMP_NEVER) { // Anything else is a test for == 0. WRITE(p, " if (v.r > 0.002 || v.g > 0.002 || v.b > 0.002) %s\n", discardStatement); From 020fb55a65f2156a508726d0a72306e268b86027 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Thu, 22 Oct 2020 23:31:56 +0200 Subject: [PATCH 084/275] Completes the merge, deleting the Vulkan-specific fragment shader generator. --- CMakeLists.txt | 2 - GPU/Common/ShaderCommon.cpp | 21 +- GPU/Common/ShaderCommon.h | 4 +- GPU/GPU.vcxproj | 2 - GPU/GPU.vcxproj.filters | 6 - GPU/Vulkan/FragmentShaderGeneratorVulkan.cpp | 610 ------------------- GPU/Vulkan/FragmentShaderGeneratorVulkan.h | 23 - GPU/Vulkan/ShaderManagerVulkan.cpp | 14 +- GPU/Vulkan/ShaderManagerVulkan.h | 3 +- GPU/Vulkan/StencilBufferVulkan.cpp | 1 - GPU/Vulkan/TextureCacheVulkan.cpp | 1 - android/jni/Android.mk | 1 - libretro/Makefile.common | 1 - unittest/TestShaderGenerators.cpp | 29 +- 14 files changed, 38 insertions(+), 680 deletions(-) delete mode 100644 GPU/Vulkan/FragmentShaderGeneratorVulkan.cpp delete mode 100644 GPU/Vulkan/FragmentShaderGeneratorVulkan.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 0aec870bff..bd958b7090 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1263,8 +1263,6 @@ set(GPU_VULKAN GPU/Vulkan/DebugVisVulkan.h GPU/Vulkan/DrawEngineVulkan.cpp GPU/Vulkan/DrawEngineVulkan.h - GPU/Vulkan/FragmentShaderGeneratorVulkan.cpp - GPU/Vulkan/FragmentShaderGeneratorVulkan.h GPU/Vulkan/FramebufferManagerVulkan.cpp GPU/Vulkan/FramebufferManagerVulkan.h GPU/Vulkan/GPU_Vulkan.cpp diff --git a/GPU/Common/ShaderCommon.cpp b/GPU/Common/ShaderCommon.cpp index 1cbc7d3be5..e48f733437 100644 --- a/GPU/Common/ShaderCommon.cpp +++ b/GPU/Common/ShaderCommon.cpp @@ -5,6 +5,8 @@ #include "ext/glslang/SPIRV/GlslangToSpv.h" +#include "ShaderCommon.h" + void init_resources(TBuiltInResource &Resources) { Resources.maxLights = 32; Resources.maxClipPlanes = 6; @@ -98,4 +100,21 @@ void init_resources(TBuiltInResource &Resources) { Resources.limits.generalSamplerIndexing = 1; Resources.limits.generalVariableIndexing = 1; Resources.limits.generalConstantMatrixVectorIndexing = 1; -} \ No newline at end of file +} + +void GLSLShaderCompat::SetupForVulkan() { + fragColor0 = "fragColor0"; + fragColor1 = "fragColor1"; + varying_fs = "in"; + varying_vs = "out"; + attribute = "in"; + bitwiseOps = true; + framebufferFetchExtension = nullptr; + gles = false; + glslES30 = true; + glslVersionNumber = 450; + lastFragData = nullptr; + texture = "texture"; + texelFetch = "texelFetch"; + vulkan = true; +} diff --git a/GPU/Common/ShaderCommon.h b/GPU/Common/ShaderCommon.h index 2b945ad426..b7eb56e93c 100644 --- a/GPU/Common/ShaderCommon.h +++ b/GPU/Common/ShaderCommon.h @@ -31,8 +31,6 @@ enum ShaderLanguage { HLSL_DX9, HLSL_D3D11, HLSL_D3D11_LEVEL9, - - TEST_GLSL_VULKAN, }; enum DebugShaderType { @@ -156,4 +154,6 @@ struct GLSLShaderCompat { const char *framebufferFetchExtension; bool glslES30; bool bitwiseOps; + + void SetupForVulkan(); }; diff --git a/GPU/GPU.vcxproj b/GPU/GPU.vcxproj index 4b0224feee..90e56a8dbd 100644 --- a/GPU/GPU.vcxproj +++ b/GPU/GPU.vcxproj @@ -476,7 +476,6 @@ - @@ -667,7 +666,6 @@ - diff --git a/GPU/GPU.vcxproj.filters b/GPU/GPU.vcxproj.filters index cabdce9c90..daea75b1a3 100644 --- a/GPU/GPU.vcxproj.filters +++ b/GPU/GPU.vcxproj.filters @@ -150,9 +150,6 @@ Vulkan - - Vulkan - Vulkan @@ -416,9 +413,6 @@ Vulkan - - Vulkan - Vulkan diff --git a/GPU/Vulkan/FragmentShaderGeneratorVulkan.cpp b/GPU/Vulkan/FragmentShaderGeneratorVulkan.cpp deleted file mode 100644 index 07dd7f9bdc..0000000000 --- a/GPU/Vulkan/FragmentShaderGeneratorVulkan.cpp +++ /dev/null @@ -1,610 +0,0 @@ -// Copyright (c) 2012- PPSSPP Project. - -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 2.0 or later versions. - -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License 2.0 for more details. - -// A copy of the GPL 2.0 should have been included with the program. -// If not, see http://www.gnu.org/licenses/ - -// Official git repository and contact information can be found at -// https://github.com/hrydgard/ppsspp and http://www.ppsspp.org/. - -#include -#include - -#include "Common/GPU/OpenGL/GLFeatures.h" - -#include "Common/Log.h" -#include "Common/StringUtils.h" -#include "Core/Reporting.h" -#include "Core/Config.h" -#include "GPU/Common/GPUStateUtils.h" -#include "GPU/Common/ShaderId.h" -#include "GPU/Vulkan/FragmentShaderGeneratorVulkan.h" -#include "GPU/Vulkan/FramebufferManagerVulkan.h" -#include "GPU/Vulkan/ShaderManagerVulkan.h" -#include "GPU/Vulkan/PipelineManagerVulkan.h" - -#include "GPU/ge_constants.h" -#include "GPU/GPUState.h" - -static const char *vulkan_glsl_preamble = - "#version 450\n" - "#extension GL_ARB_separate_shader_objects : enable\n" - "#extension GL_ARB_shading_language_420pack : enable\n" - "#extension GL_ARB_conservative_depth : enable\n" - "#extension GL_ARB_shader_image_load_store : enable\n" - "#define splat3(x) vec3(x)\n\n"; - -#define WRITE p+=sprintf - -bool GenerateFragmentShaderVulkanGLSL(const FShaderID &id, char *buffer, uint32_t vulkanVendorId, std::string *errorString) { - char *p = buffer; - - const char *lastFragData = nullptr; - - WRITE(p, "%s", vulkan_glsl_preamble); - - bool lmode = id.Bit(FS_BIT_LMODE); - bool doTexture = id.Bit(FS_BIT_DO_TEXTURE); - bool enableFog = id.Bit(FS_BIT_ENABLE_FOG); - bool enableAlphaTest = id.Bit(FS_BIT_ALPHA_TEST); - - bool alphaTestAgainstZero = id.Bit(FS_BIT_ALPHA_AGAINST_ZERO); - bool testForceToZero = id.Bit(FS_BIT_TEST_DISCARD_TO_ZERO); - bool enableColorTest = id.Bit(FS_BIT_COLOR_TEST); - bool colorTestAgainstZero = id.Bit(FS_BIT_COLOR_AGAINST_ZERO); - bool enableColorDoubling = id.Bit(FS_BIT_COLOR_DOUBLE); - bool doTextureProjection = id.Bit(FS_BIT_DO_TEXTURE_PROJ); - bool doTextureAlpha = id.Bit(FS_BIT_TEXALPHA); - bool doFlatShading = id.Bit(FS_BIT_FLATSHADE); - bool shaderDepal = id.Bit(FS_BIT_SHADER_DEPAL); - - GEComparison alphaTestFunc = (GEComparison)id.Bits(FS_BIT_ALPHA_TEST_FUNC, 3); - GEComparison colorTestFunc = (GEComparison)id.Bits(FS_BIT_COLOR_TEST_FUNC, 2); - bool needShaderTexClamp = id.Bit(FS_BIT_SHADER_TEX_CLAMP); - - GETexFunc texFunc = (GETexFunc)id.Bits(FS_BIT_TEXFUNC, 3); - bool textureAtOffset = id.Bit(FS_BIT_TEXTURE_AT_OFFSET); - - ReplaceBlendType replaceBlend = static_cast(id.Bits(FS_BIT_REPLACE_BLEND, 3)); - ReplaceAlphaType stencilToAlpha = static_cast(id.Bits(FS_BIT_STENCIL_TO_ALPHA, 2)); - - GEBlendSrcFactor replaceBlendFuncA = (GEBlendSrcFactor)id.Bits(FS_BIT_BLENDFUNC_A, 4); - GEBlendDstFactor replaceBlendFuncB = (GEBlendDstFactor)id.Bits(FS_BIT_BLENDFUNC_B, 4); - GEBlendMode replaceBlendEq = (GEBlendMode)id.Bits(FS_BIT_BLENDEQ, 3); - StencilValueType replaceAlphaWithStencilType = (StencilValueType)id.Bits(FS_BIT_REPLACE_ALPHA_WITH_STENCIL_TYPE, 4); - - bool isModeClear = id.Bit(FS_BIT_CLEARMODE); - - const char *shading = doFlatShading ? "flat" : ""; - bool earlyFragmentTests = ((!enableAlphaTest && !enableColorTest) || testForceToZero) && !gstate_c.Supports(GPU_ROUND_FRAGMENT_DEPTH_TO_16BIT); - bool useAdrenoBugWorkaround = id.Bit(FS_BIT_NO_DEPTH_CANNOT_DISCARD_STENCIL); - - if (earlyFragmentTests) { - WRITE(p, "layout (early_fragment_tests) in;\n"); - } else if (useAdrenoBugWorkaround && !gstate_c.Supports(GPU_ROUND_FRAGMENT_DEPTH_TO_16BIT)) { - WRITE(p, "layout (depth_unchanged) out float gl_FragDepth;\n"); - } - - WRITE(p, "layout (std140, set = 0, binding = 3) uniform baseUBO {\n%s};\n", ub_baseStr); - if (doTexture) { - WRITE(p, "layout (binding = 0) uniform sampler2D tex;\n"); - } - - if (!isModeClear && replaceBlend > REPLACE_BLEND_STANDARD) { - if (replaceBlend == REPLACE_BLEND_COPY_FBO) { - WRITE(p, "layout (binding = 1) uniform sampler2D fbotex;\n"); - } - } - - if (shaderDepal) { - WRITE(p, "layout (binding = 2) uniform sampler2D pal;\n"); - } - - WRITE(p, "layout (location = 1) %s in vec4 v_color0;\n", shading); - if (lmode) - WRITE(p, "layout (location = 2) %s in vec3 v_color1;\n", shading); - if (enableFog) { - WRITE(p, "layout (location = 3) in float v_fogdepth;\n"); - } - if (doTexture) { - WRITE(p, "layout (location = 0) in vec3 v_texcoord;\n"); - } - - if (enableAlphaTest && !alphaTestAgainstZero) { - WRITE(p, "int roundAndScaleTo255i(in float x) { return int(floor(x * 255.0 + 0.5)); }\n"); - } - if (enableColorTest && !colorTestAgainstZero) { - WRITE(p, "ivec3 roundAndScaleTo255iv(in vec3 x) { return ivec3(floor(x * 255.0 + 0.5)); }\n"); - } - - WRITE(p, "layout (location = 0, index = 0) out vec4 fragColor0;\n"); - if (stencilToAlpha == REPLACE_ALPHA_DUALSOURCE) { - WRITE(p, "layout (location = 0, index = 1) out vec4 fragColor1;\n"); - } - - // PowerVR needs a custom modulo function. For some reason, this has far higher precision than the builtin one. - if ((gl_extensions.bugs & BUG_PVR_SHADER_PRECISION_BAD) && needShaderTexClamp) { - WRITE(p, "float mymod(float a, float b) { return a - b * floor(a / b); }\n"); - } - - WRITE(p, "void main() {\n"); - if (isModeClear) { - // Clear mode does not allow any fancy shading. - WRITE(p, " vec4 v = v_color0;\n"); - } else { - const char *secondary = ""; - // Secondary color for specular on top of texture - if (lmode) { - WRITE(p, " vec4 s = vec4(v_color1, 0.0);\n"); - secondary = " + s"; - } else { - secondary = ""; - } - - if (doTexture) { - const char *texcoord = "v_texcoord"; - // TODO: Not sure the right way to do this for projection. - // This path destroys resolution on older PowerVR no matter what I do, so we disable it on SGX 540 and lesser, and live with the consequences. - if (needShaderTexClamp && !(gl_extensions.bugs & BUG_PVR_SHADER_PRECISION_TERRIBLE)) { - // We may be clamping inside a larger surface (tex = 64x64, buffer=480x272). - // We may also be wrapping in such a surface, or either one in a too-small surface. - // Obviously, clamping to a smaller surface won't work. But better to clamp to something. - std::string ucoord = "v_texcoord.x"; - std::string vcoord = "v_texcoord.y"; - if (doTextureProjection) { - ucoord = "(v_texcoord.x / v_texcoord.z)"; - vcoord = "(v_texcoord.y / v_texcoord.z)"; - } - - std::string modulo = (gl_extensions.bugs & BUG_PVR_SHADER_PRECISION_BAD) ? "mymod" : "mod"; - - if (id.Bit(FS_BIT_CLAMP_S)) { - ucoord = "clamp(" + ucoord + ", u_texclamp.z, u_texclamp.x - u_texclamp.z)"; - } else { - ucoord = modulo + "(" + ucoord + ", u_texclamp.x)"; - } - if (id.Bit(FS_BIT_CLAMP_T)) { - vcoord = "clamp(" + vcoord + ", u_texclamp.w, u_texclamp.y - u_texclamp.w)"; - } else { - vcoord = modulo + "(" + vcoord + ", u_texclamp.y)"; - } - if (textureAtOffset) { - ucoord = "(" + ucoord + " + u_texclampoff.x)"; - vcoord = "(" + vcoord + " + u_texclampoff.y)"; - } - - WRITE(p, " vec2 fixedcoord = vec2(%s, %s);\n", ucoord.c_str(), vcoord.c_str()); - texcoord = "fixedcoord"; - // We already projected it. - doTextureProjection = false; - } - - if (!shaderDepal) { - if (doTextureProjection) { - WRITE(p, " vec4 t = textureProj(tex, %s);\n", texcoord); - } else { - WRITE(p, " vec4 t = texture(tex, %s.xy);\n", texcoord); - } - } else { - if (doTextureProjection) { - // We don't use textureProj because we need to manually offset from the divided coordinate to do filtering here. - // On older hardware it has the advantage of higher resolution math, but such old hardware can't run Vulkan. - WRITE(p, " vec2 uv = %s.xy/%s.z;\n vec2 uv_round;\n", texcoord, texcoord); - } else { - WRITE(p, " vec2 uv = %s.xy;\n vec2 uv_round;\n", texcoord); - } - WRITE(p, " vec2 tsize = vec2(textureSize(tex, 0));\n"); - WRITE(p, " vec2 fraction;\n"); - WRITE(p, " bool bilinear = (u_depal_mask_shift_off_fmt >> 31) != 0;\n"); - WRITE(p, " if (bilinear) {\n"); - WRITE(p, " uv_round = uv * tsize - vec2(0.5, 0.5);\n"); - WRITE(p, " fraction = fract(uv_round);\n"); - WRITE(p, " uv_round = (uv_round - fraction + vec2(0.5, 0.5)) / tsize;\n"); // We want to take our four point samples at pixel centers. - WRITE(p, " } else {\n"); - WRITE(p, " uv_round = uv;\n"); - WRITE(p, " }\n"); - WRITE(p, " vec4 t = texture(tex, uv_round);\n"); - WRITE(p, " vec4 t1 = textureOffset(tex, uv_round, ivec2(1, 0));\n"); - WRITE(p, " vec4 t2 = textureOffset(tex, uv_round, ivec2(0, 1));\n"); - WRITE(p, " vec4 t3 = textureOffset(tex, uv_round, ivec2(1, 1));\n"); - WRITE(p, " uint depalMask = (u_depal_mask_shift_off_fmt & 0xFF);\n"); - WRITE(p, " uint depalShift = (u_depal_mask_shift_off_fmt >> 8) & 0xFF;\n"); - WRITE(p, " uint depalOffset = ((u_depal_mask_shift_off_fmt >> 16) & 0xFF) << 4;\n"); - WRITE(p, " uint depalFmt = (u_depal_mask_shift_off_fmt >> 24) & 0x3;\n"); - WRITE(p, " uvec4 col; uint index0; uint index1; uint index2; uint index3;\n"); - WRITE(p, " switch (depalFmt) {\n"); // We might want to include fmt in the shader ID if this is a performance issue. - WRITE(p, " case 0:\n"); // 565 - WRITE(p, " col = uvec4(t.rgb * vec3(31.99, 63.99, 31.99), 0);\n"); - WRITE(p, " index0 = (col.b << 11) | (col.g << 5) | (col.r);\n"); - WRITE(p, " if (bilinear) {\n"); - WRITE(p, " col = uvec4(t1.rgb * vec3(31.99, 63.99, 31.99), 0);\n"); - WRITE(p, " index1 = (col.b << 11) | (col.g << 5) | (col.r);\n"); - WRITE(p, " col = uvec4(t2.rgb * vec3(31.99, 63.99, 31.99), 0);\n"); - WRITE(p, " index2 = (col.b << 11) | (col.g << 5) | (col.r);\n"); - WRITE(p, " col = uvec4(t3.rgb * vec3(31.99, 63.99, 31.99), 0);\n"); - WRITE(p, " index3 = (col.b << 11) | (col.g << 5) | (col.r);\n"); - WRITE(p, " }\n"); - WRITE(p, " break;\n"); - WRITE(p, " case 1:\n"); // 5551 - WRITE(p, " col = uvec4(t.rgba * vec4(31.99, 31.99, 31.99, 1.0));\n"); - WRITE(p, " index0 = (col.a << 15) | (col.b << 10) | (col.g << 5) | (col.r);\n"); - WRITE(p, " if (bilinear) {\n"); - WRITE(p, " col = uvec4(t1.rgba * vec4(31.99, 31.99, 31.99, 1.0));\n"); - WRITE(p, " index1 = (col.a << 15) | (col.b << 10) | (col.g << 5) | (col.r);\n"); - WRITE(p, " col = uvec4(t2.rgba * vec4(31.99, 31.99, 31.99, 1.0));\n"); - WRITE(p, " index2 = (col.a << 15) | (col.b << 10) | (col.g << 5) | (col.r);\n"); - WRITE(p, " col = uvec4(t3.rgba * vec4(31.99, 31.99, 31.99, 1.0));\n"); - WRITE(p, " index3 = (col.a << 15) | (col.b << 10) | (col.g << 5) | (col.r);\n"); - WRITE(p, " }\n"); - WRITE(p, " break;\n"); - WRITE(p, " case 2:\n"); // 4444 - WRITE(p, " col = uvec4(t.rgba * 15.99);\n"); - WRITE(p, " index0 = (col.a << 12) | (col.b << 8) | (col.g << 4) | (col.r);\n"); - WRITE(p, " if (bilinear) {\n"); - WRITE(p, " col = uvec4(t1.rgba * 15.99);\n"); - WRITE(p, " index1 = (col.a << 12) | (col.b << 8) | (col.g << 4) | (col.r);\n"); - WRITE(p, " col = uvec4(t2.rgba * 15.99);\n"); - WRITE(p, " index2 = (col.a << 12) | (col.b << 8) | (col.g << 4) | (col.r);\n"); - WRITE(p, " col = uvec4(t3.rgba * 15.99);\n"); - WRITE(p, " index3 = (col.a << 12) | (col.b << 8) | (col.g << 4) | (col.r);\n"); - WRITE(p, " }\n"); - WRITE(p, " break;\n"); - WRITE(p, " case 3:\n"); // 8888 - WRITE(p, " col = uvec4(t.rgba * 255.99);\n"); - WRITE(p, " index0 = (col.a << 24) | (col.b << 16) | (col.g << 8) | (col.r);\n"); - WRITE(p, " if (bilinear) {\n"); - WRITE(p, " col = uvec4(t1.rgba * 255.99);\n"); - WRITE(p, " index1 = (col.a << 24) | (col.b << 16) | (col.g << 8) | (col.r);\n"); - WRITE(p, " col = uvec4(t2.rgba * 255.99);\n"); - WRITE(p, " index2 = (col.a << 24) | (col.b << 16) | (col.g << 8) | (col.r);\n"); - WRITE(p, " col = uvec4(t3.rgba * 255.99);\n"); - WRITE(p, " index3 = (col.a << 24) | (col.b << 16) | (col.g << 8) | (col.r);\n"); - WRITE(p, " }\n"); - WRITE(p, " break;\n"); - WRITE(p, " };\n"); - WRITE(p, " index0 = ((index0 >> depalShift) & depalMask) | depalOffset;\n"); - WRITE(p, " t = texelFetch(pal, ivec2(index0, 0), 0);\n"); - WRITE(p, " if (bilinear && !(index0 == index1 && index1 == index2 && index2 == index3)) {\n"); - WRITE(p, " index1 = ((index1 >> depalShift) & depalMask) | depalOffset;\n"); - WRITE(p, " index2 = ((index2 >> depalShift) & depalMask) | depalOffset;\n"); - WRITE(p, " index3 = ((index3 >> depalShift) & depalMask) | depalOffset;\n"); - WRITE(p, " t1 = texelFetch(pal, ivec2(index1, 0), 0);\n"); - WRITE(p, " t2 = texelFetch(pal, ivec2(index2, 0), 0);\n"); - WRITE(p, " t3 = texelFetch(pal, ivec2(index3, 0), 0);\n"); - WRITE(p, " t = mix(t, t1, fraction.x);\n"); - WRITE(p, " t2 = mix(t2, t3, fraction.x);\n"); - WRITE(p, " t = mix(t, t2, fraction.y);\n"); - WRITE(p, " }\n"); - } - - if (texFunc != GE_TEXFUNC_REPLACE || !doTextureAlpha) - WRITE(p, " vec4 p = v_color0;\n"); - - if (doTextureAlpha) { // texfmt == RGBA - switch (texFunc) { - case GE_TEXFUNC_MODULATE: - WRITE(p, " vec4 v = p * t%s;\n", secondary); - break; - - case GE_TEXFUNC_DECAL: - WRITE(p, " vec4 v = vec4(mix(p.rgb, t.rgb, t.a), p.a)%s;\n", secondary); - break; - - case GE_TEXFUNC_BLEND: - WRITE(p, " vec4 v = vec4(mix(p.rgb, u_texenv.rgb, t.rgb), p.a * t.a)%s;\n", secondary); - break; - - case GE_TEXFUNC_REPLACE: - WRITE(p, " vec4 v = t%s;\n", secondary); - break; - - case GE_TEXFUNC_ADD: - case GE_TEXFUNC_UNKNOWN1: - case GE_TEXFUNC_UNKNOWN2: - case GE_TEXFUNC_UNKNOWN3: - WRITE(p, " vec4 v = vec4(p.rgb + t.rgb, p.a * t.a)%s;\n", secondary); - break; - default: - WRITE(p, " vec4 v = p;\n"); break; - } - } else { // texfmt == RGB - switch (texFunc) { - case GE_TEXFUNC_MODULATE: - WRITE(p, " vec4 v = vec4(t.rgb * p.rgb, p.a)%s;\n", secondary); - break; - - case GE_TEXFUNC_DECAL: - WRITE(p, " vec4 v = vec4(t.rgb, p.a)%s;\n", secondary); - break; - - case GE_TEXFUNC_BLEND: - WRITE(p, " vec4 v = vec4(mix(p.rgb, u_texenv.rgb, t.rgb), p.a)%s;\n", secondary); - break; - - case GE_TEXFUNC_REPLACE: - WRITE(p, " vec4 v = vec4(t.rgb, p.a)%s;\n", secondary); - break; - - case GE_TEXFUNC_ADD: - case GE_TEXFUNC_UNKNOWN1: - case GE_TEXFUNC_UNKNOWN2: - case GE_TEXFUNC_UNKNOWN3: - WRITE(p, " vec4 v = vec4(p.rgb + t.rgb, p.a)%s;\n", secondary); break; - default: - WRITE(p, " vec4 v = p;\n"); break; - } - } - - if (enableColorDoubling) { - // This happens before fog is applied. - WRITE(p, " v.rgb = clamp(v.rgb * 2.0, 0.0, 1.0);\n"); - } - } else { - // No texture mapping - WRITE(p, " vec4 v = v_color0 %s;\n", secondary); - } - - if (enableFog) { - WRITE(p, " float fogCoef = clamp(v_fogdepth, 0.0, 1.0);\n"); - WRITE(p, " v = mix(vec4(u_fogcolor, v.a), v, fogCoef);\n"); - } - - // Texture access is at half texels [0.5/256, 255.5/256], but colors are normalized [0, 255]. - // So we have to scale to account for the difference. - std::string alphaTestXCoord = "0"; - - const char *discardStatement = testForceToZero ? "v.a = 0.0;" : "discard;"; - if (enableAlphaTest) { - if (alphaTestAgainstZero) { - // When testing against 0 (extremely common), we can avoid some math. - // 0.002 is approximately half of 1.0 / 255.0. - if (alphaTestFunc == GE_COMP_NOTEQUAL || alphaTestFunc == GE_COMP_GREATER) { - WRITE(p, " if (v.a < 0.002) %s\n", discardStatement); - } else if (alphaTestFunc != GE_COMP_NEVER) { - // Anything else is a test for == 0. Happens sometimes, actually... - WRITE(p, " if (v.a > 0.002) %s\n", discardStatement); - } else { - // NEVER has been logged as used by games, although it makes little sense - statically failing. - // Maybe we could discard the drawcall, but it's pretty rare. Let's just statically discard here. - WRITE(p, " %s\n", discardStatement); - } - } else { - const char *alphaTestFuncs[] = { "#", "#", " != ", " == ", " >= ", " > ", " <= ", " < " }; - if (alphaTestFuncs[alphaTestFunc][0] != '#') { - WRITE(p, " if ((roundAndScaleTo255i(v.a) & u_alphacolormask.a) %s int(u_alphacolorref.a)) %s\n", alphaTestFuncs[alphaTestFunc], discardStatement); - } else { - // This means NEVER. See above. - WRITE(p, " %s\n", discardStatement); - } - } - } - - if (enableColorTest) { - if (colorTestAgainstZero) { - // When testing against 0 (common), we can avoid some math. - // Have my doubts that this special case is actually worth it, but whatever. - // 0.002 is approximately half of 1.0 / 255.0. - if (colorTestFunc == GE_COMP_NOTEQUAL) { - WRITE(p, " if (v.r < 0.002 && v.g < 0.002 && v.b < 0.002) %s\n", discardStatement); - } else if (colorTestFunc != GE_COMP_NEVER) { - // Anything else is a test for == 0. - WRITE(p, " if (v.r > 0.002 || v.g > 0.002 || v.b > 0.002) %s\n", discardStatement); - } else { - // NEVER has been logged as used by games, although it makes little sense - statically failing. - // Maybe we could discard the drawcall, but it's pretty rare. Let's just statically discard here. - WRITE(p, " %s\n", discardStatement); - } - } else { - const char *colorTestFuncs[] = { "#", "#", " != ", " == " }; - if (colorTestFuncs[colorTestFunc][0] != '#') { - WRITE(p, " ivec3 v_scaled = roundAndScaleTo255iv(v.rgb);\n"); - WRITE(p, " if ((v_scaled & u_alphacolormask.rgb) %s (u_alphacolorref.rgb & u_alphacolormask.rgb)) %s\n", colorTestFuncs[colorTestFunc], discardStatement); - } else { - WRITE(p, " %s\n", discardStatement); - } - } - } - - if (replaceBlend == REPLACE_BLEND_2X_SRC) { - WRITE(p, " v.rgb = v.rgb * 2.0;\n"); - } - - if (replaceBlend == REPLACE_BLEND_PRE_SRC || replaceBlend == REPLACE_BLEND_PRE_SRC_2X_ALPHA) { - const char *srcFactor = nullptr; - switch (replaceBlendFuncA) { - case GE_SRCBLEND_DSTCOLOR: srcFactor = "ERROR"; break; - case GE_SRCBLEND_INVDSTCOLOR: srcFactor = "ERROR"; break; - case GE_SRCBLEND_SRCALPHA: srcFactor = "vec3(v.a)"; break; - case GE_SRCBLEND_INVSRCALPHA: srcFactor = "vec3(1.0 - v.a)"; break; - case GE_SRCBLEND_DSTALPHA: srcFactor = "ERROR"; break; - case GE_SRCBLEND_INVDSTALPHA: srcFactor = "ERROR"; break; - case GE_SRCBLEND_DOUBLESRCALPHA: srcFactor = "vec3(v.a * 2.0)"; break; - case GE_SRCBLEND_DOUBLEINVSRCALPHA: srcFactor = "vec3(1.0 - v.a * 2.0)"; break; - // PRE_SRC for REPLACE_BLEND_PRE_SRC_2X_ALPHA means "double the src." - // It's close to the same, but clamping can still be an issue. - case GE_SRCBLEND_DOUBLEDSTALPHA: srcFactor = "vec3(2.0)"; break; - case GE_SRCBLEND_DOUBLEINVDSTALPHA: srcFactor = "ERROR"; break; - case GE_SRCBLEND_FIXA: srcFactor = "u_blendFixA"; break; - default: srcFactor = "u_blendFixA"; break; - } - - if (!strcmp(srcFactor, "ERROR")) { - *errorString = "Bad replaceblend src factor"; - return false; - } - - WRITE(p, " v.rgb = v.rgb * %s;\n", srcFactor); - } - - if (replaceBlend == REPLACE_BLEND_COPY_FBO) { - WRITE(p, " lowp vec4 destColor = texelFetch(fbotex, ivec2(gl_FragCoord.x, gl_FragCoord.y), 0);\n"); - - const char *srcFactor = "vec3(1.0)"; - const char *dstFactor = "vec3(0.0)"; - - switch (replaceBlendFuncA) { - case GE_SRCBLEND_DSTCOLOR: srcFactor = "destColor.rgb"; break; - case GE_SRCBLEND_INVDSTCOLOR: srcFactor = "(vec3(1.0) - destColor.rgb)"; break; - case GE_SRCBLEND_SRCALPHA: srcFactor = "vec3(v.a)"; break; - case GE_SRCBLEND_INVSRCALPHA: srcFactor = "vec3(1.0 - v.a)"; break; - case GE_SRCBLEND_DSTALPHA: srcFactor = "vec3(destColor.a)"; break; - case GE_SRCBLEND_INVDSTALPHA: srcFactor = "vec3(1.0 - destColor.a)"; break; - case GE_SRCBLEND_DOUBLESRCALPHA: srcFactor = "vec3(v.a * 2.0)"; break; - case GE_SRCBLEND_DOUBLEINVSRCALPHA: srcFactor = "vec3(1.0 - v.a * 2.0)"; break; - case GE_SRCBLEND_DOUBLEDSTALPHA: srcFactor = "vec3(destColor.a * 2.0)"; break; - case GE_SRCBLEND_DOUBLEINVDSTALPHA: srcFactor = "vec3(1.0 - destColor.a * 2.0)"; break; - case GE_SRCBLEND_FIXA: srcFactor = "u_blendFixA"; break; - default: srcFactor = "u_blendFixA"; break; - } - switch (replaceBlendFuncB) { - case GE_DSTBLEND_SRCCOLOR: dstFactor = "v.rgb"; break; - case GE_DSTBLEND_INVSRCCOLOR: dstFactor = "(vec3(1.0) - v.rgb)"; break; - case GE_DSTBLEND_SRCALPHA: dstFactor = "vec3(v.a)"; break; - case GE_DSTBLEND_INVSRCALPHA: dstFactor = "vec3(1.0 - v.a)"; break; - case GE_DSTBLEND_DSTALPHA: dstFactor = "vec3(destColor.a)"; break; - case GE_DSTBLEND_INVDSTALPHA: dstFactor = "vec3(1.0 - destColor.a)"; break; - case GE_DSTBLEND_DOUBLESRCALPHA: dstFactor = "vec3(v.a * 2.0)"; break; - case GE_DSTBLEND_DOUBLEINVSRCALPHA: dstFactor = "vec3(1.0 - v.a * 2.0)"; break; - case GE_DSTBLEND_DOUBLEDSTALPHA: dstFactor = "vec3(destColor.a * 2.0)"; break; - case GE_DSTBLEND_DOUBLEINVDSTALPHA: dstFactor = "vec3(1.0 - destColor.a * 2.0)"; break; - case GE_DSTBLEND_FIXB: dstFactor = "u_blendFixB"; break; - default: dstFactor = "u_blendFixB"; break; - } - - switch (replaceBlendEq) { - case GE_BLENDMODE_MUL_AND_ADD: - WRITE(p, " v.rgb = v.rgb * %s + destColor.rgb * %s;\n", srcFactor, dstFactor); - break; - case GE_BLENDMODE_MUL_AND_SUBTRACT: - WRITE(p, " v.rgb = v.rgb * %s - destColor.rgb * %s;\n", srcFactor, dstFactor); - break; - case GE_BLENDMODE_MUL_AND_SUBTRACT_REVERSE: - WRITE(p, " v.rgb = destColor.rgb * %s - v.rgb * %s;\n", dstFactor, srcFactor); - break; - case GE_BLENDMODE_MIN: - WRITE(p, " v.rgb = min(v.rgb, destColor.rgb);\n"); - break; - case GE_BLENDMODE_MAX: - WRITE(p, " v.rgb = max(v.rgb, destColor.rgb);\n"); - break; - case GE_BLENDMODE_ABSDIFF: - WRITE(p, " v.rgb = abs(v.rgb - destColor.rgb);\n"); - break; - default: - *errorString = "Bad replace blend eq"; - return false; - } - } - - if (replaceBlend == REPLACE_BLEND_2X_ALPHA || replaceBlend == REPLACE_BLEND_PRE_SRC_2X_ALPHA) { - WRITE(p, " v.a = v.a * 2.0;\n"); - } - } - - std::string replacedAlpha = "0.0"; - char replacedAlphaTemp[64] = ""; - if (stencilToAlpha != REPLACE_ALPHA_NO) { - switch (replaceAlphaWithStencilType) { - case STENCIL_VALUE_UNIFORM: - replacedAlpha = "u_stencilReplaceValue"; - break; - - case STENCIL_VALUE_ZERO: - replacedAlpha = "0.0"; - break; - - case STENCIL_VALUE_ONE: - case STENCIL_VALUE_INVERT: - // In invert, we subtract by one, but we want to output one here. - replacedAlpha = "1.0"; - break; - - case STENCIL_VALUE_INCR_4: - case STENCIL_VALUE_DECR_4: - // We're adding/subtracting, just by the smallest value in 4-bit. - snprintf(replacedAlphaTemp, sizeof(replacedAlphaTemp), "%f", 1.0 / 15.0); - replacedAlpha = replacedAlphaTemp; - break; - - case STENCIL_VALUE_INCR_8: - case STENCIL_VALUE_DECR_8: - // We're adding/subtracting, just by the smallest value in 8-bit. - snprintf(replacedAlphaTemp, sizeof(replacedAlphaTemp), "%f", 1.0 / 255.0); - replacedAlpha = replacedAlphaTemp; - break; - - case STENCIL_VALUE_KEEP: - // Do nothing. We'll mask out the alpha using color mask. - break; - } - } - - switch (stencilToAlpha) { - case REPLACE_ALPHA_DUALSOURCE: - WRITE(p, " fragColor0 = vec4(v.rgb, %s);\n", replacedAlpha.c_str()); - WRITE(p, " fragColor1 = vec4(0.0, 0.0, 0.0, v.a);\n"); - break; - - case REPLACE_ALPHA_YES: - WRITE(p, " fragColor0 = vec4(v.rgb, %s);\n", replacedAlpha.c_str()); - break; - - case REPLACE_ALPHA_NO: - WRITE(p, " fragColor0 = v;\n"); - break; - - default: - *errorString = "Bad stencil-to-alpha type, corrupt ID?"; - return false; - } - - LogicOpReplaceType replaceLogicOpType = (LogicOpReplaceType)id.Bits(FS_BIT_REPLACE_LOGIC_OP_TYPE, 2); - switch (replaceLogicOpType) { - case LOGICOPTYPE_ONE: - WRITE(p, " fragColor0.rgb = vec3(1.0, 1.0, 1.0);\n"); - break; - case LOGICOPTYPE_INVERT: - WRITE(p, " fragColor0.rgb = vec3(1.0, 1.0, 1.0) - fragColor0.rgb;\n"); - break; - case LOGICOPTYPE_NORMAL: - break; - - default: - *errorString = "Bad logic op type, corrupt ID?"; - return false; - } - - if (gstate_c.Supports(GPU_ROUND_FRAGMENT_DEPTH_TO_16BIT)) { - const double scale = DepthSliceFactor() * 65535.0; - - WRITE(p, " highp float z = gl_FragCoord.z;\n"); - if (gstate_c.Supports(GPU_SUPPORTS_ACCURATE_DEPTH)) { - // We center the depth with an offset, but only its fraction matters. - // When (DepthSliceFactor() - 1) is odd, it will be 0.5, otherwise 0. - if (((int)(DepthSliceFactor() - 1.0f) & 1) == 1) { - WRITE(p, " z = (floor((z * %f) - (1.0 / 2.0)) + (1.0 / 2.0)) * (1.0 / %f);\n", scale, scale); - } else { - WRITE(p, " z = floor(z * %f) * (1.0 / %f);\n", scale, scale); - } - } else { - WRITE(p, " z = (1.0/65535.0) * floor(z * 65535.0);\n"); - } - WRITE(p, " gl_FragDepth = z;\n"); - } else if (!earlyFragmentTests && useAdrenoBugWorkaround) { - // Adreno (and possibly MESA/others) apply early frag tests even with discard in the shader. - // Writing depth prevents the bug, even with depth_unchanged specified. - WRITE(p, " gl_FragDepth = gl_FragCoord.z;\n"); - } - - WRITE(p, "}\n"); - - return true; -} diff --git a/GPU/Vulkan/FragmentShaderGeneratorVulkan.h b/GPU/Vulkan/FragmentShaderGeneratorVulkan.h deleted file mode 100644 index a3c64828e9..0000000000 --- a/GPU/Vulkan/FragmentShaderGeneratorVulkan.h +++ /dev/null @@ -1,23 +0,0 @@ -#pragma once -// Copyright (c) 2012- PPSSPP Project. - -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 2.0 or later versions. - -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License 2.0 for more details. - -// A copy of the GPL 2.0 should have been included with the program. -// If not, see http://www.gnu.org/licenses/ - -// Official git repository and contact information can be found at -// https://github.com/hrydgard/ppsspp and http://www.ppsspp.org/. - -#pragma once - -struct FShaderID; - -bool GenerateFragmentShaderVulkanGLSL(const FShaderID &id, char *buffer, uint32_t vulkanVendorId, std::string *errorString); diff --git a/GPU/Vulkan/ShaderManagerVulkan.cpp b/GPU/Vulkan/ShaderManagerVulkan.cpp index dff7f01d64..8d20b9ca58 100644 --- a/GPU/Vulkan/ShaderManagerVulkan.cpp +++ b/GPU/Vulkan/ShaderManagerVulkan.cpp @@ -39,7 +39,7 @@ #include "GPU/Vulkan/ShaderManagerVulkan.h" #include "GPU/Vulkan/DrawEngineVulkan.h" #include "GPU/Vulkan/FramebufferManagerVulkan.h" -#include "GPU/Vulkan/FragmentShaderGeneratorVulkan.h" +#include "GPU/GLES/FragmentShaderGeneratorGLES.h" #include "GPU/Vulkan/VertexShaderGeneratorVulkan.h" VulkanFragmentShader::VulkanFragmentShader(VulkanContext *vulkan, FShaderID id, const char *code) @@ -168,6 +168,8 @@ ShaderManagerVulkan::ShaderManagerVulkan(Draw::DrawContext *draw, VulkanContext static_assert(sizeof(ub_base) <= 512, "ub_base grew too big"); static_assert(sizeof(ub_lights) <= 512, "ub_lights grew too big"); static_assert(sizeof(ub_bones) <= 384, "ub_bones grew too big"); + + compat_.SetupForVulkan(); } ShaderManagerVulkan::~ShaderManagerVulkan() { @@ -271,10 +273,11 @@ void ShaderManagerVulkan::GetShaders(int prim, u32 vertType, VulkanVertexShader VulkanFragmentShader *fs = fsCache_.Get(FSID); if (!fs) { - uint32_t vendorID = vulkan_->GetPhysicalDeviceProperties().properties.vendorID; + // uint32_t vendorID = vulkan_->GetPhysicalDeviceProperties().properties.vendorID; // Fragment shader not in cache. Let's compile it. std::string genErrorString; - bool success = GenerateFragmentShaderVulkanGLSL(FSID, codeBuffer_, vendorID, &genErrorString); + uint64_t uniformMask = 0; // Not used + bool success = GenerateFragmentShaderGLSL(FSID, codeBuffer_, compat_, &uniformMask, &genErrorString); _assert_(success); fs = new VulkanFragmentShader(vulkan_, FSID, codeBuffer_); fsCache_.Insert(FSID, fs); @@ -399,6 +402,8 @@ bool ShaderManagerVulkan::LoadCache(FILE *f) { vsCache_.Insert(id, vs); } uint32_t vendorID = vulkan_->GetPhysicalDeviceProperties().properties.vendorID; + GLSLShaderCompat compat{}; + compat.SetupForVulkan(); for (int i = 0; i < header.numFragmentShaders; i++) { FShaderID id; if (fread(&id, sizeof(id), 1, f) != 1) { @@ -406,7 +411,8 @@ bool ShaderManagerVulkan::LoadCache(FILE *f) { break; } std::string genErrorString; - if (!GenerateFragmentShaderVulkanGLSL(id, codeBuffer_, vendorID, &genErrorString)) { + uint64_t uniformMask = 0; + if (!GenerateFragmentShaderGLSL(id, codeBuffer_, compat, &uniformMask, &genErrorString)) { return false; } VulkanFragmentShader *fs = new VulkanFragmentShader(vulkan_, id, codeBuffer_); diff --git a/GPU/Vulkan/ShaderManagerVulkan.h b/GPU/Vulkan/ShaderManagerVulkan.h index 92a52594ff..ddd2629422 100644 --- a/GPU/Vulkan/ShaderManagerVulkan.h +++ b/GPU/Vulkan/ShaderManagerVulkan.h @@ -25,7 +25,7 @@ #include "GPU/Common/ShaderCommon.h" #include "GPU/Common/ShaderId.h" #include "GPU/Vulkan/VertexShaderGeneratorVulkan.h" -#include "GPU/Vulkan/FragmentShaderGeneratorVulkan.h" +#include "GPU/GLES/FragmentShaderGeneratorGLES.h" #include "GPU/Vulkan/VulkanUtil.h" #include "Common/Math/lin/matrix4x4.h" #include "GPU/Common/ShaderUniforms.h" @@ -131,6 +131,7 @@ private: void Clear(); VulkanContext *vulkan_; + GLSLShaderCompat compat_{}; typedef DenseHashMap FSCache; FSCache fsCache_; diff --git a/GPU/Vulkan/StencilBufferVulkan.cpp b/GPU/Vulkan/StencilBufferVulkan.cpp index 95baef8a59..28d9132462 100644 --- a/GPU/Vulkan/StencilBufferVulkan.cpp +++ b/GPU/Vulkan/StencilBufferVulkan.cpp @@ -22,7 +22,6 @@ #include "Core/Reporting.h" #include "GPU/Common/StencilCommon.h" #include "GPU/Vulkan/FramebufferManagerVulkan.h" -#include "GPU/Vulkan/FragmentShaderGeneratorVulkan.h" #include "GPU/Vulkan/ShaderManagerVulkan.h" #include "GPU/Vulkan/TextureCacheVulkan.h" #include "GPU/Vulkan/VulkanUtil.h" diff --git a/GPU/Vulkan/TextureCacheVulkan.cpp b/GPU/Vulkan/TextureCacheVulkan.cpp index 7acd871dd2..018f76169b 100644 --- a/GPU/Vulkan/TextureCacheVulkan.cpp +++ b/GPU/Vulkan/TextureCacheVulkan.cpp @@ -45,7 +45,6 @@ #include "GPU/Common/TextureDecoder.h" #include "GPU/Vulkan/TextureCacheVulkan.h" #include "GPU/Vulkan/FramebufferManagerVulkan.h" -#include "GPU/Vulkan/FragmentShaderGeneratorVulkan.h" #include "GPU/Vulkan/DepalettizeShaderVulkan.h" #include "GPU/Vulkan/ShaderManagerVulkan.h" #include "GPU/Vulkan/DrawEngineVulkan.h" diff --git a/android/jni/Android.mk b/android/jni/Android.mk index 5772dbc805..96f52d33ab 100644 --- a/android/jni/Android.mk +++ b/android/jni/Android.mk @@ -125,7 +125,6 @@ VULKAN_FILES := \ $(SRC)/Common/GPU/Vulkan/VulkanDebug.cpp \ $(SRC)/Common/GPU/Vulkan/VulkanImage.cpp \ $(SRC)/Common/GPU/Vulkan/VulkanMemory.cpp \ - $(SRC)/GPU/Vulkan/FragmentShaderGeneratorVulkan.cpp \ $(SRC)/GPU/Vulkan/DrawEngineVulkan.cpp \ $(SRC)/GPU/Vulkan/FramebufferManagerVulkan.cpp \ $(SRC)/GPU/Vulkan/GPU_Vulkan.cpp \ diff --git a/libretro/Makefile.common b/libretro/Makefile.common index 11b8998bd6..29e24d164c 100644 --- a/libretro/Makefile.common +++ b/libretro/Makefile.common @@ -639,7 +639,6 @@ SOURCES_C += \ SOURCES_CXX += \ $(GPUDIR)/Vulkan/DepalettizeShaderVulkan.cpp \ $(GPUDIR)/Vulkan/DrawEngineVulkan.cpp \ - $(GPUDIR)/Vulkan/FragmentShaderGeneratorVulkan.cpp \ $(GPUDIR)/Vulkan/FramebufferManagerVulkan.cpp \ $(GPUDIR)/Vulkan/GPU_Vulkan.cpp \ $(GPUDIR)/Vulkan/PipelineManagerVulkan.cpp \ diff --git a/unittest/TestShaderGenerators.cpp b/unittest/TestShaderGenerators.cpp index 7fea59c9bb..2c4ffa936b 100644 --- a/unittest/TestShaderGenerators.cpp +++ b/unittest/TestShaderGenerators.cpp @@ -8,7 +8,6 @@ #include "GPU/Vulkan/VulkanContext.h" -#include "GPU/Vulkan/FragmentShaderGeneratorVulkan.h" #include "GPU/Directx9/FragmentShaderGeneratorHLSL.h" #include "GPU/GLES/FragmentShaderGeneratorGLES.h" @@ -22,22 +21,6 @@ #include "GPU/D3D9/D3DCompilerLoader.h" #include "GPU/D3D9/D3D9ShaderCompiler.h" -void SetupCompatForVulkan(GLSLShaderCompat &compat) { - compat.fragColor0 = "fragColor0"; - compat.fragColor1 = "fragColor1"; - compat.varying_fs = "in"; - compat.varying_vs = "out"; - compat.attribute = "in"; - compat.bitwiseOps = true; - compat.framebufferFetchExtension = false; - compat.gles = false; - compat.glslES30 = true; - compat.glslVersionNumber = 450; - compat.lastFragData = nullptr; - compat.texture = "texture"; - compat.texelFetch = "texelFetch"; - compat.vulkan = true; -} bool GenerateFShader(FShaderID id, char *buffer, ShaderLanguage lang, std::string *errorString) { switch (lang) { @@ -48,11 +31,9 @@ bool GenerateFShader(FShaderID id, char *buffer, ShaderLanguage lang, std::strin // TODO: Need a device :( Returning false here so it doesn't get tried. return false; case ShaderLanguage::GLSL_VULKAN: - return GenerateFragmentShaderVulkanGLSL(id, buffer, 0, errorString); - case ShaderLanguage::TEST_GLSL_VULKAN: { GLSLShaderCompat compat{}; - SetupCompatForVulkan(compat); + compat.SetupForVulkan(); uint64_t uniformMask; return GenerateFragmentShaderGLSL(id, buffer, compat, &uniformMask, errorString); } @@ -104,9 +85,6 @@ bool TestCompileShader(const char *buffer, ShaderLanguage lang, bool vertex) { return false; case ShaderLanguage::GLSL_300: return false; - case ShaderLanguage::TEST_GLSL_VULKAN: - // Temporary while testing the vulkan->glsl merge - return true; default: return false; @@ -146,7 +124,6 @@ bool TestShaderGenerators() { LoadD3DCompilerDynamic(); ShaderLanguage languages[] = { - ShaderLanguage::TEST_GLSL_VULKAN, ShaderLanguage::GLSL_VULKAN, ShaderLanguage::HLSL_D3D11, ShaderLanguage::GLSL_140, @@ -184,7 +161,8 @@ bool TestShaderGenerators() { // We ignore the contents of the error string here, not even gonna try to compile if it errors. } - // Temporary test: Compare GLSL-in-Vulkan-mode vs Vulkan + /* + // KEEPING FOR REUSE LATER: Defunct temporary test: Compare GLSL-in-Vulkan-mode vs Vulkan if (generateSuccess[0] != generateSuccess[1]) { printf("mismatching success! %s %s\n", genErrorString[0].c_str(), genErrorString[1].c_str()); printf("%s\n", buffer[0]); @@ -196,6 +174,7 @@ bool TestShaderGenerators() { PrintDiff(buffer[0], buffer[1]); return 1; } + */ // Now that we have the strings ready for easy comparison (buffer,4 in the watch window), // let's try to compile them. From 349fc7071cee9ccef83ea1d6b919ea384d67b64a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Fri, 23 Oct 2020 16:15:01 +0200 Subject: [PATCH 085/275] Revert "Android gradle update" This reverts commit 624998becd7f689b15e54873095607923886a354. --- build.gradle | 2 +- gradle/wrapper/gradle-wrapper.properties | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/build.gradle b/build.gradle index c260ed8c66..11479e334c 100644 --- a/build.gradle +++ b/build.gradle @@ -5,7 +5,7 @@ buildscript { jcenter() } dependencies { - classpath 'com.android.tools.build:gradle:4.1.0' + classpath 'com.android.tools.build:gradle:4.0.2' } } diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 92d368b388..3967b35ba1 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ -#Thu Oct 22 23:11:13 CEST 2020 +#Thu May 28 22:53:27 CEST 2020 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-6.5-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-6.1.1-all.zip From e7147fdb09486830103d395ba44dee6899ab49a7 Mon Sep 17 00:00:00 2001 From: shenweip <1037567878@qq.com> Date: Sat, 24 Oct 2020 21:06:36 +0800 Subject: [PATCH 086/275] Fixes savesate for usbmic. Prevents audiobuf from being null pointer. --- Core/HLE/sceUsbMic.cpp | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/Core/HLE/sceUsbMic.cpp b/Core/HLE/sceUsbMic.cpp index 91855a0804..39a6903f6d 100644 --- a/Core/HLE/sceUsbMic.cpp +++ b/Core/HLE/sceUsbMic.cpp @@ -118,7 +118,7 @@ void __UsbMicShutdown() { } void __UsbMicDoState(PointerWrap &p) { - auto s = p.Section("sceUsbMic", 0, 1); + auto s = p.Section("sceUsbMic", 0, 2); if (!s) { return; } @@ -128,18 +128,30 @@ void __UsbMicDoState(PointerWrap &p) { Do(p, curSampleRate); Do(p, curChannels); Do(p, micState); + if (s > 1) { + Do(p, eventUsbMicAudioUpdate); + CoreTiming::RestoreRegisterEvent(eventUsbMicAudioUpdate, "UsbMicAudioUpdate", &__UsbMicAudioUpdate); + } else { + eventUsbMicAudioUpdate = -1; + } + + if (!audioBuf && numNeedSamples > 0) { + audioBuf = new QueueBuf(numNeedSamples << 1); + } + if(eventUsbMicAudioUpdate = -1) + eventUsbMicAudioUpdate = CoreTiming::RegisterEvent("UsbMicAudioUpdate", &__UsbMicAudioUpdate); // Maybe also need to save the state of audioBuf. if (waitingThreads.size() != 0 && p.mode == PointerWrap::MODE_READ) { u64 waitTimeus = (waitingThreads[0].needSize - Microphone::availableAudioBufSize()) * 1000000 / 2 / waitingThreads[0].sampleRate; CoreTiming::ScheduleEvent(usToCycles(waitTimeus), eventUsbMicAudioUpdate, waitingThreads[0].threadID); } + if (micState == 0) { if (Microphone::isMicStarted()) Microphone::stopMic(); } else if (micState == 1) { if (Microphone::isMicStarted()) { - Microphone::stopMic(); - Microphone::startMic(new std::vector({ curSampleRate, curChannels })); + // Ok, started. } else { Microphone::startMic(new std::vector({ curSampleRate, curChannels })); } From 9379fe139969657c8a276ef3d02f0291191497af Mon Sep 17 00:00:00 2001 From: Florin9doi Date: Tue, 6 Aug 2019 15:20:10 +0300 Subject: [PATCH 087/275] [Android] Audio record using OpenSL --- Core/HLE/sceUsbCam.cpp | 11 +- Core/HLE/sceUsbGps.cpp | 4 +- Core/HLE/sceUsbGps.h | 2 +- Core/HLE/sceUsbMic.cpp | 15 +- android/AndroidManifest.xml | 1 + android/jni/AndroidAudio.cpp | 39 ++++++ android/jni/AndroidAudio.h | 4 + android/jni/OpenSLContext.cpp | 129 +++++++++++++++++- android/jni/OpenSLContext.h | 23 +++- android/jni/app-android.cpp | 8 ++ .../src/org/ppsspp/ppsspp/NativeActivity.java | 13 ++ android/src/org/ppsspp/ppsspp/NativeApp.java | 3 + 12 files changed, 238 insertions(+), 14 deletions(-) diff --git a/Core/HLE/sceUsbCam.cpp b/Core/HLE/sceUsbCam.cpp index 7793e372a0..37089b9c42 100644 --- a/Core/HLE/sceUsbCam.cpp +++ b/Core/HLE/sceUsbCam.cpp @@ -137,6 +137,11 @@ static int sceUsbCamReadMicBlocking(u32 bufAddr, u32 size) { return __MicInputBlocking(size >> 1, config->micParam.frequency, bufAddr); } +static int sceUsbCamReadMic(u32 bufAddr, u32 size) { + INFO_LOG(HLE, "UNIMPL sceUsbCamReadMic: size: %d", size); + return __MicInputBlocking(size >> 1, config->micParam.frequency, bufAddr); +} + static int sceUsbCamSetupVideo(u32 paramAddr, u32 workareaAddr, int wasize) { if (Memory::IsValidRange(paramAddr, sizeof(PspUsbCamSetupVideoParam))) { Memory::ReadStruct(paramAddr, &config->videoParam); @@ -185,7 +190,7 @@ static int sceUsbCamReadVideoFrameBlocking(u32 bufAddr, u32 size) { if (Memory::IsValidRange(bufAddr, size)) { Memory::Memcpy(bufAddr, videoBuffer, transferSize); } - return videoBufferLength; + return transferSize; } static int sceUsbCamReadVideoFrame(u32 bufAddr, u32 size) { @@ -194,7 +199,7 @@ static int sceUsbCamReadVideoFrame(u32 bufAddr, u32 size) { if (Memory::IsValidRange(bufAddr, size)) { Memory::Memcpy(bufAddr, videoBuffer, transferSize); } - nextVideoFrame = videoBufferLength; + nextVideoFrame = transferSize; return 0; } @@ -243,7 +248,7 @@ const HLEFunction sceUsbCam[] = { 0X82A64030, &WrapI_V, "sceUsbCamStartMic", 'i', "" }, { 0X5145868A, &WrapI_V, "sceUsbCamStopMic", 'i', "" }, { 0X36636925, &WrapI_UU, "sceUsbCamReadMicBlocking", 'i', "xx" }, - { 0X3DC0088E, nullptr, "sceUsbCamReadMic", '?', "" }, + { 0X3DC0088E, &WrapI_UU, "sceUsbCamReadMic", 'i', "xx" }, { 0XB048A67D, nullptr, "sceUsbCamWaitReadMicEnd", '?', "" }, { 0XF8847F60, nullptr, "sceUsbCamPollReadMicEnd", '?', "" }, { 0X5778B452, nullptr, "sceUsbCamGetMicDataLength", '?', "" }, diff --git a/Core/HLE/sceUsbGps.cpp b/Core/HLE/sceUsbGps.cpp index 723e83d445..456d09b487 100644 --- a/Core/HLE/sceUsbGps.cpp +++ b/Core/HLE/sceUsbGps.cpp @@ -92,14 +92,16 @@ const HLEFunction sceUsbGps[] = {0X268F95CA, nullptr, "sceUsbGpsSetInitDataLocation", '?', "" }, {0X31F95CDE, nullptr, "sceUsbGpsGetPowerSaveMode", '?', "" }, {0X54D26AA4, &WrapI_U, "sceUsbGpsGetInitDataLocation", 'i', "x" }, + {0X5881C826, nullptr, "sceUsbGpsGetStaticNavMode", '?', "" }, {0X63D1F89D, nullptr, "sceUsbGpsResetInitialPosition", '?', "" }, {0X69E4AAA8, nullptr, "sceUsbGpsSaveInitData", '?', "" }, {0X6EED4811, &WrapI_V, "sceUsbGpsClose", 'i', "" }, - {0X7C16AC3A, &WrapI_U, "sceUsbGpsGetState", 'i', "x"}, + {0X7C16AC3A, &WrapI_U, "sceUsbGpsGetState", 'i', "x" }, {0X934EC2B2, &WrapI_UU, "sceUsbGpsGetData", 'i', "xx" }, {0X9D8F99E8, nullptr, "sceUsbGpsSetPowerSaveMode", '?', "" }, {0X9F267D34, &WrapI_V, "sceUsbGpsOpen", 'i', "" }, {0XA259CD67, nullptr, "sceUsbGpsReset", '?', "" }, + {0XA8ED0BC2, nullptr, "sceUsbGpsSetStaticNavMode", '?', "" }, }; void Register_sceUsbGps() diff --git a/Core/HLE/sceUsbGps.h b/Core/HLE/sceUsbGps.h index 24c2f5ccd0..39513cda71 100644 --- a/Core/HLE/sceUsbGps.h +++ b/Core/HLE/sceUsbGps.h @@ -43,7 +43,7 @@ typedef struct { float garbage3; float speed; float bearing; -} GpsData; +} GpsData; typedef struct { unsigned char id; diff --git a/Core/HLE/sceUsbMic.cpp b/Core/HLE/sceUsbMic.cpp index 91855a0804..c04d0c1f41 100644 --- a/Core/HLE/sceUsbMic.cpp +++ b/Core/HLE/sceUsbMic.cpp @@ -19,6 +19,7 @@ #include "Common/Serialize/Serializer.h" #include "Common/Serialize/SerializeFuncs.h" +#include "Common/System/System.h" #include "Core/HLE/HLE.h" #include "Core/HLE/FunctionWrappers.h" #include "Core/HLE/sceKernelThread.h" @@ -302,6 +303,12 @@ int Microphone::startMic(void *param) { #ifdef HAVE_WIN32_MICROPHONE if (winMic) winMic->sendMessage({ CAPTUREDEVIDE_COMMAND::START, param }); +#elif PPSSPP_PLATFORM(ANDROID) + std::vector *micParam = static_cast*>(param); + int sampleRate = micParam->at(0); + int channels = micParam->at(1); + INFO_LOG(HLE, "microphone_command : sr = %d", sampleRate); + System_SendMessage("microphone_command", ("startRecording:" + std::to_string(sampleRate)).c_str()); #endif micState = 1; return 0; @@ -311,6 +318,8 @@ int Microphone::stopMic() { #ifdef HAVE_WIN32_MICROPHONE if (winMic) winMic->sendMessage({ CAPTUREDEVIDE_COMMAND::STOP, nullptr }); +#elif PPSSPP_PLATFORM(ANDROID) + System_SendMessage("microphone_command", "stopRecording"); #endif micState = 0; return 0; @@ -319,6 +328,8 @@ int Microphone::stopMic() { bool Microphone::isHaveDevice() { #ifdef HAVE_WIN32_MICROPHONE return winMic->getDeviceCounts() >= 1; +#elif PPSSPP_PLATFORM(ANDROID) + return true; #endif return false; } @@ -327,6 +338,8 @@ bool Microphone::isMicStarted() { #ifdef HAVE_WIN32_MICROPHONE if(winMic) return winMic->isStarted(); +#elif PPSSPP_PLATFORM(ANDROID) + return micState; #endif return false; } @@ -419,7 +432,7 @@ const HLEFunction sceUsbMic[] = {0x06128E42, &WrapI_V, "sceUsbMicPollInputEnd", 'i', "" }, {0x2E6DCDCD, &WrapI_UUU, "sceUsbMicInputBlocking", 'i', "xxx" }, {0x45310F07, &WrapI_U, "sceUsbMicInputInitEx", 'i', "x" }, - {0x5F7F368D, &WrapI_V , "sceUsbMicInput", 'i', "" }, + {0x5F7F368D, &WrapI_V, "sceUsbMicInput", 'i', "" }, {0x63400E20, &WrapI_V, "sceUsbMicGetInputLength", 'i', "" }, {0xB8E536EB, &WrapI_III, "sceUsbMicInputInit", 'i', "iii" }, {0xF899001C, &WrapI_V, "sceUsbMicWaitInputEnd", 'i', "" }, diff --git a/android/AndroidManifest.xml b/android/AndroidManifest.xml index 11e2682563..964747a804 100644 --- a/android/AndroidManifest.xml +++ b/android/AndroidManifest.xml @@ -26,6 +26,7 @@ + ctx) { + ERROR_LOG(AUDIO, "OpenSLContext not initialized, cannot start recording!"); + return false; + } + state->input_enable = 1; + state->input_sample_rate = sampleRate; + state->ctx->AudioRecord_Start(sampleRate); + INFO_LOG(AUDIO, "AndroidAudio_Recording_Start"); + return true; +} + +bool AndroidAudio_Recording_Stop(AndroidAudioState *state) { + if (!state) { + ERROR_LOG(AUDIO, "AndroidAudioState not initialized, cannot stop recording!"); + return false; + } + if (!state->ctx) { + ERROR_LOG(AUDIO, "OpenSLContext not initialized, cannot stop recording!"); + return false; + } + state->input_enable = 0; + state->input_sample_rate = 0; + state->ctx->AudioRecord_Stop(); + INFO_LOG(AUDIO, "AndroidAudio_Recording_Stop"); + return true; +} + bool AndroidAudio_Resume(AndroidAudioState *state) { if (!state) { ERROR_LOG(AUDIO, "Audio was shutdown, cannot resume!"); @@ -44,6 +80,9 @@ bool AndroidAudio_Resume(AndroidAudioState *state) { delete state->ctx; state->ctx = nullptr; } + if (state->input_enable) { + state->ctx->AudioRecord_Start(state->input_sample_rate); + } return init_retval; } return false; diff --git a/android/jni/AndroidAudio.h b/android/jni/AndroidAudio.h index a3d1ab8ee8..ad6923d184 100644 --- a/android/jni/AndroidAudio.h +++ b/android/jni/AndroidAudio.h @@ -8,6 +8,8 @@ class AudioContext { public: AudioContext(AndroidAudioCallback cb, int _FramesPerBuffer, int _SampleRate); virtual bool Init() { return false; } + virtual int AudioRecord_Start(int sampleRate) { return false; }; + virtual int AudioRecord_Stop() { return false; }; virtual ~AudioContext() {} protected: @@ -21,6 +23,8 @@ struct AndroidAudioState; // It's okay for optimalFramesPerBuffer and optimalSampleRate to be 0. Defaults will be used. AndroidAudioState *AndroidAudio_Init(AndroidAudioCallback cb, int optimalFramesPerBuffer, int optimalSampleRate); +bool AndroidAudio_Recording_Start(AndroidAudioState *state, int sampleRate); +bool AndroidAudio_Recording_Stop(AndroidAudioState *state); bool AndroidAudio_Pause(AndroidAudioState *state); bool AndroidAudio_Resume(AndroidAudioState *state); bool AndroidAudio_Shutdown(AndroidAudioState *state); diff --git a/android/jni/OpenSLContext.cpp b/android/jni/OpenSLContext.cpp index 77ccfde2eb..93fa8848fc 100644 --- a/android/jni/OpenSLContext.cpp +++ b/android/jni/OpenSLContext.cpp @@ -11,6 +11,32 @@ #include "Common/Log.h" #include "OpenSLContext.h" +#include "Core/HLE/sceUsbMic.h" + +void OpenSLContext::bqRecorderCallback(SLAndroidSimpleBufferQueueItf bq, void *context) { + OpenSLContext *ctx = (OpenSLContext *)context; + SLresult result; + + SLuint32 recordsState; + result = (*ctx->recorderRecord)->GetRecordState(ctx->recorderRecord, &recordsState); + if(result != SL_RESULT_SUCCESS) { + ERROR_LOG(AUDIO, "GetRecordState error: %d", result); + return; + } + + Microphone::addAudioData((uint8_t*) ctx->recordBuffer[ctx->activeRecordBuffer], ctx->recordBufferSize); + + if (recordsState == SL_RECORDSTATE_RECORDING) { + result = (*ctx->recorderBufferQueue)->Enqueue(ctx->recorderBufferQueue, ctx->recordBuffer[ctx->activeRecordBuffer], ctx->recordBufferSize); + if (result != SL_RESULT_SUCCESS) { + ERROR_LOG(AUDIO, "Enqueue error: %d", result); + } + } + + ctx->activeRecordBuffer += 1; // Switch buffer + if (ctx->activeRecordBuffer == NUM_BUFFERS) + ctx->activeRecordBuffer = 0; +} // This callback handler is called every time a buffer finishes playing. // The documentation available is very unclear about how to best manage buffers. @@ -101,7 +127,8 @@ bool OpenSLContext::Init() { // create audio player const SLInterfaceID ids[2] = {SL_IID_BUFFERQUEUE, SL_IID_VOLUME}; const SLboolean req[2] = {SL_BOOLEAN_TRUE, SL_BOOLEAN_TRUE}; - result = (*engineEngine)->CreateAudioPlayer(engineEngine, &bqPlayerObject, &audioSrc, &audioSnk, 2, ids, req); + result = (*engineEngine)->CreateAudioPlayer(engineEngine, &bqPlayerObject, &audioSrc, &audioSnk, + sizeof(ids)/sizeof(ids[0]), ids, req); if (result != SL_RESULT_SUCCESS) { ERROR_LOG(AUDIO, "OpenSL: CreateAudioPlayer failed: %d", (int)result); (*outputMixObject)->Destroy(outputMixObject); @@ -145,6 +172,102 @@ bool OpenSLContext::Init() { return true; } +int OpenSLContext::AudioRecord_Start(int sampleRate) { + SLresult result; + + // configure audio source + SLDataLocator_IODevice loc_dev = {SL_DATALOCATOR_IODEVICE, SL_IODEVICE_AUDIOINPUT, SL_DEFAULTDEVICEID_AUDIOINPUT, NULL}; + SLDataSource audioSrc = {&loc_dev, NULL}; + + // configure audio sink + SLDataLocator_AndroidSimpleBufferQueue loc_bq = {SL_DATALOCATOR_ANDROIDSIMPLEBUFFERQUEUE, 2}; + SLDataFormat_PCM format_pcm = { + SL_DATAFORMAT_PCM, + 1, + (SLuint32) sampleRate * 1000, // The constants such as SL_SAMPLINGRATE_44_1 are 44100000 + SL_PCMSAMPLEFORMAT_FIXED_16, + SL_PCMSAMPLEFORMAT_FIXED_16, + SL_SPEAKER_FRONT_CENTER, + SL_BYTEORDER_LITTLEENDIAN + }; + SLDataSink audioSnk = {&loc_bq, &format_pcm}; + + // create audio recorder + const SLInterfaceID id[1] = {SL_IID_ANDROIDSIMPLEBUFFERQUEUE}; + const SLboolean req[1] = {SL_BOOLEAN_TRUE}; + result = (*engineEngine)->CreateAudioRecorder(engineEngine, &recorderObject, &audioSrc, &audioSnk, + sizeof(id)/sizeof(id[0]), id, req); + if (SL_RESULT_SUCCESS != result) { + ERROR_LOG(AUDIO, "CreateAudioRecorder failed: %d", result); + return false; + } + + // realize the audio recorder + result = (*recorderObject)->Realize(recorderObject, SL_BOOLEAN_FALSE); + if (SL_RESULT_SUCCESS != result) { + ERROR_LOG(AUDIO, "Realize failed: %d", result); + return false; + } + + // get the record interface + result = (*recorderObject)->GetInterface(recorderObject, SL_IID_RECORD, &recorderRecord); + if (SL_RESULT_SUCCESS != result) { + ERROR_LOG(AUDIO, "GetInterface(record) failed: %d", result); + return false; + } + + // get the buffer queue interface + result = (*recorderObject)->GetInterface(recorderObject, SL_IID_ANDROIDSIMPLEBUFFERQUEUE, (void*) &recorderBufferQueue); + if (SL_RESULT_SUCCESS != result) { + ERROR_LOG(AUDIO, "GetInterface(queue interface) failed: %d", result); + return false; + } + + // register callback on the buffer queue + result = (*recorderBufferQueue)->RegisterCallback(recorderBufferQueue, &bqRecorderCallback, this); + if (SL_RESULT_SUCCESS != result) { + ERROR_LOG(AUDIO, "RegisterCallback failed: %d", result); + return false; + } + + recordBufferSize = (44100 * 20 / 1000 * 2); + for (int i = 0; i < NUM_BUFFERS; i++) { + recordBuffer[i] = new short[recordBufferSize]; + } + for (int i = 0; i < NUM_BUFFERS; i++) { + result = (*recorderBufferQueue)->Enqueue(recorderBufferQueue, recordBuffer[i], recordBufferSize); + if (SL_RESULT_SUCCESS != result) { + ERROR_LOG(AUDIO, "Enqueue failed: %d", result); + return false; + } + } + + result = (*recorderRecord)->SetRecordState(recorderRecord, SL_RECORDSTATE_RECORDING); + assert(SL_RESULT_SUCCESS == result); + + return true; +} + +int OpenSLContext::AudioRecord_Stop() { + if (recorderRecord != nullptr) { + SLresult result = (*recorderRecord)->SetRecordState(recorderRecord, SL_RECORDSTATE_STOPPED); + assert(SL_RESULT_SUCCESS == result); + } + if (recorderObject != nullptr) { + (*recorderObject)->Destroy(recorderObject); + recorderObject = nullptr; + recorderRecord = nullptr; + recorderBufferQueue = nullptr; + } + if (recordBuffer[0] != nullptr) { + delete [] recordBuffer[0]; + delete [] recordBuffer[1]; + recordBuffer[0] = nullptr; + recordBuffer[1] = nullptr; + } + return true; +} + // shut down the native audio system OpenSLContext::~OpenSLContext() { if (bqPlayerPlay) { @@ -172,6 +295,7 @@ OpenSLContext::~OpenSLContext() { (*outputMixObject)->Destroy(outputMixObject); outputMixObject = nullptr; } + AudioRecord_Stop(); INFO_LOG(AUDIO, "OpenSL: Shutdown - deleting engine object"); @@ -186,5 +310,4 @@ OpenSLContext::~OpenSLContext() { buffer[i] = nullptr; } INFO_LOG(AUDIO, "OpenSL: Shutdown - finished"); -} - +} diff --git a/android/jni/OpenSLContext.h b/android/jni/OpenSLContext.h index 3705f66b82..e95afa8502 100644 --- a/android/jni/OpenSLContext.h +++ b/android/jni/OpenSLContext.h @@ -10,25 +10,38 @@ public: OpenSLContext(AndroidAudioCallback cb, int framesPerBuffer, int sampleRate); bool Init() override; + int AudioRecord_Start(int sampleRate) override; + int AudioRecord_Stop() override; ~OpenSLContext(); private: + // Should be no reason to need more than two buffers, but make it clear in the code. + enum { + NUM_BUFFERS = 2, + }; + // engine interfaces SLObjectItf engineObject = nullptr; SLEngineItf engineEngine = nullptr; SLObjectItf outputMixObject = nullptr; + // audio recorder interfaces + SLObjectItf recorderObject = nullptr; + SLRecordItf recorderRecord = nullptr; + SLAndroidSimpleBufferQueueItf recorderBufferQueue = nullptr; + + int recordBufferSize = 0; + short *recordBuffer[NUM_BUFFERS]{}; + int activeRecordBuffer = 0; + + static void bqRecorderCallback(SLAndroidSimpleBufferQueueItf bq, void *context); + // buffer queue player interfaces SLObjectItf bqPlayerObject = nullptr; SLPlayItf bqPlayerPlay = nullptr; SLAndroidSimpleBufferQueueItf bqPlayerBufferQueue = nullptr; SLVolumeItf bqPlayerVolume = nullptr; - // Should be no reason to need more than two buffers, but make it clear in the code. - enum { - NUM_BUFFERS = 2, - }; - // Double buffering. short *buffer[NUM_BUFFERS]{}; int curBuffer = 0; diff --git a/android/jni/app-android.cpp b/android/jni/app-android.cpp index 54687fc1e8..48a36036ed 100644 --- a/android/jni/app-android.cpp +++ b/android/jni/app-android.cpp @@ -678,6 +678,14 @@ extern "C" void Java_org_ppsspp_ppsspp_NativeApp_audioShutdown(JNIEnv *, jclass) } } +extern "C" void Java_org_ppsspp_ppsspp_NativeApp_audioRecording_1Start(JNIEnv *, jclass, jint sampleRate) { + AndroidAudio_Recording_Start(g_audioState, sampleRate); +} + +extern "C" void Java_org_ppsspp_ppsspp_NativeApp_audioRecording_1Stop(JNIEnv *, jclass) { + AndroidAudio_Recording_Stop(g_audioState); +} + extern "C" void Java_org_ppsspp_ppsspp_NativeApp_resume(JNIEnv *, jclass) { INFO_LOG(SYSTEM, "NativeApp.resume() - resuming audio"); AndroidAudio_Resume(g_audioState); diff --git a/android/src/org/ppsspp/ppsspp/NativeActivity.java b/android/src/org/ppsspp/ppsspp/NativeActivity.java index 477d7b42cf..2f61560417 100644 --- a/android/src/org/ppsspp/ppsspp/NativeActivity.java +++ b/android/src/org/ppsspp/ppsspp/NativeActivity.java @@ -122,10 +122,14 @@ public abstract class NativeActivity extends Activity { private static final String[] permissionsForCamera = { Manifest.permission.CAMERA }; + private static final String[] permissionsForMicrophone = { + Manifest.permission.RECORD_AUDIO + }; public static final int REQUEST_CODE_STORAGE_PERMISSION = 1; public static final int REQUEST_CODE_LOCATION_PERMISSION = 2; public static final int REQUEST_CODE_CAMERA_PERMISSION = 3; + public static final int REQUEST_CODE_MICROPHONE_PERMISSION = 4; // Functions for the app activity to override to change behaviour. @@ -1289,6 +1293,15 @@ public abstract class NativeActivity extends Activity { } else if (mCameraHelper != null && params.equals("stopVideo")) { mCameraHelper.stopCamera(); } + } else if (command.equals("microphone_command")) { + if (params.startsWith("startRecording:")) { + if (!askForPermissions(permissionsForMicrophone, REQUEST_CODE_MICROPHONE_PERMISSION)) { + int sampleRate = Integer.valueOf(params.replace("startRecording:", "")); + NativeApp.audioRecording_Start(sampleRate); + } + } else if (params.equals("stopRecording")) { + NativeApp.audioRecording_Stop(); + } } else if (command.equals("uistate")) { Window window = this.getWindow(); if (params.equals("ingame")) { diff --git a/android/src/org/ppsspp/ppsspp/NativeApp.java b/android/src/org/ppsspp/ppsspp/NativeApp.java index 46598c8263..53a0f36909 100644 --- a/android/src/org/ppsspp/ppsspp/NativeApp.java +++ b/android/src/org/ppsspp/ppsspp/NativeApp.java @@ -17,6 +17,9 @@ public class NativeApp { public static native void audioShutdown(); public static native void audioConfig(int optimalFramesPerBuffer, int optimalSampleRate); + public static native void audioRecording_Start(int sampleRate); + public static native void audioRecording_Stop(); + public static native void computeDesiredBackbufferDimensions(); public static native int getDesiredBackbufferWidth(); public static native int getDesiredBackbufferHeight(); From a42f5234c590a0326f1b830f73906debedf10bf6 Mon Sep 17 00:00:00 2001 From: Florin9doi Date: Sat, 24 Oct 2020 12:03:43 +0300 Subject: [PATCH 088/275] [Android] Start recording immediately after asking for permission --- android/jni/AndroidAudio.cpp | 17 +++++++++++++---- android/jni/AndroidAudio.h | 3 ++- android/jni/app-android.cpp | 8 ++++++-- .../src/org/ppsspp/ppsspp/NativeActivity.java | 10 ++++++++-- android/src/org/ppsspp/ppsspp/NativeApp.java | 3 ++- 5 files changed, 31 insertions(+), 10 deletions(-) diff --git a/android/jni/AndroidAudio.cpp b/android/jni/AndroidAudio.cpp index c4419629b9..ec29e0eb26 100644 --- a/android/jni/AndroidAudio.cpp +++ b/android/jni/AndroidAudio.cpp @@ -34,18 +34,27 @@ AndroidAudioState *AndroidAudio_Init(AndroidAudioCallback callback, int optimalF return state; } -bool AndroidAudio_Recording_Start(AndroidAudioState *state, int sampleRate) { +bool AndroidAudio_Recording_SetSampleRate(AndroidAudioState *state, int sampleRate) { + if (!state) { + ERROR_LOG(AUDIO, "AndroidAudioState not initialized, cannot set recording sample rate"); + return false; + } + state->input_sample_rate = sampleRate; + INFO_LOG(AUDIO, "AndroidAudio_Recording_SetSampleRate"); + return true; +} + +bool AndroidAudio_Recording_Start(AndroidAudioState *state) { if (!state) { ERROR_LOG(AUDIO, "AndroidAudioState not initialized, cannot start recording!"); return false; } + state->input_enable = 1; if (!state->ctx) { ERROR_LOG(AUDIO, "OpenSLContext not initialized, cannot start recording!"); return false; } - state->input_enable = 1; - state->input_sample_rate = sampleRate; - state->ctx->AudioRecord_Start(sampleRate); + state->ctx->AudioRecord_Start(state->input_sample_rate); INFO_LOG(AUDIO, "AndroidAudio_Recording_Start"); return true; } diff --git a/android/jni/AndroidAudio.h b/android/jni/AndroidAudio.h index ad6923d184..f0bf081888 100644 --- a/android/jni/AndroidAudio.h +++ b/android/jni/AndroidAudio.h @@ -23,7 +23,8 @@ struct AndroidAudioState; // It's okay for optimalFramesPerBuffer and optimalSampleRate to be 0. Defaults will be used. AndroidAudioState *AndroidAudio_Init(AndroidAudioCallback cb, int optimalFramesPerBuffer, int optimalSampleRate); -bool AndroidAudio_Recording_Start(AndroidAudioState *state, int sampleRate); +bool AndroidAudio_Recording_SetSampleRate(AndroidAudioState *state, int sampleRate); +bool AndroidAudio_Recording_Start(AndroidAudioState *state); bool AndroidAudio_Recording_Stop(AndroidAudioState *state); bool AndroidAudio_Pause(AndroidAudioState *state); bool AndroidAudio_Resume(AndroidAudioState *state); diff --git a/android/jni/app-android.cpp b/android/jni/app-android.cpp index 48a36036ed..b50f1114fe 100644 --- a/android/jni/app-android.cpp +++ b/android/jni/app-android.cpp @@ -678,8 +678,12 @@ extern "C" void Java_org_ppsspp_ppsspp_NativeApp_audioShutdown(JNIEnv *, jclass) } } -extern "C" void Java_org_ppsspp_ppsspp_NativeApp_audioRecording_1Start(JNIEnv *, jclass, jint sampleRate) { - AndroidAudio_Recording_Start(g_audioState, sampleRate); +extern "C" void Java_org_ppsspp_ppsspp_NativeApp_audioRecording_1SetSampleRate(JNIEnv *, jclass, jint sampleRate) { + AndroidAudio_Recording_SetSampleRate(g_audioState, sampleRate); +} + +extern "C" void Java_org_ppsspp_ppsspp_NativeApp_audioRecording_1Start(JNIEnv *, jclass) { + AndroidAudio_Recording_Start(g_audioState); } extern "C" void Java_org_ppsspp_ppsspp_NativeApp_audioRecording_1Stop(JNIEnv *, jclass) { diff --git a/android/src/org/ppsspp/ppsspp/NativeActivity.java b/android/src/org/ppsspp/ppsspp/NativeActivity.java index 2f61560417..54ae0f04aa 100644 --- a/android/src/org/ppsspp/ppsspp/NativeActivity.java +++ b/android/src/org/ppsspp/ppsspp/NativeActivity.java @@ -228,6 +228,11 @@ public abstract class NativeActivity extends Activity { mCameraHelper.startCamera(); } break; + case REQUEST_CODE_MICROPHONE_PERMISSION: + if (permissionsGranted(permissions, grantResults)) { + NativeApp.audioRecording_Start(); + } + break; default: } } @@ -1295,9 +1300,10 @@ public abstract class NativeActivity extends Activity { } } else if (command.equals("microphone_command")) { if (params.startsWith("startRecording:")) { + int sampleRate = Integer.parseInt(params.replace("startRecording:", "")); + NativeApp.audioRecording_SetSampleRate(sampleRate); if (!askForPermissions(permissionsForMicrophone, REQUEST_CODE_MICROPHONE_PERMISSION)) { - int sampleRate = Integer.valueOf(params.replace("startRecording:", "")); - NativeApp.audioRecording_Start(sampleRate); + NativeApp.audioRecording_Start(); } } else if (params.equals("stopRecording")) { NativeApp.audioRecording_Stop(); diff --git a/android/src/org/ppsspp/ppsspp/NativeApp.java b/android/src/org/ppsspp/ppsspp/NativeApp.java index 53a0f36909..632c625bed 100644 --- a/android/src/org/ppsspp/ppsspp/NativeApp.java +++ b/android/src/org/ppsspp/ppsspp/NativeApp.java @@ -17,7 +17,8 @@ public class NativeApp { public static native void audioShutdown(); public static native void audioConfig(int optimalFramesPerBuffer, int optimalSampleRate); - public static native void audioRecording_Start(int sampleRate); + public static native void audioRecording_SetSampleRate(int sampleRate); + public static native void audioRecording_Start(); public static native void audioRecording_Stop(); public static native void computeDesiredBackbufferDimensions(); From 6531c7f4f8019fd363c33843e68fbe5709c1f2e2 Mon Sep 17 00:00:00 2001 From: Florin9doi Date: Sat, 24 Oct 2020 13:36:24 +0300 Subject: [PATCH 089/275] [Android] Retrieve isMicStarted from AndroidAudio state --- Common/System/System.h | 2 ++ Core/HLE/sceUsbCam.cpp | 6 +++--- Core/HLE/sceUsbMic.cpp | 4 ++-- android/jni/AndroidAudio.cpp | 9 ++++++++- android/jni/AndroidAudio.h | 1 + android/jni/app-android.cpp | 8 ++++++++ libretro/libretro.cpp | 2 ++ 7 files changed, 26 insertions(+), 6 deletions(-) diff --git a/Common/System/System.h b/Common/System/System.h index 2d87f7399d..a95736f4fc 100644 --- a/Common/System/System.h +++ b/Common/System/System.h @@ -99,3 +99,5 @@ float System_GetPropertyFloat(SystemProperty prop); bool System_GetPropertyBool(SystemProperty prop); std::vector __cameraGetDeviceList(); +bool audioRecording_Available(); +bool audioRecording_State(); diff --git a/Core/HLE/sceUsbCam.cpp b/Core/HLE/sceUsbCam.cpp index 37089b9c42..c6dccd6796 100644 --- a/Core/HLE/sceUsbCam.cpp +++ b/Core/HLE/sceUsbCam.cpp @@ -306,7 +306,7 @@ void Register_sceUsbCam() } std::vector Camera::getDeviceList() { - #ifdef HAVE_WIN32_CAMERA + #ifdef HAVE_WIN32_CAMERA if (winCamera) { return winCamera->getDeviceList(); } @@ -326,7 +326,7 @@ int Camera::startCapture() { INFO_LOG(HLE, "%s resolution: %dx%d", __FUNCTION__, width, height); config->mode = Camera::Mode::Video; - #ifdef HAVE_WIN32_CAMERA + #ifdef HAVE_WIN32_CAMERA if (winCamera) { if (winCamera->isShutDown()) { delete winCamera; @@ -350,7 +350,7 @@ int Camera::startCapture() { int Camera::stopCapture() { INFO_LOG(HLE, "%s", __FUNCTION__); - #ifdef HAVE_WIN32_CAMERA + #ifdef HAVE_WIN32_CAMERA if (winCamera) { winCamera->sendMessage({ CAPTUREDEVIDE_COMMAND::STOP, nullptr }); } diff --git a/Core/HLE/sceUsbMic.cpp b/Core/HLE/sceUsbMic.cpp index c04d0c1f41..6c11e31eae 100644 --- a/Core/HLE/sceUsbMic.cpp +++ b/Core/HLE/sceUsbMic.cpp @@ -329,7 +329,7 @@ bool Microphone::isHaveDevice() { #ifdef HAVE_WIN32_MICROPHONE return winMic->getDeviceCounts() >= 1; #elif PPSSPP_PLATFORM(ANDROID) - return true; + return audioRecording_Available(); #endif return false; } @@ -339,7 +339,7 @@ bool Microphone::isMicStarted() { if(winMic) return winMic->isStarted(); #elif PPSSPP_PLATFORM(ANDROID) - return micState; + return audioRecording_State(); #endif return false; } diff --git a/android/jni/AndroidAudio.cpp b/android/jni/AndroidAudio.cpp index ec29e0eb26..33297fd734 100644 --- a/android/jni/AndroidAudio.cpp +++ b/android/jni/AndroidAudio.cpp @@ -40,7 +40,7 @@ bool AndroidAudio_Recording_SetSampleRate(AndroidAudioState *state, int sampleRa return false; } state->input_sample_rate = sampleRate; - INFO_LOG(AUDIO, "AndroidAudio_Recording_SetSampleRate"); + INFO_LOG(AUDIO, "AndroidAudio_Recording_SetSampleRate=%d", sampleRate); return true; } @@ -75,6 +75,13 @@ bool AndroidAudio_Recording_Stop(AndroidAudioState *state) { return true; } +bool AndroidAudio_Recording_State(AndroidAudioState *state) { + if (!state) { + return false; + } + return state->input_enable; +} + bool AndroidAudio_Resume(AndroidAudioState *state) { if (!state) { ERROR_LOG(AUDIO, "Audio was shutdown, cannot resume!"); diff --git a/android/jni/AndroidAudio.h b/android/jni/AndroidAudio.h index f0bf081888..3a8fe5e33c 100644 --- a/android/jni/AndroidAudio.h +++ b/android/jni/AndroidAudio.h @@ -26,6 +26,7 @@ AndroidAudioState *AndroidAudio_Init(AndroidAudioCallback cb, int optimalFramesP bool AndroidAudio_Recording_SetSampleRate(AndroidAudioState *state, int sampleRate); bool AndroidAudio_Recording_Start(AndroidAudioState *state); bool AndroidAudio_Recording_Stop(AndroidAudioState *state); +bool AndroidAudio_Recording_State(AndroidAudioState *state); bool AndroidAudio_Pause(AndroidAudioState *state); bool AndroidAudio_Resume(AndroidAudioState *state); bool AndroidAudio_Shutdown(AndroidAudioState *state); diff --git a/android/jni/app-android.cpp b/android/jni/app-android.cpp index b50f1114fe..e36e15ab92 100644 --- a/android/jni/app-android.cpp +++ b/android/jni/app-android.cpp @@ -690,6 +690,14 @@ extern "C" void Java_org_ppsspp_ppsspp_NativeApp_audioRecording_1Stop(JNIEnv *, AndroidAudio_Recording_Stop(g_audioState); } +bool audioRecording_Available() { + return true; +} + +bool audioRecording_State() { + return AndroidAudio_Recording_State(g_audioState); +} + extern "C" void Java_org_ppsspp_ppsspp_NativeApp_resume(JNIEnv *, jclass) { INFO_LOG(SYSTEM, "NativeApp.resume() - resuming audio"); AndroidAudio_Resume(g_audioState); diff --git a/libretro/libretro.cpp b/libretro/libretro.cpp index c7386f9aa2..eaf7a4e83f 100644 --- a/libretro/libretro.cpp +++ b/libretro/libretro.cpp @@ -909,6 +909,8 @@ void NativeResized() {} #if PPSSPP_PLATFORM(ANDROID) || PPSSPP_PLATFORM(IOS) std::vector __cameraGetDeviceList() { return std::vector(); } +bool audioRecording_Available() { return false; } +bool audioRecording_State() { return false; } void System_InputBoxGetString(const std::string &title, const std::string &defaultValue, std::function cb) { cb(false, ""); } #endif From 22b26ffc09d290c3fe6a6ae15424293691bbbf2a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Fri, 23 Oct 2020 00:44:35 +0200 Subject: [PATCH 090/275] Time for the vertex shaders. Set up a test, start eliminating differences. --- GPU/Common/ShaderCommon.h | 15 + GPU/GLES/ShaderManagerGLES.cpp | 2 +- GPU/GLES/VertexShaderGeneratorGLES.cpp | 429 +++++++++++++-------- GPU/Vulkan/PipelineManagerVulkan.h | 14 +- GPU/Vulkan/ShaderManagerVulkan.cpp | 5 +- GPU/Vulkan/VertexShaderGeneratorVulkan.cpp | 1 + unittest/TestShaderGenerators.cpp | 105 +++-- 7 files changed, 349 insertions(+), 222 deletions(-) diff --git a/GPU/Common/ShaderCommon.h b/GPU/Common/ShaderCommon.h index b7eb56e93c..acc0de74f5 100644 --- a/GPU/Common/ShaderCommon.h +++ b/GPU/Common/ShaderCommon.h @@ -31,6 +31,8 @@ enum ShaderLanguage { HLSL_DX9, HLSL_D3D11, HLSL_D3D11_LEVEL9, + + TEST_GLSL_VULKAN, }; enum DebugShaderType { @@ -157,3 +159,16 @@ struct GLSLShaderCompat { void SetupForVulkan(); }; + +// PSP vertex format. +enum class PspAttributeLocation { + POSITION = 0, + TEXCOORD = 1, + NORMAL = 2, + W1 = 3, + W2 = 4, + COLOR0 = 5, + COLOR1 = 6, + + COUNT +}; diff --git a/GPU/GLES/ShaderManagerGLES.cpp b/GPU/GLES/ShaderManagerGLES.cpp index ccae98787a..4b903f9191 100644 --- a/GPU/GLES/ShaderManagerGLES.cpp +++ b/GPU/GLES/ShaderManagerGLES.cpp @@ -264,7 +264,7 @@ static void SetFloatUniform4(GLRenderManager *render, GLint *uniform, float data static void SetMatrix4x3(GLRenderManager *render, GLint *uniform, const float *m4x3) { float m4x4[16]; - ConvertMatrix4x3To4x4(m4x4, m4x3); + ConvertMatrix4x3To4x4Transposed(m4x4, m4x3); render->SetUniformM4x4(uniform, m4x4); } diff --git a/GPU/GLES/VertexShaderGeneratorGLES.cpp b/GPU/GLES/VertexShaderGeneratorGLES.cpp index b2fde269c8..2582853992 100644 --- a/GPU/GLES/VertexShaderGeneratorGLES.cpp +++ b/GPU/GLES/VertexShaderGeneratorGLES.cpp @@ -20,15 +20,15 @@ #include #include "Common/GPU/OpenGL/GLFeatures.h" - #include "Common/StringUtils.h" +#include "Core/Config.h" #include "GPU/ge_constants.h" #include "GPU/GPUState.h" -#include "Core/Config.h" +#include "GPU/Common/ShaderId.h" +#include "GPU/Common/ShaderUniforms.h" +#include "GPU/Common/VertexDecoderCommon.h" #include "GPU/GLES/VertexShaderGeneratorGLES.h" #include "GPU/GLES/ShaderManagerGLES.h" -#include "GPU/Common/ShaderId.h" -#include "GPU/Common/VertexDecoderCommon.h" #undef WRITE @@ -87,31 +87,52 @@ static const char * const boneWeightInDecl[9] = { // TODO: Skip all this if we can actually get a 16-bit depth buffer along with stencil, which // is a bit of a rare configuration, although quite common on mobile. +static const char * const boneWeightDecl[9] = { + "#ERROR#", + "layout(location = 3) in float w1;\n", + "layout(location = 3) in vec2 w1;\n", + "layout(location = 3) in vec3 w1;\n", + "layout(location = 3) in vec4 w1;\n", + "layout(location = 3) in vec4 w1;\nlayout(location = 4) in float w2;\n", + "layout(location = 3) in vec4 w1;\nlayout(location = 4) in vec2 w2;\n", + "layout(location = 3) in vec4 w1;\nlayout(location = 4) in vec3 w2;\n", + "layout(location = 3) in vec4 w1;\nlayout(location = 4) in vec4 w2;\n", +}; + +static const char *vulkan_glsl_preamble = +"#version 450\n" +"#extension GL_ARB_separate_shader_objects : enable\n" +"#extension GL_ARB_shading_language_420pack : enable\n" +"#define splat3(x) vec3(x)\n\n"; + bool GenerateVertexShaderGLSL(const VShaderID &id, char *buffer, const GLSLShaderCompat &compat, uint32_t *attrMask, uint64_t *uniformMask, std::string *errorString) { *attrMask = 0; *uniformMask = 0; - char *p = buffer; - WRITE(p, "#version %d%s\n", compat.glslVersionNumber, compat.gles ? " es" : ""); - bool highpFog = false; bool highpTexcoord = false; - if (compat.gles) { - // PowerVR needs highp to do the fog in MHU correctly. - // Others don't, and some can't handle highp in the fragment shader. - highpFog = (gl_extensions.bugs & BUG_PVR_SHADER_PRECISION_BAD) ? true : false; - highpTexcoord = highpFog; + + char *p = buffer; + if (compat.vulkan) { + WRITE(p, "%s", vulkan_glsl_preamble); + } else { + if (compat.gles) { + // PowerVR needs highp to do the fog in MHU correctly. + // Others don't, and some can't handle highp in the fragment shader. + highpFog = (gl_extensions.bugs & BUG_PVR_SHADER_PRECISION_BAD) ? true : false; + highpTexcoord = highpFog; + } + WRITE(p, "#version %d%s\n", compat.glslVersionNumber, compat.gles ? " es" : ""); + WRITE(p, "#define splat3(x) vec3(x)\n"); } - if (gl_extensions.EXT_gpu_shader4) { + if (!compat.vulkan && gl_extensions.EXT_gpu_shader4) { WRITE(p, "#extension GL_EXT_gpu_shader4 : enable\n"); } - WRITE(p, "#define splat3(x) vec3(x)\n"); - if (compat.gles) { WRITE(p, "precision highp float;\n"); - } else { + } else if (!compat.vulkan) { WRITE(p, "#define lowp\n"); WRITE(p, "#define mediump\n"); WRITE(p, "#define highp\n"); @@ -120,7 +141,7 @@ bool GenerateVertexShaderGLSL(const VShaderID &id, char *buffer, const GLSLShade bool isModeThrough = id.Bit(VS_BIT_IS_THROUGH); bool lmode = id.Bit(VS_BIT_LMODE); bool doTexture = id.Bit(VS_BIT_DO_TEXTURE); - bool doTextureProjection = id.Bit(VS_BIT_DO_TEXTURE_TRANSFORM); + bool doTextureTransform = id.Bit(VS_BIT_DO_TEXTURE_TRANSFORM); GETexMapMode uvGenMode = static_cast(id.Bits(VS_BIT_UVGEN_MODE, 2)); @@ -148,8 +169,17 @@ bool GenerateVertexShaderGLSL(const VShaderID &id, char *buffer, const GLSLShade bool hasNormalTess = id.Bit(VS_BIT_HAS_NORMAL_TESS); bool flipNormalTess = id.Bit(VS_BIT_NORM_REVERSE_TESS); + if (compat.vulkan) { + WRITE(p, "\n"); + WRITE(p, "layout (std140, set = 0, binding = 3) uniform baseVars {\n%s};\n", ub_baseStr); + if (enableLighting || doShadeMapping) + WRITE(p, "layout (std140, set = 0, binding = 4) uniform lightVars {\n%s};\n", ub_vs_lightsStr); + if (enableBones) + WRITE(p, "layout (std140, set = 0, binding = 5) uniform boneVars {\n%s};\n", ub_vs_bonesStr); + } + const char *shading = ""; - if (compat.glslES30) + if (compat.glslES30 || compat.vulkan) shading = doFlatShading ? "flat " : ""; DoLightComputation doLight[4] = { LIGHT_OFF, LIGHT_OFF, LIGHT_OFF, LIGHT_OFF }; @@ -166,157 +196,204 @@ bool GenerateVertexShaderGLSL(const VShaderID &id, char *buffer, const GLSLShade int numBoneWeights = 0; int boneWeightScale = id.Bits(VS_BIT_WEIGHT_FMTSCALE, 2); - if (enableBones) { - numBoneWeights = 1 + id.Bits(VS_BIT_BONES, 3); - const char * const * boneWeightDecl = boneWeightAttrDecl; - if (!strcmp(compat.attribute, "in")) { - boneWeightDecl = boneWeightInDecl; - } - WRITE(p, "%s", boneWeightDecl[numBoneWeights]); - *attrMask |= 1 << ATTR_W1; - if (numBoneWeights >= 5) - *attrMask |= 1 << ATTR_W2; - } - - if (useHWTransform) - WRITE(p, "%s vec3 position;\n", compat.attribute); - else - WRITE(p, "%s vec4 position;\n", compat.attribute); // need to pass the fog coord in w - *attrMask |= 1 << ATTR_POSITION; - - if (useHWTransform && hasNormal) { - WRITE(p, "%s mediump vec3 normal;\n", compat.attribute); - *attrMask |= 1 << ATTR_NORMAL; - } - bool texcoordVec3In = false; - if (doTexture && hasTexcoord) { - if (!useHWTransform && doTextureProjection && !isModeThrough) { - WRITE(p, "%s vec3 texcoord;\n", compat.attribute); - texcoordVec3In = true; - } else { - WRITE(p, "%s vec2 texcoord;\n", compat.attribute); - } - *attrMask |= 1 << ATTR_TEXCOORD; - } - if (hasColor) { - WRITE(p, "%s lowp vec4 color0;\n", compat.attribute); - *attrMask |= 1 << ATTR_COLOR0; - if (lmode && !useHWTransform) { // only software transform supplies color1 as vertex data - WRITE(p, "%s lowp vec3 color1;\n", compat.attribute); - *attrMask |= 1 << ATTR_COLOR1; - } - } + bool scaleUV = false; - if (isModeThrough) { - WRITE(p, "uniform mat4 u_proj_through;\n"); - *uniformMask |= DIRTY_PROJTHROUGHMATRIX; - } else { - WRITE(p, "uniform mat4 u_proj;\n"); - *uniformMask |= DIRTY_PROJMATRIX; - // Add all the uniforms we'll need to transform properly. - } - - bool scaleUV = !isModeThrough && (uvGenMode == GE_TEXMAP_TEXTURE_COORDS || uvGenMode == GE_TEXMAP_UNKNOWN); - - if (useHWTransform) { - // When transforming by hardware, we need a great deal more uniforms... - WRITE(p, "uniform mat4 u_world;\n"); - WRITE(p, "uniform mat4 u_view;\n"); - *uniformMask |= DIRTY_WORLDMATRIX | DIRTY_VIEWMATRIX; - if (doTextureProjection) { - WRITE(p, "uniform mediump mat4 u_texmtx;\n"); - *uniformMask |= DIRTY_TEXMATRIX; - } + if (compat.vulkan) { if (enableBones) { -#ifdef USE_BONE_ARRAY - WRITE(p, "uniform mediump mat4 u_bone[%i];\n", numBoneWeights); - *uniformMask |= DIRTY_BONE_UNIFORMS; -#else - for (int i = 0; i < numBoneWeights; i++) { - WRITE(p, "uniform mat4 u_bone%i;\n", i); - *uniformMask |= DIRTY_BONEMATRIX0 << i; - } -#endif + numBoneWeights = 1 + id.Bits(VS_BIT_BONES, 3); + WRITE(p, "%s", boneWeightDecl[numBoneWeights]); } + + if (useHWTransform) + WRITE(p, "layout (location = %d) in vec3 position;\n", (int)PspAttributeLocation::POSITION); + else + // we pass the fog coord in w + WRITE(p, "layout (location = %d) in vec4 position;\n", (int)PspAttributeLocation::POSITION); + + if (useHWTransform && hasNormal) + WRITE(p, "layout (location = %d) in vec3 normal;\n", (int)PspAttributeLocation::NORMAL); + + bool texcoordInVec3 = false; + if (doTexture && hasTexcoord) { + if (!useHWTransform && doTextureTransform && !isModeThrough) { + WRITE(p, "layout (location = %d) in vec3 texcoord;\n", (int)PspAttributeLocation::TEXCOORD); + texcoordInVec3 = true; + } else + WRITE(p, "layout (location = %d) in vec2 texcoord;\n", (int)PspAttributeLocation::TEXCOORD); + } + if (hasColor) { + WRITE(p, "layout (location = %d) in vec4 color0;\n", (int)PspAttributeLocation::COLOR0); + if (lmode && !useHWTransform) // only software transform supplies color1 as vertex data + WRITE(p, "layout (location = %d) in vec3 color1;\n", (int)PspAttributeLocation::COLOR1); + } + + WRITE(p, "layout (location = 1) %sout vec4 v_color0;\n", shading); + if (lmode) { + WRITE(p, "layout (location = 2) %sout vec3 v_color1;\n", shading); + } + if (doTexture) { - WRITE(p, "uniform vec4 u_uvscaleoffset;\n"); - *uniformMask |= DIRTY_UVSCALEOFFSET; + WRITE(p, "layout (location = 0) out vec3 v_texcoord;\n"); } - for (int i = 0; i < 4; i++) { - if (doLight[i] != LIGHT_OFF) { - // This is needed for shade mapping - WRITE(p, "uniform vec3 u_lightpos%i;\n", i); - *uniformMask |= DIRTY_LIGHT0 << i; + + if (enableFog) { + // See the fragment shader generator + WRITE(p, "layout (location = 3) out float v_fogdepth;\n"); + } + } else { + if (enableBones) { + numBoneWeights = 1 + id.Bits(VS_BIT_BONES, 3); + const char * const * boneWeightDecl = boneWeightAttrDecl; + if (!strcmp(compat.attribute, "in")) { + boneWeightDecl = boneWeightInDecl; } - if (doLight[i] == LIGHT_FULL) { - *uniformMask |= DIRTY_LIGHT0 << i; - GELightType type = static_cast(id.Bits(VS_BIT_LIGHT0_TYPE + 4 * i, 2)); - GELightComputation comp = static_cast(id.Bits(VS_BIT_LIGHT0_COMP + 4 * i, 2)); + WRITE(p, "%s", boneWeightDecl[numBoneWeights]); + *attrMask |= 1 << ATTR_W1; + if (numBoneWeights >= 5) + *attrMask |= 1 << ATTR_W2; + } - if (type != GE_LIGHTTYPE_DIRECTIONAL) - WRITE(p, "uniform mediump vec3 u_lightatt%i;\n", i); + if (useHWTransform) + WRITE(p, "%s vec3 position;\n", compat.attribute); + else + WRITE(p, "%s vec4 position;\n", compat.attribute); // need to pass the fog coord in w + *attrMask |= 1 << ATTR_POSITION; - if (type == GE_LIGHTTYPE_SPOT || type == GE_LIGHTTYPE_UNKNOWN) { - WRITE(p, "uniform mediump vec3 u_lightdir%i;\n", i); - WRITE(p, "uniform mediump vec2 u_lightangle_spotCoef%i;\n", i); - } - WRITE(p, "uniform lowp vec3 u_lightambient%i;\n", i); - WRITE(p, "uniform lowp vec3 u_lightdiffuse%i;\n", i); + if (useHWTransform && hasNormal) { + WRITE(p, "%s mediump vec3 normal;\n", compat.attribute); + *attrMask |= 1 << ATTR_NORMAL; + } - if (comp == GE_LIGHTCOMP_BOTH) { - WRITE(p, "uniform lowp vec3 u_lightspecular%i;\n", i); - } + if (doTexture && hasTexcoord) { + if (!useHWTransform && doTextureTransform && !isModeThrough) { + WRITE(p, "%s vec3 texcoord;\n", compat.attribute); + texcoordVec3In = true; + } else { + WRITE(p, "%s vec2 texcoord;\n", compat.attribute); + } + *attrMask |= 1 << ATTR_TEXCOORD; + } + if (hasColor) { + WRITE(p, "%s lowp vec4 color0;\n", compat.attribute); + *attrMask |= 1 << ATTR_COLOR0; + if (lmode && !useHWTransform) { // only software transform supplies color1 as vertex data + WRITE(p, "%s lowp vec3 color1;\n", compat.attribute); + *attrMask |= 1 << ATTR_COLOR1; } } - if (enableLighting) { - WRITE(p, "uniform lowp vec4 u_ambient;\n"); - *uniformMask |= DIRTY_AMBIENT; - if ((matUpdate & 2) == 0 || !hasColor) { - WRITE(p, "uniform lowp vec3 u_matdiffuse;\n"); - *uniformMask |= DIRTY_MATDIFFUSE; - } - WRITE(p, "uniform lowp vec4 u_matspecular;\n"); // Specular coef is contained in alpha - WRITE(p, "uniform lowp vec3 u_matemissive;\n"); - *uniformMask |= DIRTY_MATSPECULAR | DIRTY_MATEMISSIVE; - } - } - if (useHWTransform || !hasColor) { - WRITE(p, "uniform lowp vec4 u_matambientalpha;\n"); // matambient + matalpha - *uniformMask |= DIRTY_MATAMBIENTALPHA; - } - if (enableFog) { - WRITE(p, "uniform highp vec2 u_fogcoef;\n"); - *uniformMask |= DIRTY_FOGCOEF; - } - - if (!isModeThrough && gstate_c.Supports(GPU_ROUND_DEPTH_TO_16BIT)) { - WRITE(p, "uniform highp vec4 u_depthRange;\n"); - *uniformMask |= DIRTY_DEPTHRANGE; - } - - if (!isModeThrough) { - WRITE(p, "uniform highp vec4 u_cullRangeMin;\n"); - WRITE(p, "uniform highp vec4 u_cullRangeMax;\n"); - *uniformMask |= DIRTY_CULLRANGE; - } - - WRITE(p, "%s%s lowp vec4 v_color0;\n", shading, compat.varying_vs); - if (lmode) { - WRITE(p, "%s%s lowp vec3 v_color1;\n", shading, compat.varying_vs); - } - - if (doTexture) { - WRITE(p, "%s %s vec3 v_texcoord;\n", compat.varying_vs, highpTexcoord ? "highp" : "mediump"); - } - - if (enableFog) { - // See the fragment shader generator - if (highpFog) { - WRITE(p, "%s highp float v_fogdepth;\n", compat.varying_vs); + if (isModeThrough) { + WRITE(p, "uniform mat4 u_proj_through;\n"); + *uniformMask |= DIRTY_PROJTHROUGHMATRIX; } else { - WRITE(p, "%s mediump float v_fogdepth;\n", compat.varying_vs); + WRITE(p, "uniform mat4 u_proj;\n"); + *uniformMask |= DIRTY_PROJMATRIX; + // Add all the uniforms we'll need to transform properly. + } + + scaleUV = !isModeThrough && (uvGenMode == GE_TEXMAP_TEXTURE_COORDS || uvGenMode == GE_TEXMAP_UNKNOWN); + + if (useHWTransform) { + // When transforming by hardware, we need a great deal more uniforms... + // TODO: Use 4x3 matrices where possible. Though probably doesn't matter much. + WRITE(p, "uniform mat4 u_world;\n"); + WRITE(p, "uniform mat4 u_view;\n"); + *uniformMask |= DIRTY_WORLDMATRIX | DIRTY_VIEWMATRIX; + if (doTextureTransform) { + WRITE(p, "uniform mediump mat4 u_texmtx;\n"); + *uniformMask |= DIRTY_TEXMATRIX; + } + if (enableBones) { +#ifdef USE_BONE_ARRAY + WRITE(p, "uniform mediump mat4 u_bone[%i];\n", numBoneWeights); + *uniformMask |= DIRTY_BONE_UNIFORMS; +#else + for (int i = 0; i < numBoneWeights; i++) { + WRITE(p, "uniform mat4 u_bone%i;\n", i); + *uniformMask |= DIRTY_BONEMATRIX0 << i; + } +#endif + } + if (doTexture) { + WRITE(p, "uniform vec4 u_uvscaleoffset;\n"); + *uniformMask |= DIRTY_UVSCALEOFFSET; + } + for (int i = 0; i < 4; i++) { + if (doLight[i] != LIGHT_OFF) { + // This is needed for shade mapping + WRITE(p, "uniform vec3 u_lightpos%i;\n", i); + *uniformMask |= DIRTY_LIGHT0 << i; + } + if (doLight[i] == LIGHT_FULL) { + *uniformMask |= DIRTY_LIGHT0 << i; + GELightType type = static_cast(id.Bits(VS_BIT_LIGHT0_TYPE + 4 * i, 2)); + GELightComputation comp = static_cast(id.Bits(VS_BIT_LIGHT0_COMP + 4 * i, 2)); + + if (type != GE_LIGHTTYPE_DIRECTIONAL) + WRITE(p, "uniform mediump vec3 u_lightatt%i;\n", i); + + if (type == GE_LIGHTTYPE_SPOT || type == GE_LIGHTTYPE_UNKNOWN) { + WRITE(p, "uniform mediump vec3 u_lightdir%i;\n", i); + WRITE(p, "uniform mediump vec2 u_lightangle_spotCoef%i;\n", i); + } + WRITE(p, "uniform lowp vec3 u_lightambient%i;\n", i); + WRITE(p, "uniform lowp vec3 u_lightdiffuse%i;\n", i); + + if (comp == GE_LIGHTCOMP_BOTH) { + WRITE(p, "uniform lowp vec3 u_lightspecular%i;\n", i); + } + } + } + if (enableLighting) { + WRITE(p, "uniform lowp vec4 u_ambient;\n"); + *uniformMask |= DIRTY_AMBIENT; + if ((matUpdate & 2) == 0 || !hasColor) { + WRITE(p, "uniform lowp vec3 u_matdiffuse;\n"); + *uniformMask |= DIRTY_MATDIFFUSE; + } + WRITE(p, "uniform lowp vec4 u_matspecular;\n"); // Specular coef is contained in alpha + WRITE(p, "uniform lowp vec3 u_matemissive;\n"); + *uniformMask |= DIRTY_MATSPECULAR | DIRTY_MATEMISSIVE; + } + } + + if (useHWTransform || !hasColor) { + WRITE(p, "uniform lowp vec4 u_matambientalpha;\n"); // matambient + matalpha + *uniformMask |= DIRTY_MATAMBIENTALPHA; + } + if (enableFog) { + WRITE(p, "uniform highp vec2 u_fogcoef;\n"); + *uniformMask |= DIRTY_FOGCOEF; + } + + if (!isModeThrough && gstate_c.Supports(GPU_ROUND_DEPTH_TO_16BIT)) { + WRITE(p, "uniform highp vec4 u_depthRange;\n"); + *uniformMask |= DIRTY_DEPTHRANGE; + } + + if (!isModeThrough) { + WRITE(p, "uniform highp vec4 u_cullRangeMin;\n"); + WRITE(p, "uniform highp vec4 u_cullRangeMax;\n"); + *uniformMask |= DIRTY_CULLRANGE; + } + + WRITE(p, "%s%s lowp vec4 v_color0;\n", shading, compat.varying_vs); + if (lmode) { + WRITE(p, "%s%s lowp vec3 v_color1;\n", shading, compat.varying_vs); + } + + if (doTexture) { + WRITE(p, "%s %s vec3 v_texcoord;\n", compat.varying_vs, highpTexcoord ? "highp" : "mediump"); + } + + if (enableFog) { + // See the fragment shader generator + if (highpFog) { + WRITE(p, "%s highp float v_fogdepth;\n", compat.varying_vs); + } else { + WRITE(p, "%s mediump float v_fogdepth;\n", compat.varying_vs); + } } } @@ -336,11 +413,33 @@ bool GenerateVertexShaderGLSL(const VShaderID &id, char *buffer, const GLSLShade if (doBezier || doSpline) { *uniformMask |= DIRTY_BEZIERSPLINE; - WRITE(p, "uniform sampler2D u_tess_points;\n"); // Control Points - WRITE(p, "uniform sampler2D u_tess_weights_u;\n"); - WRITE(p, "uniform sampler2D u_tess_weights_v;\n"); + if (compat.vulkan) { + WRITE(p, "struct TessData {\n"); + WRITE(p, " vec4 pos;\n"); + WRITE(p, " vec4 uv;\n"); + WRITE(p, " vec4 color;\n"); + WRITE(p, "};\n"); + WRITE(p, "layout (std430, set = 0, binding = 6) readonly buffer s_tess_data {\n"); + WRITE(p, " TessData data[];\n"); + WRITE(p, "} tess_data;\n"); - WRITE(p, "uniform int u_spline_counts;\n"); + WRITE(p, "layout (std430) struct TessWeight {\n"); + WRITE(p, " vec4 basis;\n"); + WRITE(p, " vec4 deriv;\n"); + WRITE(p, "};\n"); + WRITE(p, "layout (std430, set = 0, binding = 7) readonly buffer s_tess_weights_u {\n"); + WRITE(p, " TessWeight data[];\n"); + WRITE(p, "} tess_weights_u;\n"); + WRITE(p, "layout (std430, set = 0, binding = 8) readonly buffer s_tess_weights_v {\n"); + WRITE(p, " TessWeight data[];\n"); + WRITE(p, "} tess_weights_v;\n"); + } else { + WRITE(p, "uniform sampler2D u_tess_points;\n"); // Control Points + WRITE(p, "uniform sampler2D u_tess_weights_u;\n"); + WRITE(p, "uniform sampler2D u_tess_weights_v;\n"); + + WRITE(p, "uniform int u_spline_counts;\n"); + } for (int i = 2; i <= 4; i++) { // Define 3 types vec2, vec3, vec4 @@ -461,17 +560,17 @@ bool GenerateVertexShaderGLSL(const VShaderID &id, char *buffer, const GLSLShade WRITE(p, " Tess tess;\n"); WRITE(p, " tessellate(tess);\n"); - WRITE(p, " vec3 worldpos = (u_world * vec4(tess.pos.xyz, 1.0)).xyz;\n"); + WRITE(p, " vec3 worldpos = (vec4(tess.pos.xyz, 1.0) * u_world).xyz;\n"); if (hasNormalTess) { - WRITE(p, " mediump vec3 worldnormal = normalize((u_world * vec4(%stess.nrm, 0.0)).xyz);\n", flipNormalTess ? "-" : ""); + WRITE(p, " mediump vec3 worldnormal = normalize((vec4(%stess.nrm, 0.0) * u_world).xyz);\n", flipNormalTess ? "-" : ""); } else { WRITE(p, " mediump vec3 worldnormal = vec3(0.0, 0.0, 1.0);\n"); } } else { // No skinning, just standard T&L. - WRITE(p, " vec3 worldpos = (u_world * vec4(position.xyz, 1.0)).xyz;\n"); + WRITE(p, " vec3 worldpos = (vec4(position.xyz, 1.0) * u_world).xyz;\n"); if (hasNormal) - WRITE(p, " mediump vec3 worldnormal = normalize((u_world * vec4(%snormal, 0.0)).xyz);\n", flipNormal ? "-" : ""); + WRITE(p, " mediump vec3 worldnormal = normalize((vec4(%snormal, 0.0) * u_world).xyz);\n", flipNormal ? "-" : ""); else WRITE(p, " mediump vec3 worldnormal = vec3(0.0, 0.0, 1.0);\n"); } @@ -526,7 +625,7 @@ bool GenerateVertexShaderGLSL(const VShaderID &id, char *buffer, const GLSLShade WRITE(p, " mediump vec3 worldnormal = normalize((u_world * vec4(skinnednormal, 0.0)).xyz);\n"); } - WRITE(p, " vec4 viewPos = u_view * vec4(worldpos, 1.0);\n"); + WRITE(p, " vec4 viewPos = vec4(worldpos, 1.0) * u_view;\n"); // Final view and projection transforms. if (gstate_c.Supports(GPU_ROUND_DEPTH_TO_16BIT)) { @@ -742,7 +841,7 @@ bool GenerateVertexShaderGLSL(const VShaderID &id, char *buffer, const GLSLShade break; } // Transform by texture matrix. XYZ as we are doing projection mapping. - WRITE(p, " v_texcoord = (u_texmtx * %s).xyz * vec3(u_uvscaleoffset.xy, 1.0);\n", temp_tc.c_str()); + WRITE(p, " v_texcoord = (%s * u_texmtx).xyz * vec3(u_uvscaleoffset.xy, 1.0);\n", temp_tc.c_str()); } break; diff --git a/GPU/Vulkan/PipelineManagerVulkan.h b/GPU/Vulkan/PipelineManagerVulkan.h index bb747bd29b..8646d5b8bf 100644 --- a/GPU/Vulkan/PipelineManagerVulkan.h +++ b/GPU/Vulkan/PipelineManagerVulkan.h @@ -22,24 +22,12 @@ #include "GPU/Common/VertexDecoderCommon.h" #include "GPU/Common/ShaderId.h" +#include "GPU/Common/ShaderCommon.h" #include "GPU/Vulkan/VulkanUtil.h" #include "GPU/Vulkan/StateMappingVulkan.h" #include "GPU/Vulkan/VulkanQueueRunner.h" -// PSP vertex format. -enum class PspAttributeLocation { - POSITION = 0, - TEXCOORD = 1, - NORMAL = 2, - W1 = 3, - W2 = 4, - COLOR0 = 5, - COLOR1 = 6, - - COUNT -}; - struct VulkanPipelineKey { VulkanPipelineRasterStateKey raster; // prim is included here VkRenderPass renderPass; diff --git a/GPU/Vulkan/ShaderManagerVulkan.cpp b/GPU/Vulkan/ShaderManagerVulkan.cpp index 8d20b9ca58..2624db88e4 100644 --- a/GPU/Vulkan/ShaderManagerVulkan.cpp +++ b/GPU/Vulkan/ShaderManagerVulkan.cpp @@ -387,6 +387,8 @@ bool ShaderManagerVulkan::LoadCache(FILE *f) { if (header.featureFlags != gstate_c.featureFlags) return false; + GLSLShaderCompat compat{}; + compat.SetupForVulkan(); for (int i = 0; i < header.numVertexShaders; i++) { VShaderID id; if (fread(&id, sizeof(id), 1, f) != 1) { @@ -402,8 +404,7 @@ bool ShaderManagerVulkan::LoadCache(FILE *f) { vsCache_.Insert(id, vs); } uint32_t vendorID = vulkan_->GetPhysicalDeviceProperties().properties.vendorID; - GLSLShaderCompat compat{}; - compat.SetupForVulkan(); + for (int i = 0; i < header.numFragmentShaders; i++) { FShaderID id; if (fread(&id, sizeof(id), 1, f) != 1) { diff --git a/GPU/Vulkan/VertexShaderGeneratorVulkan.cpp b/GPU/Vulkan/VertexShaderGeneratorVulkan.cpp index f18ea66729..76a613b35d 100644 --- a/GPU/Vulkan/VertexShaderGeneratorVulkan.cpp +++ b/GPU/Vulkan/VertexShaderGeneratorVulkan.cpp @@ -205,6 +205,7 @@ bool GenerateVertexShaderVulkanGLSL(const VShaderID &id, char *buffer, std::stri WRITE(p, "}\n\n"); } + // Hardware tessellation if (doBezier || doSpline) { WRITE(p, "struct TessData {\n"); WRITE(p, " vec4 pos;\n"); diff --git a/unittest/TestShaderGenerators.cpp b/unittest/TestShaderGenerators.cpp index 2c4ffa936b..88b41f3536 100644 --- a/unittest/TestShaderGenerators.cpp +++ b/unittest/TestShaderGenerators.cpp @@ -41,6 +41,8 @@ bool GenerateFShader(FShaderID id, char *buffer, ShaderLanguage lang, std::strin case ShaderLanguage::GLSL_300: // TODO: Need a device - except that maybe glslang could be used to verify these .... return false; + case ShaderLanguage::TEST_GLSL_VULKAN: + return false; default: return false; } @@ -57,6 +59,14 @@ bool GenerateVShader(VShaderID id, char *buffer, ShaderLanguage lang, std::strin // return DX9::GenerateFragmentShaderHLSL(id, buffer, ShaderLanguage::HLSL_DX9); case ShaderLanguage::GLSL_VULKAN: return GenerateVertexShaderVulkanGLSL(id, buffer, errorString); + case ShaderLanguage::TEST_GLSL_VULKAN: + { + GLSLShaderCompat compat{}; + compat.SetupForVulkan(); + uint32_t attrMask; + uint64_t uniformMask; + return GenerateVertexShaderGLSL(id, buffer, compat, &attrMask, &uniformMask, errorString); + } default: return false; } @@ -124,6 +134,7 @@ bool TestShaderGenerators() { LoadD3DCompilerDynamic(); ShaderLanguage languages[] = { + ShaderLanguage::TEST_GLSL_VULKAN, ShaderLanguage::GLSL_VULKAN, ShaderLanguage::HLSL_D3D11, ShaderLanguage::GLSL_140, @@ -141,6 +152,59 @@ bool TestShaderGenerators() { int successes = 0; int count = 700; + // Generate a bunch of random vertex shader IDs, try to generate shader source. + // Then compile it and check that it's ok. + for (int i = 0; i < count; i++) { + uint32_t bottom = rng.R32(); + uint32_t top = rng.R32(); + VShaderID id; + id.d[0] = bottom; + id.d[1] = top; + + // Skip testing beziers for now. I'll deal with those bugs later. + id.SetBit(VS_BIT_BEZIER, false); + id.SetBit(VS_BIT_SPLINE, false); + + bool generateSuccess[numLanguages]{}; + std::string genErrorString[numLanguages]; + + for (int j = 0; j < numLanguages; j++) { + generateSuccess[j] = GenerateVShader(id, buffer[j], languages[j], &genErrorString[j]); + if (!genErrorString[j].empty()) { + printf("%s\n", genErrorString[j].c_str()); + } + } + + if (generateSuccess[0] != generateSuccess[1]) { + printf("mismatching success! %s %s\n", genErrorString[0].c_str(), genErrorString[1].c_str()); + printf("%s\n", buffer[0]); + printf("%s\n", buffer[1]); + return 1; + } + if (generateSuccess[0] && strcmp(buffer[0], buffer[1])) { + printf("mismatching shaders!\n"); + PrintDiff(buffer[0], buffer[1]); + return 1; + } + + // Now that we have the strings ready for easy comparison (buffer,4 in the watch window), + // let's try to compile them. + for (int j = 0; j < numLanguages; j++) { + if (generateSuccess[j]) { + if (!TestCompileShader(buffer[j], languages[j], true)) { + printf("Error compiling vertex shader:\n\n%s\n\n", LineNumberString(buffer[j]).c_str()); + return false; + } + successes++; + } + } + } + + printf("%d/%d vertex shaders generated (it's normal that it's not all, there are invalid bit combos)\n", successes, count * numLanguages); + + successes = 0; + count = 200; + // Generate a bunch of random fragment shader IDs, try to generate shader source. // Then compile it and check that it's ok. for (int i = 0; i < count; i++) { @@ -194,47 +258,6 @@ bool TestShaderGenerators() { successes = 0; count = 200; - // Generate a bunch of random vertex shader IDs, try to generate shader source. - // Then compile it and check that it's ok. - for (int i = 0; i < count; i++) { - uint32_t bottom = rng.R32(); - uint32_t top = rng.R32(); - VShaderID id; - id.d[0] = bottom; - id.d[1] = top; - - // Skip testing beziers for now. I'll deal with those bugs later. - id.SetBit(VS_BIT_BEZIER, false); - id.SetBit(VS_BIT_SPLINE, false); - - bool generateSuccess[numLanguages]{}; - - for (int j = 0; j < numLanguages; j++) { - std::string genErrorString; - generateSuccess[j] = GenerateVShader(id, buffer[j], languages[j], &genErrorString); - if (!genErrorString.empty()) { - printf("%s\n", genErrorString.c_str()); - } - } - - // Now that we have the strings ready for easy comparison (buffer,4 in the watch window), - // let's try to compile them. - for (int j = 0; j < numLanguages; j++) { - if (generateSuccess[j]) { - if (!TestCompileShader(buffer[j], languages[j], true)) { - printf("Error compiling vertex shader:\n\n%s\n\n", LineNumberString(buffer[j]).c_str()); - return false; - } - successes++; - } - } - } - - printf("%d/%d vertex shaders generated (it's normal that it's not all, there are invalid bit combos)\n", successes, count * numLanguages); - - successes = 0; - count = 200; - for (int i = 0; i < numLanguages; i++) { delete[] buffer[i]; } From 057fd9f8a3f29afe725d0f2a0797d2f56ad0041b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Fri, 23 Oct 2020 09:01:56 +0200 Subject: [PATCH 091/275] Bridge more vertex shader differences --- GPU/Common/ShaderCommon.cpp | 1 + GPU/Common/ShaderCommon.h | 1 + GPU/Common/ShaderUniforms.h | 4 ++-- GPU/Directx9/VertexShaderGeneratorHLSL.cpp | 4 ++-- GPU/GLES/ShaderManagerGLES.cpp | 1 + GPU/GLES/VertexShaderGeneratorGLES.cpp | 12 +++++++----- GPU/Vulkan/VertexShaderGeneratorVulkan.cpp | 8 ++++---- unittest/TestShaderGenerators.cpp | 7 ++++--- 8 files changed, 22 insertions(+), 16 deletions(-) diff --git a/GPU/Common/ShaderCommon.cpp b/GPU/Common/ShaderCommon.cpp index e48f733437..e264d97467 100644 --- a/GPU/Common/ShaderCommon.cpp +++ b/GPU/Common/ShaderCommon.cpp @@ -117,4 +117,5 @@ void GLSLShaderCompat::SetupForVulkan() { texture = "texture"; texelFetch = "texelFetch"; vulkan = true; + forceMatrix4x4 = false; } diff --git a/GPU/Common/ShaderCommon.h b/GPU/Common/ShaderCommon.h index acc0de74f5..a8d03563b1 100644 --- a/GPU/Common/ShaderCommon.h +++ b/GPU/Common/ShaderCommon.h @@ -156,6 +156,7 @@ struct GLSLShaderCompat { const char *framebufferFetchExtension; bool glslES30; bool bitwiseOps; + bool forceMatrix4x4; void SetupForVulkan(); }; diff --git a/GPU/Common/ShaderUniforms.h b/GPU/Common/ShaderUniforms.h index 5acf973588..96be41af09 100644 --- a/GPU/Common/ShaderUniforms.h +++ b/GPU/Common/ShaderUniforms.h @@ -50,7 +50,7 @@ R"( mat4 u_proj; mat4 u_proj_through; mat3x4 u_view; mat3x4 u_world; - mat3x4 u_tex; + mat3x4 u_texmtx; vec4 u_uvscaleoffset; vec4 u_depthRange; vec2 u_fogcoef; @@ -78,7 +78,7 @@ R"( float4x4 u_proj; float4x4 u_proj_through; float4x3 u_view; float4x3 u_world; - float4x3 u_tex; + float4x3 u_texmtx; float4 u_uvscaleoffset; float4 u_depthRange; float2 u_fogcoef; diff --git a/GPU/Directx9/VertexShaderGeneratorHLSL.cpp b/GPU/Directx9/VertexShaderGeneratorHLSL.cpp index 78cb8d1265..12a60caffd 100644 --- a/GPU/Directx9/VertexShaderGeneratorHLSL.cpp +++ b/GPU/Directx9/VertexShaderGeneratorHLSL.cpp @@ -121,7 +121,7 @@ bool GenerateVertexShaderHLSL(const VShaderID &id, char *buffer, ShaderLanguage WRITE(p, "float4x3 u_world : register(c%i);\n", CONST_VS_WORLD); WRITE(p, "float4x3 u_view : register(c%i);\n", CONST_VS_VIEW); if (doTextureTransform) - WRITE(p, "float4x3 u_tex : register(c%i);\n", CONST_VS_TEXMTX); + WRITE(p, "float4x3 u_texmtx : register(c%i);\n", CONST_VS_TEXMTX); if (enableBones) { #ifdef USE_BONE_ARRAY WRITE(p, "float4x3 u_bone[%i] : register(c%i);\n", numBones, CONST_VS_BONE0); @@ -687,7 +687,7 @@ bool GenerateVertexShaderHLSL(const VShaderID &id, char *buffer, ShaderLanguage break; } // Transform by texture matrix. XYZ as we are doing projection mapping. - WRITE(p, " Out.v_texcoord.xyz = mul(%s, u_tex) * float3(u_uvscaleoffset.xy, 1.0);\n", temp_tc.c_str()); + WRITE(p, " Out.v_texcoord.xyz = mul(%s, u_texmtx) * float3(u_uvscaleoffset.xy, 1.0);\n", temp_tc.c_str()); } break; diff --git a/GPU/GLES/ShaderManagerGLES.cpp b/GPU/GLES/ShaderManagerGLES.cpp index 4b903f9191..9a7d10e7ef 100644 --- a/GPU/GLES/ShaderManagerGLES.cpp +++ b/GPU/GLES/ShaderManagerGLES.cpp @@ -595,6 +595,7 @@ void ShaderManagerGLES::DetectShaderLanguage() { compat.bitwiseOps = false; compat.lastFragData = nullptr; compat.gles = gl_extensions.IsGLES; + compat.forceMatrix4x4 = true; if (compat.gles) { if (gstate_c.Supports(GPU_SUPPORTS_GLSL_ES_300)) { diff --git a/GPU/GLES/VertexShaderGeneratorGLES.cpp b/GPU/GLES/VertexShaderGeneratorGLES.cpp index 2582853992..c1916601e8 100644 --- a/GPU/GLES/VertexShaderGeneratorGLES.cpp +++ b/GPU/GLES/VertexShaderGeneratorGLES.cpp @@ -197,7 +197,6 @@ bool GenerateVertexShaderGLSL(const VShaderID &id, char *buffer, const GLSLShade int numBoneWeights = 0; int boneWeightScale = id.Bits(VS_BIT_WEIGHT_FMTSCALE, 2); bool texcoordVec3In = false; - bool scaleUV = false; if (compat.vulkan) { if (enableBones) { @@ -292,8 +291,6 @@ bool GenerateVertexShaderGLSL(const VShaderID &id, char *buffer, const GLSLShade // Add all the uniforms we'll need to transform properly. } - scaleUV = !isModeThrough && (uvGenMode == GE_TEXMAP_TEXTURE_COORDS || uvGenMode == GE_TEXMAP_UNKNOWN); - if (useHWTransform) { // When transforming by hardware, we need a great deal more uniforms... // TODO: Use 4x3 matrices where possible. Though probably doesn't matter much. @@ -625,7 +622,7 @@ bool GenerateVertexShaderGLSL(const VShaderID &id, char *buffer, const GLSLShade WRITE(p, " mediump vec3 worldnormal = normalize((u_world * vec4(skinnednormal, 0.0)).xyz);\n"); } - WRITE(p, " vec4 viewPos = vec4(worldpos, 1.0) * u_view;\n"); + WRITE(p, " vec4 viewPos = vec4((vec4(worldpos, 1.0) * u_view).xyz, 1.0);\n"); // Final view and projection transforms. if (gstate_c.Supports(GPU_ROUND_DEPTH_TO_16BIT)) { @@ -787,6 +784,8 @@ bool GenerateVertexShaderGLSL(const VShaderID &id, char *buffer, const GLSLShade WRITE(p, " v_color1 = vec3(0.0);\n"); } + bool scaleUV = !isModeThrough && (uvGenMode == GE_TEXMAP_TEXTURE_COORDS || uvGenMode == GE_TEXMAP_UNKNOWN); + // Step 3: UV generation if (doTexture) { switch (uvGenMode) { @@ -795,7 +794,7 @@ bool GenerateVertexShaderGLSL(const VShaderID &id, char *buffer, const GLSLShade if (scaleUV) { if (hasTexcoord) { if (doBezier || doSpline) - WRITE(p, " v_texcoord = vec3(tess.tex * u_uvscaleoffset.xy + u_uvscaleoffset.zw, 0.0);\n"); + WRITE(p, " v_texcoord = vec3(tess.tex.xy * u_uvscaleoffset.xy + u_uvscaleoffset.zw, 0.0);\n"); else WRITE(p, " v_texcoord = vec3(texcoord.xy * u_uvscaleoffset.xy, 0.0);\n"); } else { @@ -876,6 +875,9 @@ bool GenerateVertexShaderGLSL(const VShaderID &id, char *buffer, const GLSLShade WRITE(p, " }\n"); } WRITE(p, " gl_Position = outPos;\n"); + if (compat.vulkan) { + WRITE(p, " gl_PointSize = 1.0;\n"); + } WRITE(p, "}\n"); return true; diff --git a/GPU/Vulkan/VertexShaderGeneratorVulkan.cpp b/GPU/Vulkan/VertexShaderGeneratorVulkan.cpp index 76a613b35d..22613b0594 100644 --- a/GPU/Vulkan/VertexShaderGeneratorVulkan.cpp +++ b/GPU/Vulkan/VertexShaderGeneratorVulkan.cpp @@ -346,9 +346,9 @@ bool GenerateVertexShaderVulkanGLSL(const VShaderID &id, char *buffer, std::stri } } else { // No skinning, just standard T&L. - WRITE(p, " vec3 worldpos = vec4(position.xyz, 1.0) * u_world;\n"); + WRITE(p, " vec3 worldpos = (vec4(position.xyz, 1.0) * u_world).xyz;\n"); if (hasNormal) - WRITE(p, " mediump vec3 worldnormal = normalize(vec4(%snormal, 0.0) * u_world);\n", flipNormal ? "-" : ""); + WRITE(p, " mediump vec3 worldnormal = normalize((vec4(%snormal, 0.0) * u_world).xyz);\n", flipNormal ? "-" : ""); else WRITE(p, " mediump vec3 worldnormal = vec3(0.0, 0.0, 1.0);\n"); } @@ -382,7 +382,7 @@ bool GenerateVertexShaderVulkanGLSL(const VShaderID &id, char *buffer, std::stri WRITE(p, " mediump vec3 worldnormal = normalize(vec4(skinnednormal, 0.0) * u_world);\n"); } - WRITE(p, " vec4 viewPos = vec4(vec4(worldpos, 1.0) * u_view, 1.0);\n"); + WRITE(p, " vec4 viewPos = vec4((vec4(worldpos, 1.0) * u_view).xyz, 1.0);\n"); // Final view and projection transforms. if (gstate_c.Supports(GPU_ROUND_DEPTH_TO_16BIT)) { @@ -595,7 +595,7 @@ bool GenerateVertexShaderVulkanGLSL(const VShaderID &id, char *buffer, std::stri break; } // Transform by texture matrix. XYZ as we are doing projection mapping. - WRITE(p, " v_texcoord = (%s * u_tex).xyz * vec3(u_uvscaleoffset.xy, 1.0);\n", temp_tc.c_str()); + WRITE(p, " v_texcoord = (%s * u_texmtx).xyz * vec3(u_uvscaleoffset.xy, 1.0);\n", temp_tc.c_str()); } break; diff --git a/unittest/TestShaderGenerators.cpp b/unittest/TestShaderGenerators.cpp index 88b41f3536..c2d4f5d8d9 100644 --- a/unittest/TestShaderGenerators.cpp +++ b/unittest/TestShaderGenerators.cpp @@ -95,7 +95,8 @@ bool TestCompileShader(const char *buffer, ShaderLanguage lang, bool vertex) { return false; case ShaderLanguage::GLSL_300: return false; - + case ShaderLanguage::TEST_GLSL_VULKAN: + return true; default: return false; } @@ -117,7 +118,7 @@ void PrintDiff(const char *a, const char *b) { printf("a: %s\n", a_lines[i].c_str()); printf("b: %s\n", b_lines[i].c_str()); printf("...continues...\n"); - for (size_t j = i; j < i + 4 && j < a_lines.size(); j++) { + for (size_t j = i + 1; j < i + 5 && j < a_lines.size(); j++) { printf("a: %s\n", a_lines[j].c_str()); printf("b: %s\n", b_lines[j].c_str()); } @@ -182,7 +183,7 @@ bool TestShaderGenerators() { return 1; } if (generateSuccess[0] && strcmp(buffer[0], buffer[1])) { - printf("mismatching shaders!\n"); + printf("mismatching shaders! a=glsl b=vulkan\n"); PrintDiff(buffer[0], buffer[1]); return 1; } From a8f4a4d7497bdbb3b92c188e2a18c48374b9d5c9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Fri, 23 Oct 2020 18:37:37 +0200 Subject: [PATCH 092/275] Fix more vertex shader differences --- GPU/Common/ShaderUniforms.h | 3 +-- GPU/GLES/ShaderManagerGLES.cpp | 2 +- GPU/GLES/VertexShaderGeneratorGLES.cpp | 31 +++++++--------------- GPU/Vulkan/VertexShaderGeneratorVulkan.cpp | 17 ++++++------ 4 files changed, 19 insertions(+), 34 deletions(-) diff --git a/GPU/Common/ShaderUniforms.h b/GPU/Common/ShaderUniforms.h index 96be41af09..fd13956eec 100644 --- a/GPU/Common/ShaderUniforms.h +++ b/GPU/Common/ShaderUniforms.h @@ -194,10 +194,9 @@ struct UB_VS_Bones { }; static const char *ub_vs_bonesStr = -R"( mat3x4 u_bone[8]; +R"( mat3x4 u_bone0; mat3x4 u_bone1; mat3x4 u_bone2; mat3x4 u_bone3; mat3x4 u_bone4; mat3x4 u_bone5; mat3x4 u_bone6; mat3x4 u_bone7; mat3x4 u_bone8; )"; -// HLSL code is shared so these names are changed to match those in DX9. static const char *cb_vs_bonesStr = R"( float4x3 u_bone[8]; )"; diff --git a/GPU/GLES/ShaderManagerGLES.cpp b/GPU/GLES/ShaderManagerGLES.cpp index 9a7d10e7ef..5d5af4f4a8 100644 --- a/GPU/GLES/ShaderManagerGLES.cpp +++ b/GPU/GLES/ShaderManagerGLES.cpp @@ -495,7 +495,7 @@ void LinkedShader::UpdateUniforms(u32 vertType, const ShaderID &vsid, bool useBu float bonetemp[16]; for (int i = 0; i < numBones; i++) { if (dirty & (DIRTY_BONEMATRIX0 << i)) { - ConvertMatrix4x3To4x4(bonetemp, gstate.boneMatrix + 12 * i); + ConvertMatrix4x3To4x4Transposed(bonetemp, gstate.boneMatrix + 12 * i); render_->SetUniformM4x4(&u_bone[i], bonetemp); } } diff --git a/GPU/GLES/VertexShaderGeneratorGLES.cpp b/GPU/GLES/VertexShaderGeneratorGLES.cpp index c1916601e8..317c54fbd1 100644 --- a/GPU/GLES/VertexShaderGeneratorGLES.cpp +++ b/GPU/GLES/VertexShaderGeneratorGLES.cpp @@ -580,25 +580,14 @@ bool GenerateVertexShaderGLSL(const VShaderID &id, char *buffer, const GLSLShade "w2.x", "w2.y", "w2.z", "w2.w", }; -#ifdef USE_BONE_ARRAY - if (numBoneWeights == 1) - WRITE(p, " mat4 skinMatrix = w1 * u_bone[0]"); - else - WRITE(p, " mat4 skinMatrix = w1.x * u_bone[0]"); - for (int i = 1; i < numBoneWeights; i++) { - const char *weightAttr = boneWeightAttr[i]; - // workaround for "cant do .x of scalar" issue - if (numBoneWeights == 1 && i == 0) weightAttr = "w1"; - if (numBoneWeights == 5 && i == 4) weightAttr = "w2"; - WRITE(p, " + %s * u_bone[%i]", weightAttr, i); - } -#else + const char *boneMatrix = compat.forceMatrix4x4 ? "mat4" : "mat3x4"; + // Uncomment this to screw up bone shaders to check the vertex shader software fallback // WRITE(p, "THIS SHOULD ERROR! #error"); if (numBoneWeights == 1) - WRITE(p, " mat4 skinMatrix = w1 * u_bone0"); + WRITE(p, " %s skinMatrix = w1 * u_bone0", boneMatrix); else - WRITE(p, " mat4 skinMatrix = w1.x * u_bone0"); + WRITE(p, " %s skinMatrix = w1.x * u_bone0", boneMatrix); for (int i = 1; i < numBoneWeights; i++) { const char *weightAttr = boneWeightAttr[i]; // workaround for "cant do .x of scalar" issue @@ -606,20 +595,18 @@ bool GenerateVertexShaderGLSL(const VShaderID &id, char *buffer, const GLSLShade if (numBoneWeights == 5 && i == 4) weightAttr = "w2"; WRITE(p, " + %s * u_bone%i", weightAttr, i); } -#endif WRITE(p, ";\n"); - // Trying to simplify this results in bugs in LBP... - WRITE(p, " vec3 skinnedpos = (skinMatrix * vec4(position, 1.0)).xyz %s;\n", factor); - WRITE(p, " vec3 worldpos = (u_world * vec4(skinnedpos, 1.0)).xyz;\n"); + WRITE(p, " vec3 skinnedpos = (vec4(position, 1.0) * skinMatrix).xyz %s;\n", factor); + WRITE(p, " vec3 worldpos = (vec4(skinnedpos, 1.0) * u_world).xyz;\n"); if (hasNormal) { - WRITE(p, " mediump vec3 skinnednormal = (skinMatrix * vec4(%snormal, 0.0)).xyz %s;\n", flipNormal ? "-" : "", factor); + WRITE(p, " mediump vec3 skinnednormal = (vec4(%snormal, 0.0) * skinMatrix).xyz %s;\n", flipNormal ? "-" : "", factor); } else { - WRITE(p, " mediump vec3 skinnednormal = (skinMatrix * vec4(0.0, 0.0, %s1.0, 0.0)).xyz %s;\n", flipNormal ? "-" : "", factor); + WRITE(p, " mediump vec3 skinnednormal = (vec4(0.0, 0.0, %s1.0, 0.0) * skinMatrix).xyz %s;\n", flipNormal ? "-" : "", factor); } - WRITE(p, " mediump vec3 worldnormal = normalize((u_world * vec4(skinnednormal, 0.0)).xyz);\n"); + WRITE(p, " mediump vec3 worldnormal = normalize((vec4(skinnednormal, 0.0) * u_world).xyz);\n"); } WRITE(p, " vec4 viewPos = vec4((vec4(worldpos, 1.0) * u_view).xyz, 1.0);\n"); diff --git a/GPU/Vulkan/VertexShaderGeneratorVulkan.cpp b/GPU/Vulkan/VertexShaderGeneratorVulkan.cpp index 22613b0594..cb295d4f6a 100644 --- a/GPU/Vulkan/VertexShaderGeneratorVulkan.cpp +++ b/GPU/Vulkan/VertexShaderGeneratorVulkan.cpp @@ -361,25 +361,24 @@ bool GenerateVertexShaderVulkanGLSL(const VShaderID &id, char *buffer, std::stri "w2.x", "w2.y", "w2.z", "w2.w", }; - WRITE(p, " mat3x4 skinMatrix = w1.x * u_bone[0];\n"); + WRITE(p, " mat3x4 skinMatrix = w1.x * u_bone0"); if (numBoneWeights > 1) { for (int i = 1; i < numBoneWeights; i++) { - WRITE(p, " skinMatrix += %s * u_bone[%i];\n", boneWeightAttr[i], i); + WRITE(p, " + %s * u_bone%d", boneWeightAttr[i], i); } } WRITE(p, ";\n"); - // Trying to simplify this results in bugs in LBP... - WRITE(p, " vec3 skinnedpos = (vec4(position, 1.0) * skinMatrix) %s;\n", factor); - WRITE(p, " vec3 worldpos = vec4(skinnedpos, 1.0) * u_world;\n"); + WRITE(p, " vec3 skinnedpos = (vec4(position, 1.0) * skinMatrix).xyz %s;\n", factor); + WRITE(p, " vec3 worldpos = (vec4(skinnedpos, 1.0) * u_world).xyz;\n"); if (hasNormal) { - WRITE(p, " mediump vec3 skinnednormal = vec4(%snormal, 0.0) * skinMatrix %s;\n", flipNormal ? "-" : "", factor); + WRITE(p, " mediump vec3 skinnednormal = (vec4(%snormal, 0.0) * skinMatrix).xyz %s;\n", flipNormal ? "-" : "", factor); } else { - WRITE(p, " mediump vec3 skinnednormal = vec4(0.0, 0.0, %s1.0, 0.0) * skinMatrix %s;\n", flipNormal ? "-" : "", factor); + WRITE(p, " mediump vec3 skinnednormal = (vec4(0.0, 0.0, %s1.0, 0.0) * skinMatrix).xyz %s;\n", flipNormal ? "-" : "", factor); } - WRITE(p, " mediump vec3 worldnormal = normalize(vec4(skinnednormal, 0.0) * u_world);\n"); + WRITE(p, " mediump vec3 worldnormal = normalize((vec4(skinnednormal, 0.0) * u_world).xyz);\n"); } WRITE(p, " vec4 viewPos = vec4((vec4(worldpos, 1.0) * u_view).xyz, 1.0);\n"); @@ -408,7 +407,7 @@ bool GenerateVertexShaderVulkanGLSL(const VShaderID &id, char *buffer, std::stri bool distanceNeeded = false; if (enableLighting) { - WRITE(p, " vec4 lightSum0 = u_ambient * %s + vec4(u_matemissive, 0.0);\n", ambientStr); + WRITE(p, " lowp vec4 lightSum0 = u_ambient * %s + vec4(u_matemissive, 0.0);\n", ambientStr); for (int i = 0; i < 4; i++) { GELightType type = static_cast(id.Bits(VS_BIT_LIGHT0_TYPE + 4 * i, 2)); From 7532116b6928a9f891ec25ddc40068dc17f4ec18 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Fri, 23 Oct 2020 22:32:11 +0200 Subject: [PATCH 093/275] Fix additional minor differences --- GPU/GLES/VertexShaderGeneratorGLES.cpp | 15 +++++---- GPU/Vulkan/VertexShaderGeneratorVulkan.cpp | 39 +++++++++++++--------- 2 files changed, 31 insertions(+), 23 deletions(-) diff --git a/GPU/GLES/VertexShaderGeneratorGLES.cpp b/GPU/GLES/VertexShaderGeneratorGLES.cpp index 317c54fbd1..eca75bb28e 100644 --- a/GPU/GLES/VertexShaderGeneratorGLES.cpp +++ b/GPU/GLES/VertexShaderGeneratorGLES.cpp @@ -196,7 +196,7 @@ bool GenerateVertexShaderGLSL(const VShaderID &id, char *buffer, const GLSLShade int numBoneWeights = 0; int boneWeightScale = id.Bits(VS_BIT_WEIGHT_FMTSCALE, 2); - bool texcoordVec3In = false; + bool texcoordInVec3 = false; if (compat.vulkan) { if (enableBones) { @@ -213,7 +213,6 @@ bool GenerateVertexShaderGLSL(const VShaderID &id, char *buffer, const GLSLShade if (useHWTransform && hasNormal) WRITE(p, "layout (location = %d) in vec3 normal;\n", (int)PspAttributeLocation::NORMAL); - bool texcoordInVec3 = false; if (doTexture && hasTexcoord) { if (!useHWTransform && doTextureTransform && !isModeThrough) { WRITE(p, "layout (location = %d) in vec3 texcoord;\n", (int)PspAttributeLocation::TEXCOORD); @@ -267,7 +266,7 @@ bool GenerateVertexShaderGLSL(const VShaderID &id, char *buffer, const GLSLShade if (doTexture && hasTexcoord) { if (!useHWTransform && doTextureTransform && !isModeThrough) { WRITE(p, "%s vec3 texcoord;\n", compat.attribute); - texcoordVec3In = true; + texcoordInVec3 = true; } else { WRITE(p, "%s vec2 texcoord;\n", compat.attribute); } @@ -521,7 +520,7 @@ bool GenerateVertexShaderGLSL(const VShaderID &id, char *buffer, const GLSLShade if (!useHWTransform) { // Simple pass-through of vertex data to fragment shader if (doTexture) { - if (texcoordVec3In) { + if (texcoordInVec3) { WRITE(p, " v_texcoord = texcoord;\n"); } else { WRITE(p, " v_texcoord = vec3(texcoord, 1.0);\n"); @@ -584,15 +583,17 @@ bool GenerateVertexShaderGLSL(const VShaderID &id, char *buffer, const GLSLShade // Uncomment this to screw up bone shaders to check the vertex shader software fallback // WRITE(p, "THIS SHOULD ERROR! #error"); - if (numBoneWeights == 1) + if (numBoneWeights == 1 && !compat.vulkan) WRITE(p, " %s skinMatrix = w1 * u_bone0", boneMatrix); else WRITE(p, " %s skinMatrix = w1.x * u_bone0", boneMatrix); for (int i = 1; i < numBoneWeights; i++) { const char *weightAttr = boneWeightAttr[i]; // workaround for "cant do .x of scalar" issue - if (numBoneWeights == 1 && i == 0) weightAttr = "w1"; - if (numBoneWeights == 5 && i == 4) weightAttr = "w2"; + if (!compat.vulkan) { + if (numBoneWeights == 1 && i == 0) weightAttr = "w1"; + if (numBoneWeights == 5 && i == 4) weightAttr = "w2"; + } WRITE(p, " + %s * u_bone%i", weightAttr, i); } diff --git a/GPU/Vulkan/VertexShaderGeneratorVulkan.cpp b/GPU/Vulkan/VertexShaderGeneratorVulkan.cpp index cb295d4f6a..ad56a542e9 100644 --- a/GPU/Vulkan/VertexShaderGeneratorVulkan.cpp +++ b/GPU/Vulkan/VertexShaderGeneratorVulkan.cpp @@ -406,6 +406,7 @@ bool GenerateVertexShaderVulkanGLSL(const VShaderID &id, char *buffer, std::stri bool specularIsZero = true; bool distanceNeeded = false; + bool anySpots = false; if (enableLighting) { WRITE(p, " lowp vec4 lightSum0 = u_ambient * %s + vec4(u_matemissive, 0.0);\n", ambientStr); @@ -419,18 +420,24 @@ bool GenerateVertexShaderVulkanGLSL(const VShaderID &id, char *buffer, std::stri specularIsZero = false; if (type != GE_LIGHTTYPE_DIRECTIONAL) distanceNeeded = true; + if (type == GE_LIGHTTYPE_SPOT || type == GE_LIGHTTYPE_UNKNOWN) + anySpots = true; } if (!specularIsZero) { - WRITE(p, " vec3 lightSum1 = vec3(0.0);\n"); + WRITE(p, " lowp vec3 lightSum1 = vec3(0.0);\n"); } if (!diffuseIsZero) { WRITE(p, " vec3 toLight;\n"); - WRITE(p, " vec3 diffuse;\n"); + WRITE(p, " lowp vec3 diffuse;\n"); } if (distanceNeeded) { WRITE(p, " float distance;\n"); - WRITE(p, " float lightScale;\n"); + WRITE(p, " lowp float lightScale;\n"); + } + WRITE(p, " mediump float ldot;\n"); + if (anySpots) { + WRITE(p, " lowp float angle;\n"); } } @@ -455,14 +462,14 @@ bool GenerateVertexShaderVulkanGLSL(const VShaderID &id, char *buffer, std::stri bool doSpecular = comp == GE_LIGHTCOMP_BOTH; bool poweredDiffuse = comp == GE_LIGHTCOMP_ONLYPOWDIFFUSE; - WRITE(p, " mediump float dot%i = dot(toLight, worldnormal);\n", i); + WRITE(p, " ldot = dot(toLight, worldnormal);\n"); if (poweredDiffuse) { // pow(0.0, 0.0) may be undefined, but the PSP seems to treat it as 1.0. // Seen in Tales of the World: Radiant Mythology (#2424.) WRITE(p, " if (u_matspecular.a <= 0.0) {\n"); - WRITE(p, " dot%i = 1.0;\n", i); + WRITE(p, " ldot = 1.0;\n"); WRITE(p, " } else {\n"); - WRITE(p, " dot%i = pow(max(dot%i, 0.0), u_matspecular.a);\n", i, i); + WRITE(p, " ldot = pow(max(ldot, 0.0), u_matspecular.a);\n"); WRITE(p, " }\n"); } @@ -478,9 +485,9 @@ bool GenerateVertexShaderVulkanGLSL(const VShaderID &id, char *buffer, std::stri break; case GE_LIGHTTYPE_SPOT: case GE_LIGHTTYPE_UNKNOWN: - WRITE(p, " float angle%i = length(u_lightdir%d) == 0.0 ? 0.0 : dot(normalize(u_lightdir%d), toLight);\n", i, i, i); - WRITE(p, " if (angle%i >= u_lightangle_spotCoef%d.x) {\n", i, i); - WRITE(p, " lightScale = clamp(1.0 / dot(u_lightatt%d, vec3(1.0, distance, distance*distance)), 0.0, 1.0) * (u_lightangle_spotCoef%d.y <= 0.0 ? 1.0 : pow(angle%i, u_lightangle_spotCoef%d.y));\n", i, i, i, i); + WRITE(p, " angle = length(u_lightdir%d) == 0.0 ? 0.0 : dot(normalize(u_lightdir%d), toLight);\n", i, i); + WRITE(p, " if (angle >= u_lightangle_spotCoef%d.x) {\n", i); + WRITE(p, " lightScale = clamp(1.0 / dot(u_lightatt%d, vec3(1.0, distance, distance*distance)), 0.0, 1.0) * (u_lightangle_spotCoef%d.y <= 0.0 ? 1.0 : pow(angle, u_lightangle_spotCoef%d.y));\n", i, i, i); WRITE(p, " } else {\n"); WRITE(p, " lightScale = 0.0;\n"); WRITE(p, " }\n"); @@ -490,17 +497,17 @@ bool GenerateVertexShaderVulkanGLSL(const VShaderID &id, char *buffer, std::stri break; } - WRITE(p, " diffuse = (u_lightdiffuse%d * %s) * max(dot%i, 0.0);\n", i, diffuseStr, i); + WRITE(p, " diffuse = (u_lightdiffuse%d * %s) * max(ldot, 0.0);\n", i, diffuseStr); if (doSpecular) { - WRITE(p, " if (dot%i >= 0.0) {\n", i); - WRITE(p, " dot%i = dot(normalize(toLight + vec3(0.0, 0.0, 1.0)), worldnormal);\n", i); + WRITE(p, " if (ldot >= 0.0) {\n"); + WRITE(p, " ldot = dot(normalize(toLight + vec3(0.0, 0.0, 1.0)), worldnormal);\n"); WRITE(p, " if (u_matspecular.a <= 0.0) {\n"); - WRITE(p, " dot%i = 1.0;\n", i); + WRITE(p, " ldot = 1.0;\n"); WRITE(p, " } else {\n"); - WRITE(p, " dot%i = pow(max(dot%i, 0.0), u_matspecular.a);\n", i, i); + WRITE(p, " ldot = pow(max(ldot, 0.0), u_matspecular.a);\n"); WRITE(p, " }\n"); - WRITE(p, " if (dot%i > 0.0)\n", i); - WRITE(p, " lightSum1 += u_lightspecular%d * %s * dot%i %s;\n", i, specularStr, i, timesLightScale); + WRITE(p, " if (ldot > 0.0)\n"); + WRITE(p, " lightSum1 += u_lightspecular%d * %s * ldot %s;\n", i, specularStr, timesLightScale); WRITE(p, " }\n"); } WRITE(p, " lightSum0.rgb += (u_lightambient%d * %s.rgb + diffuse)%s;\n", i, ambientStr, timesLightScale); From 6055350a2c341c3461fb68dd3b752d7f0bf36039 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Fri, 23 Oct 2020 23:41:26 +0200 Subject: [PATCH 094/275] Initial work on fixing tess --- GPU/Common/ShaderCommon.cpp | 1 + GPU/Common/ShaderCommon.h | 1 + GPU/GLES/VertexShaderGeneratorGLES.cpp | 66 +++++++++++++++------- GPU/Vulkan/VertexShaderGeneratorVulkan.cpp | 2 +- unittest/TestShaderGenerators.cpp | 4 -- 5 files changed, 49 insertions(+), 25 deletions(-) diff --git a/GPU/Common/ShaderCommon.cpp b/GPU/Common/ShaderCommon.cpp index e264d97467..04c4a12d4d 100644 --- a/GPU/Common/ShaderCommon.cpp +++ b/GPU/Common/ShaderCommon.cpp @@ -118,4 +118,5 @@ void GLSLShaderCompat::SetupForVulkan() { texelFetch = "texelFetch"; vulkan = true; forceMatrix4x4 = false; + coefsFromBuffers = true; } diff --git a/GPU/Common/ShaderCommon.h b/GPU/Common/ShaderCommon.h index a8d03563b1..4fc01fb715 100644 --- a/GPU/Common/ShaderCommon.h +++ b/GPU/Common/ShaderCommon.h @@ -157,6 +157,7 @@ struct GLSLShaderCompat { bool glslES30; bool bitwiseOps; bool forceMatrix4x4; + bool coefsFromBuffers; void SetupForVulkan(); }; diff --git a/GPU/GLES/VertexShaderGeneratorGLES.cpp b/GPU/GLES/VertexShaderGeneratorGLES.cpp index eca75bb28e..f7b1bad4b2 100644 --- a/GPU/GLES/VertexShaderGeneratorGLES.cpp +++ b/GPU/GLES/VertexShaderGeneratorGLES.cpp @@ -419,7 +419,7 @@ bool GenerateVertexShaderGLSL(const VShaderID &id, char *buffer, const GLSLShade WRITE(p, " TessData data[];\n"); WRITE(p, "} tess_data;\n"); - WRITE(p, "layout (std430) struct TessWeight {\n"); + WRITE(p, "struct TessWeight {\n"); WRITE(p, " vec4 basis;\n"); WRITE(p, " vec4 deriv;\n"); WRITE(p, "};\n"); @@ -450,7 +450,7 @@ bool GenerateVertexShaderGLSL(const VShaderID &id, char *buffer, const GLSLShade WRITE(p, "}\n"); } - if (!gl_extensions.VersionGEThan(3, 0, 0)) { // For glsl version 1.10 + if (compat.glslVersionNumber < 130) { // For glsl version 1.10 WRITE(p, "mat4 outerProduct(vec4 u, vec4 v) {\n"); WRITE(p, " return mat4(u * v[0], u * v[1], u * v[2], u * v[3]);\n"); WRITE(p, "}\n"); @@ -473,23 +473,43 @@ bool GenerateVertexShaderGLSL(const VShaderID &id, char *buffer, const GLSLShade WRITE(p, " vec3 _pos[16];\n"); WRITE(p, " vec2 _tex[16];\n"); WRITE(p, " vec4 _col[16];\n"); - WRITE(p, " int index_u, index_v;\n"); - for (int i = 0; i < 4; i++) { - for (int j = 0; j < 4; j++) { - WRITE(p, " index_u = (%i + point_pos.x);\n", j); - WRITE(p, " index_v = (%i + point_pos.y);\n", i); - WRITE(p, " _pos[%i] = %s(u_tess_points, ivec2(index_u, index_v), 0).xyz;\n", i * 4 + j, compat.texelFetch); - if (doTexture && hasTexcoordTess) - WRITE(p, " _tex[%i] = %s(u_tess_points, ivec2(index_u + u_spline_counts, index_v), 0).xy;\n", i * 4 + j, compat.texelFetch); - if (hasColorTess) - WRITE(p, " _col[%i] = %s(u_tess_points, ivec2(index_u + u_spline_counts * 2, index_v), 0).rgba;\n", i * 4 + j, compat.texelFetch); + if (compat.coefsFromBuffers) { + WRITE(p, " int index;\n"); + for (int i = 0; i < 4; i++) { + for (int j = 0; j < 4; j++) { + WRITE(p, " index = (%i + point_pos.y) * int(u_spline_counts) + (%i + point_pos.x);\n", i, j); + WRITE(p, " _pos[%i] = tess_data.data[index].pos.xyz;\n", i * 4 + j); + if (doTexture && hasTexcoordTess) + WRITE(p, " _tex[%i] = tess_data.data[index].uv.xy;\n", i * 4 + j); + if (hasColorTess) + WRITE(p, " _col[%i] = tess_data.data[index].color;\n", i * 4 + j); + } } - } - // Basis polynomials as weight coefficients - WRITE(p, " vec4 basis_u = %s(u_tess_weights_u, %s, 0);\n", compat.texelFetch, "ivec2(weight_idx.x * 2, 0)"); - WRITE(p, " vec4 basis_v = %s(u_tess_weights_v, %s, 0);\n", compat.texelFetch, "ivec2(weight_idx.y * 2, 0)"); - WRITE(p, " mat4 basis = outerProduct(basis_u, basis_v);\n"); + // Basis polynomials as weight coefficients + WRITE(p, " vec4 basis_u = tess_weights_u.data[weight_idx.x].basis;\n"); + WRITE(p, " vec4 basis_v = tess_weights_v.data[weight_idx.y].basis;\n"); + WRITE(p, " mat4 basis = outerProduct(basis_u, basis_v);\n"); + + } else { + WRITE(p, " int index_u, index_v;\n"); + for (int i = 0; i < 4; i++) { + for (int j = 0; j < 4; j++) { + WRITE(p, " index_u = (%i + point_pos.x);\n", j); + WRITE(p, " index_v = (%i + point_pos.y);\n", i); + WRITE(p, " _pos[%i] = %s(u_tess_points, ivec2(index_u, index_v), 0).xyz;\n", i * 4 + j, compat.texelFetch); + if (doTexture && hasTexcoordTess) + WRITE(p, " _tex[%i] = %s(u_tess_points, ivec2(index_u + u_spline_counts, index_v), 0).xy;\n", i * 4 + j, compat.texelFetch); + if (hasColorTess) + WRITE(p, " _col[%i] = %s(u_tess_points, ivec2(index_u + u_spline_counts * 2, index_v), 0).rgba;\n", i * 4 + j, compat.texelFetch); + } + } + + // Basis polynomials as weight coefficients + WRITE(p, " vec4 basis_u = %s(u_tess_weights_u, %s, 0);\n", compat.texelFetch, "ivec2(weight_idx.x * 2, 0)"); + WRITE(p, " vec4 basis_v = %s(u_tess_weights_v, %s, 0);\n", compat.texelFetch, "ivec2(weight_idx.y * 2, 0)"); + WRITE(p, " mat4 basis = outerProduct(basis_u, basis_v);\n"); + } // Tessellate WRITE(p, " tess.pos = tess_sample(_pos, basis);\n"); @@ -504,9 +524,15 @@ bool GenerateVertexShaderGLSL(const VShaderID &id, char *buffer, const GLSLShade else WRITE(p, " tess.col = u_matambientalpha;\n"); if (hasNormalTess) { - // Derivatives as weight coefficients - WRITE(p, " vec4 deriv_u = %s(u_tess_weights_u, %s, 0);\n", compat.texelFetch, "ivec2(weight_idx.x * 2 + 1, 0)"); - WRITE(p, " vec4 deriv_v = %s(u_tess_weights_v, %s, 0);\n", compat.texelFetch, "ivec2(weight_idx.y * 2 + 1, 0)"); + if (compat.coefsFromBuffers) { + // Derivatives as weight coefficients + WRITE(p, " vec4 deriv_u = tess_weights_u.data[weight_idx.x].deriv;\n"); + WRITE(p, " vec4 deriv_v = tess_weights_v.data[weight_idx.y].deriv;\n"); + } else { + // Derivatives as weight coefficients + WRITE(p, " vec4 deriv_u = %s(u_tess_weights_u, %s, 0);\n", compat.texelFetch, "ivec2(weight_idx.x * 2 + 1, 0)"); + WRITE(p, " vec4 deriv_v = %s(u_tess_weights_v, %s, 0);\n", compat.texelFetch, "ivec2(weight_idx.y * 2 + 1, 0)"); + } WRITE(p, " vec3 du = tess_sample(_pos, outerProduct(deriv_u, basis_v));\n"); WRITE(p, " vec3 dv = tess_sample(_pos, outerProduct(basis_u, deriv_v));\n"); diff --git a/GPU/Vulkan/VertexShaderGeneratorVulkan.cpp b/GPU/Vulkan/VertexShaderGeneratorVulkan.cpp index ad56a542e9..734f85033a 100644 --- a/GPU/Vulkan/VertexShaderGeneratorVulkan.cpp +++ b/GPU/Vulkan/VertexShaderGeneratorVulkan.cpp @@ -216,7 +216,7 @@ bool GenerateVertexShaderVulkanGLSL(const VShaderID &id, char *buffer, std::stri WRITE(p, " TessData data[];\n"); WRITE(p, "} tess_data;\n"); - WRITE(p, "layout (std430) struct TessWeight {\n"); + WRITE(p, "struct TessWeight {\n"); WRITE(p, " vec4 basis;\n"); WRITE(p, " vec4 deriv;\n"); WRITE(p, "};\n"); diff --git a/unittest/TestShaderGenerators.cpp b/unittest/TestShaderGenerators.cpp index c2d4f5d8d9..98af754f21 100644 --- a/unittest/TestShaderGenerators.cpp +++ b/unittest/TestShaderGenerators.cpp @@ -162,10 +162,6 @@ bool TestShaderGenerators() { id.d[0] = bottom; id.d[1] = top; - // Skip testing beziers for now. I'll deal with those bugs later. - id.SetBit(VS_BIT_BEZIER, false); - id.SetBit(VS_BIT_SPLINE, false); - bool generateSuccess[numLanguages]{}; std::string genErrorString[numLanguages]; From 69c8912b9371a753a0c4b5e3c579729bfff29064 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Sun, 25 Oct 2020 08:24:19 +0100 Subject: [PATCH 095/275] More tess fixes --- GPU/Directx9/VertexShaderGeneratorHLSL.cpp | 4 ++-- GPU/GLES/VertexShaderGeneratorGLES.cpp | 5 +++-- GPU/Vulkan/VertexShaderGeneratorVulkan.cpp | 8 ++++---- 3 files changed, 9 insertions(+), 8 deletions(-) diff --git a/GPU/Directx9/VertexShaderGeneratorHLSL.cpp b/GPU/Directx9/VertexShaderGeneratorHLSL.cpp index 12a60caffd..9b88902800 100644 --- a/GPU/Directx9/VertexShaderGeneratorHLSL.cpp +++ b/GPU/Directx9/VertexShaderGeneratorHLSL.cpp @@ -70,8 +70,8 @@ bool GenerateVertexShaderHLSL(const VShaderID &id, char *buffer, ShaderLanguage bool enableLighting = id.Bit(VS_BIT_LIGHTING_ENABLE); int matUpdate = id.Bits(VS_BIT_MATERIAL_UPDATE, 3); - bool doBezier = id.Bit(VS_BIT_BEZIER); - bool doSpline = id.Bit(VS_BIT_SPLINE); + bool doBezier = id.Bit(VS_BIT_BEZIER) && !enableBones && useHWTransform; + bool doSpline = id.Bit(VS_BIT_SPLINE) && !enableBones && useHWTransform; bool hasColorTess = id.Bit(VS_BIT_HAS_COLOR_TESS); bool hasTexcoordTess = id.Bit(VS_BIT_HAS_TEXCOORD_TESS); bool hasNormalTess = id.Bit(VS_BIT_HAS_NORMAL_TESS); diff --git a/GPU/GLES/VertexShaderGeneratorGLES.cpp b/GPU/GLES/VertexShaderGeneratorGLES.cpp index f7b1bad4b2..66b0b90f23 100644 --- a/GPU/GLES/VertexShaderGeneratorGLES.cpp +++ b/GPU/GLES/VertexShaderGeneratorGLES.cpp @@ -162,8 +162,9 @@ bool GenerateVertexShaderGLSL(const VShaderID &id, char *buffer, const GLSLShade bool enableLighting = id.Bit(VS_BIT_LIGHTING_ENABLE); int matUpdate = id.Bits(VS_BIT_MATERIAL_UPDATE, 3); - bool doBezier = id.Bit(VS_BIT_BEZIER); - bool doSpline = id.Bit(VS_BIT_SPLINE); + // Apparently we don't support bezier/spline together with bones. + bool doBezier = id.Bit(VS_BIT_BEZIER) && !enableBones; + bool doSpline = id.Bit(VS_BIT_SPLINE) && !enableBones; bool hasColorTess = id.Bit(VS_BIT_HAS_COLOR_TESS); bool hasTexcoordTess = id.Bit(VS_BIT_HAS_TEXCOORD_TESS); bool hasNormalTess = id.Bit(VS_BIT_HAS_NORMAL_TESS); diff --git a/GPU/Vulkan/VertexShaderGeneratorVulkan.cpp b/GPU/Vulkan/VertexShaderGeneratorVulkan.cpp index 734f85033a..9f0135b896 100644 --- a/GPU/Vulkan/VertexShaderGeneratorVulkan.cpp +++ b/GPU/Vulkan/VertexShaderGeneratorVulkan.cpp @@ -121,8 +121,8 @@ bool GenerateVertexShaderVulkanGLSL(const VShaderID &id, char *buffer, std::stri bool enableLighting = id.Bit(VS_BIT_LIGHTING_ENABLE); int matUpdate = id.Bits(VS_BIT_MATERIAL_UPDATE, 3); - bool doBezier = id.Bit(VS_BIT_BEZIER); - bool doSpline = id.Bit(VS_BIT_SPLINE); + bool doBezier = id.Bit(VS_BIT_BEZIER) && !enableBones && useHWTransform; + bool doSpline = id.Bit(VS_BIT_SPLINE) && !enableBones && useHWTransform; bool hasColorTess = id.Bit(VS_BIT_HAS_COLOR_TESS); bool hasTexcoordTess = id.Bit(VS_BIT_HAS_TEXCOORD_TESS); bool hasNormalTess = id.Bit(VS_BIT_HAS_NORMAL_TESS); @@ -338,9 +338,9 @@ bool GenerateVertexShaderVulkanGLSL(const VShaderID &id, char *buffer, std::stri WRITE(p, " Tess tess;\n"); WRITE(p, " tessellate(tess);\n"); - WRITE(p, " vec3 worldpos = vec4(tess.pos.xyz, 1.0) * u_world;\n"); + WRITE(p, " vec3 worldpos = (vec4(tess.pos.xyz, 1.0) * u_world).xyz;\n"); if (hasNormalTess) { - WRITE(p, " mediump vec3 worldnormal = normalize(vec4(%stess.nrm, 0.0) * u_world);\n", flipNormalTess ? "-" : ""); + WRITE(p, " mediump vec3 worldnormal = normalize((vec4(%stess.nrm, 0.0) * u_world).xyz);\n", flipNormalTess ? "-" : ""); } else { WRITE(p, " mediump vec3 worldnormal = vec3(0.0, 0.0, 1.0);\n"); } From fb2ac3a67e9dbe6e67375f241e335219baedb334 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Sun, 25 Oct 2020 08:33:01 +0100 Subject: [PATCH 096/275] Additional fixes --- GPU/Directx9/VertexShaderGeneratorHLSL.cpp | 5 +++++ GPU/GLES/VertexShaderGeneratorGLES.cpp | 9 +++++++-- GPU/Vulkan/VertexShaderGeneratorVulkan.cpp | 7 +++++++ unittest/TestShaderGenerators.cpp | 6 +++--- 4 files changed, 22 insertions(+), 5 deletions(-) diff --git a/GPU/Directx9/VertexShaderGeneratorHLSL.cpp b/GPU/Directx9/VertexShaderGeneratorHLSL.cpp index 9b88902800..4279290ed0 100644 --- a/GPU/Directx9/VertexShaderGeneratorHLSL.cpp +++ b/GPU/Directx9/VertexShaderGeneratorHLSL.cpp @@ -72,6 +72,11 @@ bool GenerateVertexShaderHLSL(const VShaderID &id, char *buffer, ShaderLanguage bool doBezier = id.Bit(VS_BIT_BEZIER) && !enableBones && useHWTransform; bool doSpline = id.Bit(VS_BIT_SPLINE) && !enableBones && useHWTransform; + if ((doBezier || doSpline) && !hasNormal) { + // Bad usage. + *errorString = "Invalid flags - tess requires normal."; + return false; + } bool hasColorTess = id.Bit(VS_BIT_HAS_COLOR_TESS); bool hasTexcoordTess = id.Bit(VS_BIT_HAS_TEXCOORD_TESS); bool hasNormalTess = id.Bit(VS_BIT_HAS_NORMAL_TESS); diff --git a/GPU/GLES/VertexShaderGeneratorGLES.cpp b/GPU/GLES/VertexShaderGeneratorGLES.cpp index 66b0b90f23..c5d0bf8623 100644 --- a/GPU/GLES/VertexShaderGeneratorGLES.cpp +++ b/GPU/GLES/VertexShaderGeneratorGLES.cpp @@ -163,8 +163,13 @@ bool GenerateVertexShaderGLSL(const VShaderID &id, char *buffer, const GLSLShade int matUpdate = id.Bits(VS_BIT_MATERIAL_UPDATE, 3); // Apparently we don't support bezier/spline together with bones. - bool doBezier = id.Bit(VS_BIT_BEZIER) && !enableBones; - bool doSpline = id.Bit(VS_BIT_SPLINE) && !enableBones; + bool doBezier = id.Bit(VS_BIT_BEZIER) && !enableBones && useHWTransform; + bool doSpline = id.Bit(VS_BIT_SPLINE) && !enableBones && useHWTransform; + if ((doBezier || doSpline) && !hasNormal) { + // Bad usage. + *errorString = "Invalid flags - tess requires normal."; + return false; + } bool hasColorTess = id.Bit(VS_BIT_HAS_COLOR_TESS); bool hasTexcoordTess = id.Bit(VS_BIT_HAS_TEXCOORD_TESS); bool hasNormalTess = id.Bit(VS_BIT_HAS_NORMAL_TESS); diff --git a/GPU/Vulkan/VertexShaderGeneratorVulkan.cpp b/GPU/Vulkan/VertexShaderGeneratorVulkan.cpp index 9f0135b896..03b9ade092 100644 --- a/GPU/Vulkan/VertexShaderGeneratorVulkan.cpp +++ b/GPU/Vulkan/VertexShaderGeneratorVulkan.cpp @@ -123,6 +123,13 @@ bool GenerateVertexShaderVulkanGLSL(const VShaderID &id, char *buffer, std::stri bool doBezier = id.Bit(VS_BIT_BEZIER) && !enableBones && useHWTransform; bool doSpline = id.Bit(VS_BIT_SPLINE) && !enableBones && useHWTransform; + + if ((doBezier || doSpline) && !hasNormal) { + // Bad usage. + *errorString = "Invalid flags - tess requires normal."; + return false; + } + bool hasColorTess = id.Bit(VS_BIT_HAS_COLOR_TESS); bool hasTexcoordTess = id.Bit(VS_BIT_HAS_TEXCOORD_TESS); bool hasNormalTess = id.Bit(VS_BIT_HAS_NORMAL_TESS); diff --git a/unittest/TestShaderGenerators.cpp b/unittest/TestShaderGenerators.cpp index 98af754f21..6693dc01ac 100644 --- a/unittest/TestShaderGenerators.cpp +++ b/unittest/TestShaderGenerators.cpp @@ -173,15 +173,15 @@ bool TestShaderGenerators() { } if (generateSuccess[0] != generateSuccess[1]) { - printf("mismatching success! %s %s\n", genErrorString[0].c_str(), genErrorString[1].c_str()); + printf("mismatching success! '%s' '%s'\n", genErrorString[0].c_str(), genErrorString[1].c_str()); printf("%s\n", buffer[0]); printf("%s\n", buffer[1]); - return 1; + return false; } if (generateSuccess[0] && strcmp(buffer[0], buffer[1])) { printf("mismatching shaders! a=glsl b=vulkan\n"); PrintDiff(buffer[0], buffer[1]); - return 1; + return false; } // Now that we have the strings ready for easy comparison (buffer,4 in the watch window), From 2977c56a120fe3fae475ea69860b2d3ab4b7a034 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Fri, 23 Oct 2020 22:40:51 +0200 Subject: [PATCH 097/275] Complete the vertex shader merge, deleting the Vulkan-specific vertex shader generator. --- CMakeLists.txt | 2 -- GPU/Common/ShaderCommon.h | 2 -- GPU/GPU.vcxproj | 2 -- GPU/GPU.vcxproj.filters | 6 ------ GPU/Vulkan/ShaderManagerVulkan.cpp | 11 ++++++++--- GPU/Vulkan/ShaderManagerVulkan.h | 2 +- GPU/Vulkan/VertexShaderGeneratorVulkan.h | 5 ----- android/jni/Android.mk | 1 - libretro/Makefile.common | 1 - unittest/TestShaderGenerators.cpp | 12 +++--------- 10 files changed, 12 insertions(+), 32 deletions(-) delete mode 100644 GPU/Vulkan/VertexShaderGeneratorVulkan.h diff --git a/CMakeLists.txt b/CMakeLists.txt index bd958b7090..adfad87ca3 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1278,8 +1278,6 @@ set(GPU_VULKAN GPU/Vulkan/TextureCacheVulkan.h GPU/Vulkan/TextureScalerVulkan.cpp GPU/Vulkan/TextureScalerVulkan.h - GPU/Vulkan/VertexShaderGeneratorVulkan.cpp - GPU/Vulkan/VertexShaderGeneratorVulkan.h GPU/Vulkan/VulkanUtil.cpp GPU/Vulkan/VulkanUtil.h ) diff --git a/GPU/Common/ShaderCommon.h b/GPU/Common/ShaderCommon.h index 4fc01fb715..0c6d8e53ad 100644 --- a/GPU/Common/ShaderCommon.h +++ b/GPU/Common/ShaderCommon.h @@ -31,8 +31,6 @@ enum ShaderLanguage { HLSL_DX9, HLSL_D3D11, HLSL_D3D11_LEVEL9, - - TEST_GLSL_VULKAN, }; enum DebugShaderType { diff --git a/GPU/GPU.vcxproj b/GPU/GPU.vcxproj index 90e56a8dbd..e63b0babdb 100644 --- a/GPU/GPU.vcxproj +++ b/GPU/GPU.vcxproj @@ -483,7 +483,6 @@ - @@ -674,7 +673,6 @@ - diff --git a/GPU/GPU.vcxproj.filters b/GPU/GPU.vcxproj.filters index daea75b1a3..4df5470e9b 100644 --- a/GPU/GPU.vcxproj.filters +++ b/GPU/GPU.vcxproj.filters @@ -171,9 +171,6 @@ Vulkan - - Vulkan - Vulkan @@ -431,9 +428,6 @@ Vulkan - - Vulkan - Vulkan diff --git a/GPU/Vulkan/ShaderManagerVulkan.cpp b/GPU/Vulkan/ShaderManagerVulkan.cpp index 2624db88e4..84909a4d8a 100644 --- a/GPU/Vulkan/ShaderManagerVulkan.cpp +++ b/GPU/Vulkan/ShaderManagerVulkan.cpp @@ -40,7 +40,7 @@ #include "GPU/Vulkan/DrawEngineVulkan.h" #include "GPU/Vulkan/FramebufferManagerVulkan.h" #include "GPU/GLES/FragmentShaderGeneratorGLES.h" -#include "GPU/Vulkan/VertexShaderGeneratorVulkan.h" +#include "GPU/GLES/VertexShaderGeneratorGLES.h" VulkanFragmentShader::VulkanFragmentShader(VulkanContext *vulkan, FShaderID id, const char *code) : vulkan_(vulkan), id_(id), failed_(false), module_(0) { @@ -265,7 +265,10 @@ void ShaderManagerVulkan::GetShaders(int prim, u32 vertType, VulkanVertexShader if (!vs) { // Vertex shader not in cache. Let's compile it. std::string genErrorString; - GenerateVertexShaderVulkanGLSL(VSID, codeBuffer_, &genErrorString); + uint64_t uniformMask = 0; // Not used + uint32_t attributeMask = 0; // Not used + bool success = GenerateVertexShaderGLSL(VSID, codeBuffer_, compat_, &attributeMask, &uniformMask, &genErrorString); + _assert_(success); vs = new VulkanVertexShader(vulkan_, VSID, codeBuffer_, useHWTransform); vsCache_.Insert(VSID, vs); } @@ -397,7 +400,9 @@ bool ShaderManagerVulkan::LoadCache(FILE *f) { } bool useHWTransform = id.Bit(VS_BIT_USE_HW_TRANSFORM); std::string genErrorString; - if (!GenerateVertexShaderVulkanGLSL(id, codeBuffer_, &genErrorString)) { + uint32_t attributeMask = 0; + uint64_t uniformMask = 0; + if (!GenerateVertexShaderGLSL(id, codeBuffer_, compat, &attributeMask, &uniformMask, &genErrorString)) { return false; } VulkanVertexShader *vs = new VulkanVertexShader(vulkan_, id, codeBuffer_, useHWTransform); diff --git a/GPU/Vulkan/ShaderManagerVulkan.h b/GPU/Vulkan/ShaderManagerVulkan.h index ddd2629422..874cd698dd 100644 --- a/GPU/Vulkan/ShaderManagerVulkan.h +++ b/GPU/Vulkan/ShaderManagerVulkan.h @@ -24,7 +24,7 @@ #include "Common/GPU/Vulkan/VulkanMemory.h" #include "GPU/Common/ShaderCommon.h" #include "GPU/Common/ShaderId.h" -#include "GPU/Vulkan/VertexShaderGeneratorVulkan.h" +#include "GPU/GLES/VertexShaderGeneratorGLES.h" #include "GPU/GLES/FragmentShaderGeneratorGLES.h" #include "GPU/Vulkan/VulkanUtil.h" #include "Common/Math/lin/matrix4x4.h" diff --git a/GPU/Vulkan/VertexShaderGeneratorVulkan.h b/GPU/Vulkan/VertexShaderGeneratorVulkan.h deleted file mode 100644 index 51f2b56d55..0000000000 --- a/GPU/Vulkan/VertexShaderGeneratorVulkan.h +++ /dev/null @@ -1,5 +0,0 @@ -#pragma once - -#include "GPU/Common/ShaderId.h" - -bool GenerateVertexShaderVulkanGLSL(const VShaderID &id, char *buffer, std::string *errorString); diff --git a/android/jni/Android.mk b/android/jni/Android.mk index 96f52d33ab..9a9bad4827 100644 --- a/android/jni/Android.mk +++ b/android/jni/Android.mk @@ -135,7 +135,6 @@ VULKAN_FILES := \ $(SRC)/GPU/Vulkan/TextureCacheVulkan.cpp \ $(SRC)/GPU/Vulkan/TextureScalerVulkan.cpp \ $(SRC)/GPU/Vulkan/DepalettizeShaderVulkan.cpp \ - $(SRC)/GPU/Vulkan/VertexShaderGeneratorVulkan.cpp \ $(SRC)/GPU/Vulkan/VulkanUtil.cpp \ $(SRC)/GPU/Vulkan/DebugVisVulkan.cpp #endif diff --git a/libretro/Makefile.common b/libretro/Makefile.common index 29e24d164c..db8dbcd34f 100644 --- a/libretro/Makefile.common +++ b/libretro/Makefile.common @@ -647,7 +647,6 @@ SOURCES_CXX += \ $(GPUDIR)/Vulkan/StencilBufferVulkan.cpp \ $(GPUDIR)/Vulkan/TextureCacheVulkan.cpp \ $(GPUDIR)/Vulkan/TextureScalerVulkan.cpp \ - $(GPUDIR)/Vulkan/VertexShaderGeneratorVulkan.cpp \ $(GPUDIR)/Vulkan/VulkanUtil.cpp \ $(LIBRETRODIR)/LibretroVulkanContext.cpp \ $(LIBRETRODIR)/libretro_vulkan.cpp diff --git a/unittest/TestShaderGenerators.cpp b/unittest/TestShaderGenerators.cpp index 6693dc01ac..29e9b98c87 100644 --- a/unittest/TestShaderGenerators.cpp +++ b/unittest/TestShaderGenerators.cpp @@ -11,7 +11,6 @@ #include "GPU/Directx9/FragmentShaderGeneratorHLSL.h" #include "GPU/GLES/FragmentShaderGeneratorGLES.h" -#include "GPU/Vulkan/VertexShaderGeneratorVulkan.h" #include "GPU/Directx9/VertexShaderGeneratorHLSL.h" #include "GPU/GLES/VertexShaderGeneratorGLES.h" @@ -41,8 +40,6 @@ bool GenerateFShader(FShaderID id, char *buffer, ShaderLanguage lang, std::strin case ShaderLanguage::GLSL_300: // TODO: Need a device - except that maybe glslang could be used to verify these .... return false; - case ShaderLanguage::TEST_GLSL_VULKAN: - return false; default: return false; } @@ -58,8 +55,6 @@ bool GenerateVShader(VShaderID id, char *buffer, ShaderLanguage lang, std::strin return false; // return DX9::GenerateFragmentShaderHLSL(id, buffer, ShaderLanguage::HLSL_DX9); case ShaderLanguage::GLSL_VULKAN: - return GenerateVertexShaderVulkanGLSL(id, buffer, errorString); - case ShaderLanguage::TEST_GLSL_VULKAN: { GLSLShaderCompat compat{}; compat.SetupForVulkan(); @@ -95,8 +90,6 @@ bool TestCompileShader(const char *buffer, ShaderLanguage lang, bool vertex) { return false; case ShaderLanguage::GLSL_300: return false; - case ShaderLanguage::TEST_GLSL_VULKAN: - return true; default: return false; } @@ -135,7 +128,6 @@ bool TestShaderGenerators() { LoadD3DCompilerDynamic(); ShaderLanguage languages[] = { - ShaderLanguage::TEST_GLSL_VULKAN, ShaderLanguage::GLSL_VULKAN, ShaderLanguage::HLSL_D3D11, ShaderLanguage::GLSL_140, @@ -171,7 +163,8 @@ bool TestShaderGenerators() { printf("%s\n", genErrorString[j].c_str()); } } - + /* + // KEEPING FOR REUSE LATER: Defunct temporary test: Compare GLSL-in-Vulkan-mode vs Vulkan if (generateSuccess[0] != generateSuccess[1]) { printf("mismatching success! '%s' '%s'\n", genErrorString[0].c_str(), genErrorString[1].c_str()); printf("%s\n", buffer[0]); @@ -183,6 +176,7 @@ bool TestShaderGenerators() { PrintDiff(buffer[0], buffer[1]); return false; } + */ // Now that we have the strings ready for easy comparison (buffer,4 in the watch window), // let's try to compile them. From 148d3b72e5e73a6681b93d92e0e5155fc2f53c1a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Fri, 23 Oct 2020 23:30:02 +0200 Subject: [PATCH 098/275] Use splat3(x) liberally (converts to vec3(x) on GLES, vec3(x,x,x) on D3D) Prep for merging the HLSL and GLSL generators. --- GPU/Directx9/FragmentShaderGeneratorHLSL.cpp | 34 ++++++------- GPU/Directx9/VertexShaderGeneratorHLSL.cpp | 4 +- GPU/GLES/FragmentShaderGeneratorGLES.cpp | 53 +++++++++++--------- 3 files changed, 47 insertions(+), 44 deletions(-) diff --git a/GPU/Directx9/FragmentShaderGeneratorHLSL.cpp b/GPU/Directx9/FragmentShaderGeneratorHLSL.cpp index a48f1d17e9..88a0c6b289 100644 --- a/GPU/Directx9/FragmentShaderGeneratorHLSL.cpp +++ b/GPU/Directx9/FragmentShaderGeneratorHLSL.cpp @@ -372,15 +372,15 @@ bool GenerateFragmentShaderHLSL(const FShaderID &id, char *buffer, ShaderLanguag switch (replaceBlendFuncA) { case GE_SRCBLEND_DSTCOLOR: srcFactor = "ERROR"; break; case GE_SRCBLEND_INVDSTCOLOR: srcFactor = "ERROR"; break; - case GE_SRCBLEND_SRCALPHA: srcFactor = "float3(v.a, v.a, v.a)"; break; - case GE_SRCBLEND_INVSRCALPHA: srcFactor = "float3(1.0 - v.a, 1.0 - v.a, 1.0 - v.a)"; break; + case GE_SRCBLEND_SRCALPHA: srcFactor = "splat3(v.a)"; break; + case GE_SRCBLEND_INVSRCALPHA: srcFactor = "splat3(1.0 - v.a)"; break; case GE_SRCBLEND_DSTALPHA: srcFactor = "ERROR"; break; case GE_SRCBLEND_INVDSTALPHA: srcFactor = "ERROR"; break; - case GE_SRCBLEND_DOUBLESRCALPHA: srcFactor = "float3(v.a * 2.0, v.a * 2.0, v.a * 2.0)"; break; - case GE_SRCBLEND_DOUBLEINVSRCALPHA: srcFactor = "float3(1.0 - v.a * 2.0, 1.0 - v.a * 2.0, 1.0 - v.a * 2.0)"; break; + case GE_SRCBLEND_DOUBLESRCALPHA: srcFactor = "splat3(v.a * 2.0)"; break; + case GE_SRCBLEND_DOUBLEINVSRCALPHA: srcFactor = "splat3(1.0 - v.a * 2.0)"; break; // PRE_SRC for REPLACE_BLEND_PRE_SRC_2X_ALPHA means "double the src." // It's close to the same, but clamping can still be an issue. - case GE_SRCBLEND_DOUBLEDSTALPHA: srcFactor = "float3(2.0, 2.0, 2.0)"; break; + case GE_SRCBLEND_DOUBLEDSTALPHA: srcFactor = "splat3(2.0)"; break; case GE_SRCBLEND_DOUBLEINVDSTALPHA: srcFactor = "ERROR"; break; case GE_SRCBLEND_FIXA: srcFactor = "u_blendFixA"; break; default: srcFactor = "u_blendFixA"; break; @@ -401,29 +401,29 @@ bool GenerateFragmentShaderHLSL(const FShaderID &id, char *buffer, ShaderLanguag switch (replaceBlendFuncA) { case GE_SRCBLEND_DSTCOLOR: srcFactor = "destColor.rgb"; break; - case GE_SRCBLEND_INVDSTCOLOR: srcFactor = "(float3(1.0, 1.0, 1.0) - destColor.rgb)"; break; + case GE_SRCBLEND_INVDSTCOLOR: srcFactor = "(splat3(1.0) - destColor.rgb)"; break; case GE_SRCBLEND_SRCALPHA: srcFactor = "v.aaa"; break; - case GE_SRCBLEND_INVSRCALPHA: srcFactor = "float3(1.0, 1.0, 1.0) - v.aaa"; break; + case GE_SRCBLEND_INVSRCALPHA: srcFactor = "splat3(1.0) - v.aaa"; break; case GE_SRCBLEND_DSTALPHA: srcFactor = "float3(destColor.aaa)"; break; - case GE_SRCBLEND_INVDSTALPHA: srcFactor = "float3(1.0, 1.0, 1.0) - destColor.aaa"; break; + case GE_SRCBLEND_INVDSTALPHA: srcFactor = "splat3(1.0) - destColor.aaa"; break; case GE_SRCBLEND_DOUBLESRCALPHA: srcFactor = "v.aaa * 2.0"; break; - case GE_SRCBLEND_DOUBLEINVSRCALPHA: srcFactor = "float3(1.0, 1.0, 1.0) - v.aaa * 2.0"; break; + case GE_SRCBLEND_DOUBLEINVSRCALPHA: srcFactor = "splat3(1.0) - v.aaa * 2.0"; break; case GE_SRCBLEND_DOUBLEDSTALPHA: srcFactor = "destColor.aaa * 2.0"; break; - case GE_SRCBLEND_DOUBLEINVDSTALPHA: srcFactor = "float3(1.0, 1.0, 1.0) - destColor.aaa * 2.0"; break; + case GE_SRCBLEND_DOUBLEINVDSTALPHA: srcFactor = "splat3(1.0) - destColor.aaa * 2.0"; break; case GE_SRCBLEND_FIXA: srcFactor = "u_blendFixA"; break; default: srcFactor = "u_blendFixA"; break; } switch (replaceBlendFuncB) { case GE_DSTBLEND_SRCCOLOR: dstFactor = "v.rgb"; break; - case GE_DSTBLEND_INVSRCCOLOR: dstFactor = "(float3(1.0, 1.0, 1.0) - v.rgb)"; break; + case GE_DSTBLEND_INVSRCCOLOR: dstFactor = "(splat3(1.0) - v.rgb)"; break; case GE_DSTBLEND_SRCALPHA: dstFactor = "v.aaa"; break; - case GE_DSTBLEND_INVSRCALPHA: dstFactor = "float3(1.0, 1.0, 1.0) - v.aaa"; break; + case GE_DSTBLEND_INVSRCALPHA: dstFactor = "splat3(1.0) - v.aaa"; break; case GE_DSTBLEND_DSTALPHA: dstFactor = "destColor.aaa"; break; - case GE_DSTBLEND_INVDSTALPHA: dstFactor = "float3(1.0, 1.0, 1.0) - destColor.aaa"; break; + case GE_DSTBLEND_INVDSTALPHA: dstFactor = "splat3(1.0) - destColor.aaa"; break; case GE_DSTBLEND_DOUBLESRCALPHA: dstFactor = "v.aaa * 2.0"; break; - case GE_DSTBLEND_DOUBLEINVSRCALPHA: dstFactor = "float3(1.0, 1.0, 1.0) - v.aaa * 2.0"; break; + case GE_DSTBLEND_DOUBLEINVSRCALPHA: dstFactor = "splat3(1.0) - v.aaa * 2.0"; break; case GE_DSTBLEND_DOUBLEDSTALPHA: dstFactor = "destColor.aaa * 2.0"; break; - case GE_DSTBLEND_DOUBLEINVDSTALPHA: dstFactor = "float3(1.0, 1.0, 1.0) - destColor.aaa * 2.0"; break; + case GE_DSTBLEND_DOUBLEINVDSTALPHA: dstFactor = "splat3(1.0) - destColor.aaa * 2.0"; break; case GE_DSTBLEND_FIXB: dstFactor = "u_blendFixB"; break; default: dstFactor = "u_blendFixB"; break; } @@ -512,10 +512,10 @@ bool GenerateFragmentShaderHLSL(const FShaderID &id, char *buffer, ShaderLanguag LogicOpReplaceType replaceLogicOpType = (LogicOpReplaceType)id.Bits(FS_BIT_REPLACE_LOGIC_OP_TYPE, 2); switch (replaceLogicOpType) { case LOGICOPTYPE_ONE: - WRITE(p, " v.rgb = float3(1.0, 1.0, 1.0);\n"); + WRITE(p, " v.rgb = splat3(1.0);\n"); break; case LOGICOPTYPE_INVERT: - WRITE(p, " v.rgb = float3(1.0, 1.0, 1.0) - v.rgb;\n"); + WRITE(p, " v.rgb = splat3(1.0) - v.rgb;\n"); break; case LOGICOPTYPE_NORMAL: break; diff --git a/GPU/Directx9/VertexShaderGeneratorHLSL.cpp b/GPU/Directx9/VertexShaderGeneratorHLSL.cpp index 4279290ed0..8425b16f5a 100644 --- a/GPU/Directx9/VertexShaderGeneratorHLSL.cpp +++ b/GPU/Directx9/VertexShaderGeneratorHLSL.cpp @@ -636,7 +636,7 @@ bool GenerateVertexShaderHLSL(const VShaderID &id, char *buffer, ShaderLanguage WRITE(p, " Out.v_color0 = u_matambientalpha;\n"); } if (lmode) - WRITE(p, " Out.v_color1 = float3(0, 0, 0);\n"); + WRITE(p, " Out.v_color1 = splat3(0.0);\n"); } // Step 3: UV generation @@ -651,7 +651,7 @@ bool GenerateVertexShaderHLSL(const VShaderID &id, char *buffer, ShaderLanguage else WRITE(p, " Out.v_texcoord = float3(In.texcoord.xy * u_uvscaleoffset.xy, 0.0);\n"); } else { - WRITE(p, " Out.v_texcoord = float3(0.0, 0.0, 0.0);\n"); + WRITE(p, " Out.v_texcoord = splat3(0.0);\n"); } } else { if (hasTexcoord) { diff --git a/GPU/GLES/FragmentShaderGeneratorGLES.cpp b/GPU/GLES/FragmentShaderGeneratorGLES.cpp index 391dd950bd..fb6215e5bc 100644 --- a/GPU/GLES/FragmentShaderGeneratorGLES.cpp +++ b/GPU/GLES/FragmentShaderGeneratorGLES.cpp @@ -62,6 +62,9 @@ bool GenerateFragmentShaderGLSL(const FShaderID &id, char *buffer, const GLSLSha if (compat.vulkan) { WRITE(p, "%s", vulkan_glsl_preamble); + WRITE(p, "#define lowp\n"); + WRITE(p, "#define mediump\n"); + WRITE(p, "#define highp\n"); } else { WRITE(p, "#version %d%s\n", compat.glslVersionNumber, compat.gles ? " es" : ""); @@ -621,15 +624,15 @@ bool GenerateFragmentShaderGLSL(const FShaderID &id, char *buffer, const GLSLSha switch (replaceBlendFuncA) { case GE_SRCBLEND_DSTCOLOR: srcFactor = "ERROR"; break; case GE_SRCBLEND_INVDSTCOLOR: srcFactor = "ERROR"; break; - case GE_SRCBLEND_SRCALPHA: srcFactor = "vec3(v.a)"; break; - case GE_SRCBLEND_INVSRCALPHA: srcFactor = "vec3(1.0 - v.a)"; break; + case GE_SRCBLEND_SRCALPHA: srcFactor = "splat3(v.a)"; break; + case GE_SRCBLEND_INVSRCALPHA: srcFactor = "splat3(1.0 - v.a)"; break; case GE_SRCBLEND_DSTALPHA: srcFactor = "ERROR"; break; case GE_SRCBLEND_INVDSTALPHA: srcFactor = "ERROR"; break; - case GE_SRCBLEND_DOUBLESRCALPHA: srcFactor = "vec3(v.a * 2.0)"; break; - case GE_SRCBLEND_DOUBLEINVSRCALPHA: srcFactor = "vec3(1.0 - v.a * 2.0)"; break; + case GE_SRCBLEND_DOUBLESRCALPHA: srcFactor = "splat3(v.a * 2.0)"; break; + case GE_SRCBLEND_DOUBLEINVSRCALPHA: srcFactor = "splat3(1.0 - v.a * 2.0)"; break; // PRE_SRC for REPLACE_BLEND_PRE_SRC_2X_ALPHA means "double the src." // It's close to the same, but clamping can still be an issue. - case GE_SRCBLEND_DOUBLEDSTALPHA: srcFactor = "vec3(2.0)"; break; + case GE_SRCBLEND_DOUBLEDSTALPHA: srcFactor = "splat3(2.0)"; break; case GE_SRCBLEND_DOUBLEINVDSTALPHA: srcFactor = "ERROR"; break; case GE_SRCBLEND_FIXA: srcFactor = "u_blendFixA"; break; default: srcFactor = "u_blendFixA"; break; @@ -654,34 +657,34 @@ bool GenerateFragmentShaderGLSL(const FShaderID &id, char *buffer, const GLSLSha WRITE(p, " lowp vec4 destColor = %s(fbotex, ivec2(gl_FragCoord.x, gl_FragCoord.y), 0);\n", compat.texelFetch); } - const char *srcFactor = "vec3(1.0)"; - const char *dstFactor = "vec3(0.0)"; + const char *srcFactor = "splat3(1.0)"; + const char *dstFactor = "splat3(0.0)"; switch (replaceBlendFuncA) { case GE_SRCBLEND_DSTCOLOR: srcFactor = "destColor.rgb"; break; - case GE_SRCBLEND_INVDSTCOLOR: srcFactor = "(vec3(1.0) - destColor.rgb)"; break; - case GE_SRCBLEND_SRCALPHA: srcFactor = "vec3(v.a)"; break; - case GE_SRCBLEND_INVSRCALPHA: srcFactor = "vec3(1.0 - v.a)"; break; - case GE_SRCBLEND_DSTALPHA: srcFactor = "vec3(destColor.a)"; break; - case GE_SRCBLEND_INVDSTALPHA: srcFactor = "vec3(1.0 - destColor.a)"; break; - case GE_SRCBLEND_DOUBLESRCALPHA: srcFactor = "vec3(v.a * 2.0)"; break; - case GE_SRCBLEND_DOUBLEINVSRCALPHA: srcFactor = "vec3(1.0 - v.a * 2.0)"; break; - case GE_SRCBLEND_DOUBLEDSTALPHA: srcFactor = "vec3(destColor.a * 2.0)"; break; - case GE_SRCBLEND_DOUBLEINVDSTALPHA: srcFactor = "vec3(1.0 - destColor.a * 2.0)"; break; + case GE_SRCBLEND_INVDSTCOLOR: srcFactor = "(splat3(1.0) - destColor.rgb)"; break; + case GE_SRCBLEND_SRCALPHA: srcFactor = "splat3(v.a)"; break; + case GE_SRCBLEND_INVSRCALPHA: srcFactor = "splat3(1.0 - v.a)"; break; + case GE_SRCBLEND_DSTALPHA: srcFactor = "splat3(destColor.a)"; break; + case GE_SRCBLEND_INVDSTALPHA: srcFactor = "splat3(1.0 - destColor.a)"; break; + case GE_SRCBLEND_DOUBLESRCALPHA: srcFactor = "splat3(v.a * 2.0)"; break; + case GE_SRCBLEND_DOUBLEINVSRCALPHA: srcFactor = "splat3(1.0 - v.a * 2.0)"; break; + case GE_SRCBLEND_DOUBLEDSTALPHA: srcFactor = "splat3(destColor.a * 2.0)"; break; + case GE_SRCBLEND_DOUBLEINVDSTALPHA: srcFactor = "splat3(1.0 - destColor.a * 2.0)"; break; case GE_SRCBLEND_FIXA: srcFactor = "u_blendFixA"; break; default: srcFactor = "u_blendFixA"; break; } switch (replaceBlendFuncB) { case GE_DSTBLEND_SRCCOLOR: dstFactor = "v.rgb"; break; - case GE_DSTBLEND_INVSRCCOLOR: dstFactor = "(vec3(1.0) - v.rgb)"; break; - case GE_DSTBLEND_SRCALPHA: dstFactor = "vec3(v.a)"; break; - case GE_DSTBLEND_INVSRCALPHA: dstFactor = "vec3(1.0 - v.a)"; break; - case GE_DSTBLEND_DSTALPHA: dstFactor = "vec3(destColor.a)"; break; - case GE_DSTBLEND_INVDSTALPHA: dstFactor = "vec3(1.0 - destColor.a)"; break; - case GE_DSTBLEND_DOUBLESRCALPHA: dstFactor = "vec3(v.a * 2.0)"; break; - case GE_DSTBLEND_DOUBLEINVSRCALPHA: dstFactor = "vec3(1.0 - v.a * 2.0)"; break; - case GE_DSTBLEND_DOUBLEDSTALPHA: dstFactor = "vec3(destColor.a * 2.0)"; break; - case GE_DSTBLEND_DOUBLEINVDSTALPHA: dstFactor = "vec3(1.0 - destColor.a * 2.0)"; break; + case GE_DSTBLEND_INVSRCCOLOR: dstFactor = "(splat3(1.0) - v.rgb)"; break; + case GE_DSTBLEND_SRCALPHA: dstFactor = "splat3(v.a)"; break; + case GE_DSTBLEND_INVSRCALPHA: dstFactor = "splat3(1.0 - v.a)"; break; + case GE_DSTBLEND_DSTALPHA: dstFactor = "splat3(destColor.a)"; break; + case GE_DSTBLEND_INVDSTALPHA: dstFactor = "splat3(1.0 - destColor.a)"; break; + case GE_DSTBLEND_DOUBLESRCALPHA: dstFactor = "splat3(v.a * 2.0)"; break; + case GE_DSTBLEND_DOUBLEINVSRCALPHA: dstFactor = "splat3(1.0 - v.a * 2.0)"; break; + case GE_DSTBLEND_DOUBLEDSTALPHA: dstFactor = "splat3(destColor.a * 2.0)"; break; + case GE_DSTBLEND_DOUBLEINVDSTALPHA: dstFactor = "splat3(1.0 - destColor.a * 2.0)"; break; case GE_DSTBLEND_FIXB: dstFactor = "u_blendFixB"; break; default: dstFactor = "u_blendFixB"; break; } From f68e0fecd4f52b9836b8aa031248f2a1d3489bce Mon Sep 17 00:00:00 2001 From: nassau-tk <48179091+nassau-tk@users.noreply.github.com> Date: Mon, 26 Oct 2020 17:28:15 +0900 Subject: [PATCH 099/275] Change jpn0 font (#13588) * Update jpn0.pgf I fixed manually all of "JIS Kanji-Level1" (2946character). It's working like same as Real PSP jpn0.pgf font. So,I finished work that modify for jpn0.pgf * update jpn0.pgf I fixed manually all of "JIS Kanji-Level1" (2946character). It's working like same as Real PSP jpn0.pgf font. So,I finished work that modify for jpn0.pgf. Sorry, I use Github Desktop firsttime. How to use the push and the pull can't be understood right. If there is a mistake, please tell me. * Update jpn0.pgf --- assets/flash0/font/jpn0.pgf | Bin 1307540 -> 1307436 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/assets/flash0/font/jpn0.pgf b/assets/flash0/font/jpn0.pgf index 1553aecd86adcd6b37db4c2fe6a8b1b49a4dd7b7..3375c4be2c199ac0be73ba23a0a38a71c956a29f 100644 GIT binary patch literal 1307436 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%0DosY~VcY4=k*f$z)uI&PSvS=jx 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

f$uCi#P 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 +B^1Q@ylWtdFgObsYm~B?8$b10lz( z@j*U=m)zbYwWh_wkI$!fJHPwwaG0kgW`Mw-% znTrzXZ2^!&mP59ab%mPsu@f#Y1@^wKtnq6KQym)JSaAD%8h-|thOilTq7XCf{enE? z&q;k(ZhmZu1)c^f!U&=UDP(x{$QR2o?~Wn=_p~Y;Q-VKEmhDZK^;laR!zy1$*O};j z^fCSIZ$O(5Itk>AmObW}w)9YS_g|||mD&$0L&a)p;d}a#WwV}5_ifR3+&KP3!wAH* zwP|>9*XXR}Ql_}Z7)uqNRS%lZQH~r|kyYp#aQwD(X-CSDFVYR}sRy%MyQojl=s7*M zzE(`^ANN6zzVXyp$UKTwX48wasJ*iqyNf#0(FMVq@V2xgxrs`B+SvW`OX1+oZ^!X} zOh5f`C6WVY?iz%zNVsw$te}xdZ?G>JJ~x9&un9>F3>QHF!K4JwI|*vy9ldotO4{LR zfD{HTOtNcSYFfIR+HaG*#*V&OFpAb)w{TRAnOdYyKK-PF%4~+)E{=)~zuH7)T<6@k9^LG7=+1C`Dwbbj znOkl#^@SNgU>#F*YrhTR5Th;?kWj?``X?E$a!j}#{oqLap^4Zt3Rb}?(f?>K)0%Ia z?)jjGhOHE%?7<7uAFwKx;4x;HUzbArHKmn@1on+Xob0SGbn@0AZK5*Vc)mK^-aPW zVKu7vgjW#1bpD`if%E3xaVa~?SlSp$*OmuICVI~s=&d98wnBIN#&lj9$+s7K87UFW zcO4TNgUaDKUPV50+Ci-XTI3%0iSBe~P;ncH-Ao_-w^b&luvjcXg~3K%LLxNdTkWUutS=B z`?x(O?Y!tYV|c5_dL!5N$FEQCsM02C6VVxD@QL9*EWCECWk-UpXhz$%QFbOZ`GZp8UWbtZzas} zntdFc)h>O{EQ-x0D|S|zHV=CO-bPd>nXa~jkDdeh8zN=+b-d{O17MWF7z8FX2|cAN zAH-TE_0&jX_qzmF45&O=Gfbw?a)4;3NMTD{JC&xpDz`x~{6tM`hRlQ=KxF2dGqlU< z%Z24khk=fcC($wi@M#d%Mk^37!`egw8XuYHOnhe$tcqA}mu@8Q zMffa!Kfl;ZW~OSatS@qbfO&qK=VT#&ix6~g3vNvQI!V^glc1lsIb{9(VoE*Da){V% zo#-^VB&LRABK44CVGw3Gxu5Kyx6Q7~3)Io!fMkcs8rdHBos)eB-5q=GcbazxnbQVx z#|*l-Bp8K1#P4T4kz>H9a?l|OYijx6F#f&f9YWH|yMc^emDO?%*g)0T>2HhdcF$J(3A6PX_r)!JuQIdP^We(|sg2;g$-?OzkjA z%3@8bufL?Y6W9&A71#X>kzv#@Ln}j z_^T6rH{kWdewUaB^=5(wM6^A_XNj4_5e9hS3HdR?4wccB8bh{0HEWeN*1#IYMDiU~ z<3l(`>y13Szs2+&HO$|C3l~Ekp)s!8WII+(vkG+DD5YB~8@mg`C46|KH{nC+`Q(oN z+n`fMJHo*oH}mP~$1Z)`IR*>i0cLLz$VWc)fMf(+rm|vr=x^xOJdyM!^JAv2&G1Uc z9ao~o5UbP$4Z(^)2KG!=s%t`|l<7Sp8G(goI_rntL@$?ou|^oiG;cyd{;NdB1Lu7= z8T0Z8$_CC+Sq0#EW|?E?7|@o<-^zAx>l!Mcv+$eDX7iH)mYN^XzOW~OwM}m{8R@@+ zNU1@`yhv@$aI>{lw$JK~D4sAgUzVExq3-|R8mf1Nm~^X+a)2Xjp1SSio$GT>mna_8 zq}qaZ)v8kA988VIriPx(PkRxjlN;cIqWpww0O))O|YI`pirS(TnY>=Ld(@9JhGNylwY~9Mm#Dljaz3b$Jsn<&jP}FMBQPs_?(E?kTpp993y_`8zd5*(NNh7s^cd z(%=mi0I{&cCI9|+ShEG1vxY!PxKn2odsj!$@>KBARx0aZFtpfi(btQa&BkHT9On_E zEx6geR9GO_9LnQzlIY~MTJb?%N+FS4kWLC!@b6s2~7#8civ;hd&S1t$mE?+Xl9@Wrz*<^T<}kp# z%M=-%R8|n0moiTLXUhJ5WSV#bw+Z{i z#zLYeV(k=Y-sx>`@N0(q24EpU*xRb1i?N5vJPg=ho5uK+>ANp8Rc3cPnjIpuUhZx` zS^-MCg2uK1QlYo?28Hx>jf+av8*3lXR`9{~9K`!3{Cz7}o(nW5to|WW{a6r{;$XRX zAd}_+lvmOj+@b#X!hnRr`-r*m(WPQiU;z4O5*a&%%)yXkwd!)Jc3q5hw$HIDciHK` zch2(eu``SOCtq|b@A=iVL2)?=ezv6e%b*}s zzw&P{Wnz~u-%N!M*9SdtY@O}9SfKQr`=$VtO=sHkv*|Zo7Pj$Z_h6P(led2)4j~VV zws^eXVsHlsLzFNR9U^gxI~52r!kn}%mwdK0Q?+x<~-9Z`2 zWT24UdBhG-q1inj&_M$qBq`Xzp-S@F1&Ts-(5@&&Jwjs~GdIx)+k?dTGA}PxZ7mn? zN3`>>i(G2G#eX0M?}1#noa`W2xwu#T<4EeL8x$0M~-{VfYW>{9{xPz&)dcXEu3tk^^*5E@Cok@{a zCziM)HpD&(w=6U(q-|N{1ooKe>WrR;3V`ASM(0)NHBVRD2Z@tI-1bD z)TuFi*ser&4_?hI7Et_I(1l3oX(GA+X*=BM)UfB!E*S-C-Jmut{CY*TVD)?+ln)2ymex!eQXM2qrOG__L}oifW0uu_E{Q_9XAu!>HB=Y#mg` zOSexhwB68|wZ7o0GTW6A$B*<(P6c?QEBz#OIF%~i*l+W1?gpN3bzud%mS*UzeD^TzKXfMBC*A5R0IoF$`(J{E zXUh}+3qgFVGdN5YW@-#X3fx2s7-ESwg&ERP}bIH`Mq&82;^=eGJu6803Q)dW^5 zN>V|8xg;Gd82fg{x(OxM+W!5QXr`xVg)|~MupC8g$7t0WaDP9lgiXcTV z+BHboZW^oE?~~qUs!AKLbzOMW_E~jgbj0Sl*S4u^6`;QJqFEN-pgCBJa+}S5O^5}P z7{RwWmzQRyQdRlPy0MAcR}NHrt+%U0 z%}ng68AoLv4YwtvAlz70rahw_iMrN~E_!c<$Tgay3czfK!QMA@Q_+-OM7?-TS}ZFz z-DW(9YEsF;v;pPNeZ)m~t`MCp{N=8Py_)|*e4%+W3Z(Hrxt$Gs)k;!77;s+0Hde>j$9}(H+XhU-hDseX3c~XOTBA zIwWlx-XQkzkrYl6i|uFYd{W(1uxk@5B}g1G6^!8aLbFZM-!uY!CRGP_=|FrHA1iqs zGg-qeSCifaD?q5G(|pJ$3P98v+W!0utSF;bM~?ihfZ03uSPCjqZb z9#muC&!kxb0VWe!{{m%9RoqQ-L@xzTGb3YV^G_YG1Oe&ghml@k8>e0fRJg;FOzsan z+1^Kj>Xml28qPUtCQ1DIAhB5xW8@TB`Fuw*EIV7-o!4A+%VfkII-`5v?!4!*OXx4N z_$n$uF&qS^T&W4Y?fw41a_thl%O~@=^YT6Vw|h(&`nnyQFdr z7)w3MSdLl|g01)xS$tbBturuS4az3@aLtUP>Ip6}BGPy7b>edyorBb`bn*UT^6RX29R$tkT+Gbm z<8UsDyG9_P&c5|b&n(&%?wtvZ8>0$eMLs0y@&c1MESl&2W1EUajVIOTA6MT3XYQ&z zp@GgCZ+kWH`^yB(quC#DE&aeg?VCgCjsbJNEOi`KTv}6Ws}Kj$nRFhq*diaPwMWE( znnM~a6I*FMi<;MQZ+`pM_U-!IORs=V_y$- zjHo?U;%HH?UOhL*V)8Xa@uU#v$N~4gnXE*3HwTdGHVFAX{QySsSiaoWg?KrHI`F9?N(P zhU}&BxUwIKlOVmQ1WpU;tKHY~IBh2W_VW&%=Hv{i|@-sIlIk1NV7R+Bg~wq9?$ zYU(OhCk%_FxPNd>bKmflBTRH>6Sa7udeA#79-Q*6b$YGlNwcKvUNJmfgtr zOmVi2B<4$zUbEjLy~WHfah_S`QvJFAl4d01Mp5g1bDF1l-_Cl+d#_|Cd`UUP?_*XE z$vyZMwIcxxm{h8LHapZiXNvM&M@Twa%hd^OWl`-%wgDzvk6!b`ptLr{#g>W=7b=C9 zj0f6Z+AK1a6AhYJlJ6hanPZa;nt)W+bc|jfXp@|r=3(Y}mx*(TlC!LFll0H2{@^@! z=qoLHPkcFBVLIcWmJV)P6Dzm9XL{Q-c`J1$)#Cqj-&xgDbjcvh9oBP_?Lx(oTRMCo z0YPDD-LUGjNagj^v<-2MOuf(}dJ|l2uPJb-9HHSwT;4FUZK!XO&iSA=?n%>t)NxP+D4Ja3Nn!nNh zC4RjD!Hfd-#p)71R4A7FmlZj??z zHBZk<&l@zWB_`D*bsW$>O`Bz>bvl{ohqP`k12Yu%gmjqL;dh$)Igy?!h{;E0P5 z4qR@>drmAM(Zj7n#(PS*P;AJqW4@9YQ z(os&?`JwNs?@dY3xnr811JDkI#@MzRND82eq`N7Q2u5wF9KAD%-U43aAlZKl)!B;Z zRA>7hj)~6oHUZH^Ew>^}dPYy)~~A}|1&Mge3SYCs9Xb!Bvk@VPQNmp}6WADqf}&)|C&VHkEo zZz0z37jpd}M^U|xbr4ge8ABWJAH92q%I-!%LxGD59y1L#dOt9MohL?(_n*=SDI_h@ zLg&NLnaY2j}cFAOWHK zM!NI>=#T6Jdf!Z0@MUz9Mc;3~SI))%h1AfgfC{9RjZVh&=*BS=ZoblN{BdaqCW z$197q6sx8(@2FL$w?LaAPhyi}Gj75cJmhIe%z$zN$KMYD|N0RF%pz(B0+zuNXK<$; zT%Mr1y}BM@%D~xxvd9=h2Q>Q{nC|Y#1OsXZM))Ri9R=F%&ePWk60sAQd*8~E4vu1} z$j%~YJkZ}1I(9CBFzW0W`vph6xS2|JR2J_o=RZT}Ii53bi~AC4x>%D4ifV}(ZD0jp zRZ+7o2?Ih2IXKz|y_Jxi=9N&62k6<7Sbad(L6@MAk@fmTdNRB)HY*UN7hCCrE^12) zjVV65)@Q(*S;{Pn0Kg;yn6SuqGCF8NUkjl!_ zjCY)L6Z&M$smHR+i|>a@nqSle9)?!lHyy1Oixq!|e=LQyMKb2@*g){op+ zK`h51CU6FAOy?34U=9a0(tv>2!vqIi)8IV}_$>cegB}dSR?vdSAb}U!G}+HYZ>O&3 zKzz65&e_Cf54 zKW?a5z)`(#XGcc_UJE+1k!2mMNwyhr8vI43Ou-RcHNrk{kY<%8xOqPN+<489A6Zl$ z$MZHa7a;aKiA`v-)#{H1PRj8QDF*|5C|A=BgiMU~9Z4XkVD;1T5fL3pM2i}51bp`d z(h?zR{*=Pc!+vH(^HT`1CSC^07JXbZ0+2uSmE{`gYV0~StK4eguUUX{{3}(nEZe-# zz>HX_`z-YL>51M*VerDH@`IP6=*?&$d12J2lGV!g^6&UDS-ES3TGhur``*nI(pyw{H=F;YTri zv^jYAnBs1>?H?XygW?8t&G+Hi^Q3UjH8lYpQptbxfe$^}%Dq!A1Y0UZ*yT+?qteG! zIdu;qvDq;tEWJ^0RdDcU9`JTdpqF<~QqAk#vc3CBo%cg4mZn-mY(YGK{sVY+Qs+Jl zEu4&MAjkgoPXU^o#MukZNQGtEd8A^zv~iRZygT%ZgF?d_&kPJDI=g`}cLXQ7M?0_0 zFvI1a!J^}FjrRw;a;9k}^Tv>gbXseDiL;$PK%cUnGTYjheyL%l@28)YPED_?AL}0Z z@EAdXo}9pioUbsX>9L7|vTdU(-HJLIAf69+4)%Y6euVvyet)=abw=+4-4$EZj^HkJ zA{yCOyFM^{n*?I{#@_EdNzG6DK{Fc8zO^%rGM4qAj$I zTYj*b{LPAjB>c_K@HajCK{3=pz0+bQfAn9aA=>Jj-R~eJf&ctBX9*<#K#O&wT(;Wp zA##5=DhfyqtQJ3I|Fsk$9z_f318o#mQZW>cM3XFBtW?h1zJ=h4{_iN8nsx|UodZaffm;GqcuNe0C`nPs9yA>*}w!jEx~Zwy%NM3J zKb~2H7H$o0ZTC70-?iQ%JlJnN@!f$zkn0QSthE+|`Pvbg=0D;lU~;O=&jAoG&oe@ z&Z?fnN6Oq;q5Ju^2ZXBN-jV#(V%>ID|HbY_mlMS?u`=%ozxr-As>L0u8&hxiK09kw z27<={jxZ?huHnzjMiB?hdcyXE`~ul?H!6xqZlBb|&qGZ-Fd_2&?2L~;STaJe!U_?j zk!F+oL3%|IUFHp|Rx3@a$v(wOlL8qKK0F*9#XW$V&DQx^E9sqg)>ZSa)wS-Ut|TPv z-21H-7M(pe)`NTkCAM1RcKXKt`~nC%YBtKAx>fCTiy32ID0HjANwgdZ3FY6=N2bc; z?$#Nq4endWGli6255g(b!e9odw}Nj2eGDlGeEff82p{cHmX32&8>MnF(b1H0EnWCZ zF+1BE&Y&_{r@CK?KIlH{%JH5Ut==*yg6r-X2JncN46H+k2*7e)-w~ZC=Bi|9P6R)jCWAY^i&R?YaLG!Y4v)U2PFER2`^Z zMsvgO>aAK_#n-{oNK3U36|OMt8HjLwszh_x?l-7C%1X_(N*`6HtTKAHw5zI++!2QZ zp}N`;gqLApN=y7(5-~vcxPv>#2vlya z1l9yxi^QELLzQf;oOj%^Sw$nu}`swFtwXDrwgAm&ADY$SzB z1kae*n3Z;jKEOtBO1OY;cy73`Qcdj)G-#cxqZ39AUbD$)Z{J1F17L?n9d$z4*^YE+ zj<}Zdw+z!}gUiL4{c51>?l8W4u9$ed)}@`rmk-Nwmp9(;?mEo$dkojcGsiire|hHL zYyik2vH^ne4KUfI=#3~Bn?Y^HU zB}Qef1IZWGJH!WB?;%v0fVByWyUI#l%+(M%r1}IeoR|b46rlB`rYmjqc2?9a4OGugWL-%=Bl03P1du$8ukWK1hi;$U$CZ#TMZgW=Cds*%h51{1C`T^L4Fn!hMPo z2g9oARm6T@M`Qsoal}{7BliS-0A!jhhdz$WMXP)_IAajbkuMC+=XB}R_x0V{Aqu9UP z*x3z=s*xHN%m$2UpVMsYb$G(h8W2r&m_oKxL+ zplkWH7SzO9px)uC*5!=8pt}F7S<_wZ5oeDW8T?o|A2d)8P^G2#%hYV3M)S%R-6#?_crNeAwvf;x zC%6dw%9CHp;*&<^i91y>?tVN|7JjnvoFwdw?he0PeMS802BGOptApTixCBTSFe;Fk6qKx+xfj*piO?t@N5Xd}IWBc^yz$LozD3UH4?mA{k9Xi z23wBU?8Js>AbU5PtRKbRDp}aS$;dWhg~fnz!03l&z@blNb{SQN9ZXirMDIyQV$G>w z>oAZ{8>p{*^RwM6Oq{q{L~&Gp4i>pFHkwq3aN4z4iOxuK3ZRUWe-7TADgL|n>91kP zJQ1(OpY$7DPE>cdvwOd0e~TeaHs5}IF%m;gS!Iwn59~U8QKU(ND0WMY#qQ9tDr~J= z>NVH|z+D}1E=@*~LTlknmO{8`ay>ZWjBm!}c$_>(U23ik@Er^UHbL1zf@8l*;8nD6 zY&F++j`7ETp|7Zry@E6!ZGc!e3%7zTqhMRE9EYt3FV0Hr(7v9Vah=5U8D;3DLX2W7 zR5H8t8vp>_3ZC-V*exv9 zuV20aJ{%X9J4{+Cx~$Q|I>%u#a?~zQE*NC8|K@UsgPZ-ogJI9DC0{6Ty0@J1;H+nk zXmoPnRZyE<^mPx)6O;ITN*jqQK^HIh4@g6%l$0LF6o;)Kr9fGDG#A3Sikt$y1}aIg z;5*72U6dwCcu$1|v{%g@p|+UvQhze*Vt#K`7V#>!)3?k+^S`C*)ZEj))D++TR_5zX#J zq2Igrs5uzsjV}j4Hy^qO_SPu3=ITN$f}ZOW^^zeeHUsok6Mm|0MhCr!y=+f-Vl&{cCSPm5t!=3$7eweBz^GM&lBohm)}tI z)!)c#kJR66Bsi=aahXPRmgOT%O;xt6E?bM_!`*y&WkgB)DNGO)%Ir!AYLJ+K(hfE2 z`8lAeGR88=uwf^s$B)9BBoK^$BoZ9LziXy4m`rNg4>uBcO*}v9PKj;y-gXOu)W1md z-`HmV$2sXq%X6#3|E^8v+n;hetLlT+yaE46e;o#%$B@En+I$<^yoftA*W6>|gFI&8* zgduXAS!qaPRT2{sesuA)Oxo~!R@0yWL%q0?%;{KSe-OQChQee@vw>vLLaso_tim4Wh+)8#PQqF>xc_i+-TTvC z%ZzQb2aeAtmOYg(zlJk`Xu#m1d!GrhG1v%&cm=qj2=;)5bG6R*{_}EGY_lE+{4IL# z^%2k-{rbHg*JZ`T4lN^N4DLxa@h1MHBwPL3WekvADR1%iIb?F^w7q(GMiDAw$4J;S zx9Qob88-GnmEcor+TH}Nbp6o!o@1lBx{`$p!4(g{Y>v(1mn31KCC1ihp>oaz4XX7N z*Y*9i@xs$rs$%4Esihl0w~oyd2wg5 zv@CZ&V{pftnN^Ur+ELzo4@!~mvgg{?nfw>?pmX0+n4p1o=L!cg8R-^lxZOh;Fs4@N zVzvW=Hm|3q{l$8Z$oFogGJB}9A(}bN>An3L$UR(-@3#(Or=3`;<~pDmAn)mRuoR*q z|7Q0-^2SIU1EL1tCoI7SwX&TaG4-`s3>?8JD1L$x(q6dVN*1Km9s1N_*X--r3$M_` zKd}UH9_FnU<1!0}^|1Cg*Gwk!acrrY?8MTgwVY6(It*2cMGwtME*Da4g<7NAH2dyy zxDjHBax5;cCR&w)UtWUls$65}Z4Jy&?XBSL{@5*4PcxY~((oH*sa3QPHw8HD$LQz5 ziAT5-i4D;JN=H@P_UA!tNz~05bh>rOMn50?H!}S6t~MIkh)K7z-S0U$_vai~u+Lka zT`%tqQIr1}yqoNete~ZDcRU2_%xWDd3i)6$mL&^>S&f63T|ff!k$kvlfS#;2a&Ar6 zJ;b#2YM#U1iO~Vv*LsYHrLAJzCiDqY0Swko091%O$d%bLnhGCqrj)A<;1xp;$XMSg z@}bmtvs*FISQMr*zYJa;<_;AZz5Yt(JtLkU*^;GT*uBCkCq**cQhlAbV=LnenpJ=q z%KYRvj=o9u1sM;y{W4i>Mq!hzgoT>85x~L=_s3BKhVY5en}7!|VNsiA%BgXH#!Zjilzu*qnTgg&BepcoW-1S9egxtPFq`Fy#ppP= zi|MzfI=%*VxCa(L8$QJv3~R9Z2zx|`tUP!iSb0BSG*Q}wmDfhH-DEwINyd8o&8P9) zGjL5=1gIJUZ1Ai3*(h<)0pAH38hxg3|MRAA{wZL3 z={8bhOJY~?1%vf2Z$UmpI^0dTv54@MJ08Uj1k;bs0<jVs31>yHi;h&<0OWr%L>=ZBd7Q#t1OA_ZsSkSMWcM^>)oBOxJM? z5%f|M;UXG>p;ok3#s%P5*zoe$SH(Tz-6=u})>3p4-!T+goqK;;WE5ooTz^wJI;X_8 zqKqiKMbhr~DLmnXEKYEs@RN@Id%07y)X?Ff(dmIx)^RY*+9ru9u_uIFCi5QH^G^|b z{>D)USp%8)Sq_l5;s0SlDI>F?HH)oRuQ{XI1bGDDm8jC|&MZLg6IhXB2zTr?z#tiSPdH3hO|?BjaTkK`4%K#T6Pr?={wmrc+h5Sf$U!)W z-tV(>RNO&_+JHP@yKLM;43ZV?3~ckh;9^H4pTlDy53%tT?Dv`V@-0R8~P6Tf(tKNIoFo~a+WZMJO!2zYdc{k|sbU<78>ixD-X}|y2luPtyr8B^)ea%69ulInNcGTHL=mO=zW@<1`e0D& zXIBrtVI|5c(H-f!znXKu*YhZbX#VBZCd4jn-I=w19EF!CljKlNG<-q*r`=(vGj9gp zeLPxWZ}d=Cno}BkCf8N_Ylcxiq)&YuOYEdkD&s8%(3(0UYjChTGCn`em7W)f9oc_OTh1#7FcBswtk*68L+XcYr33{R6hX#?vGMgkiw?C9>>jpYA;1P$#T`mPEx8hiKo!eCvZ>ZdP@C6g(K3X zO6)Dg?PZuw{e#&;As zk}cg3-^aiCfaarZhzt__1~wLGI$REVtTD8t(Bzi(W%-*MT$;nH#2gnH~I)hl&f>{w$7jm{W_59^T$+}g^A?9wk6)sbZy1Y>j4s*!RKgw(I=$my7avVP% zOg$72rkej1OuZ`GRl;j(<>q-y#H>v3`#!o37*XME$waNRGQG9I=ifJecQ3O1nwNW5 zqS~mtwNhz--h#Q$#wv-uFQuUU1nvx|W|T1mUF~ncCReRO1e(Z+Ut-=gV&1&YTnj0u zu3=#;5oJb3O&)Z!Jm~zM+Q1(8r0-zJExaBxLIf5Pme6-Qb6H_J12L-g=ds$!;ux0& z00qF-eZf=Hg#i+WWJ?9}Cr*zv$r9&Ww~MJGYtdGXwRpaw>0#nb6J9K`H4R928p)j~ zAWwfYuVfWrCW&1$vMmAB$5^rvj)ZVvZy?V!6$=;9Ao;}|nmP=cE~zN63zDIc6PA@j zQba*;V-Pshg~S?o?F1q1rMOJkPjDf>N-L-fvpu7D^k({;>m0hFXN^^n(Rq(|kAup1XvA(s`GJ6me!k`Y*^NKX=vd3Q zPvbl8b8p*U>fHV`N6qV<9DMFazv47CxsrZk_H=rsK~?p*Fr17DY&-b##I{Q#`vLw1 z!Y_p+(m{+%!?hMHQIjkdgsZZRsSRs~;oge7H-A$8*I?_DuE25P{c-roOCVk!Tk8>Z ztb~7%d73cs>*K36`G48rfj zUzz{9`mZozS-N}3dpJUH+JPA3Ab+}k>YoehweqZ3D(Gzvud(R=RaVFTLPelXz^~#1 zYJVw@BA)XEzpfm=0|kTp)ZdZ`F~$?bhr zYPnaA<)EYAP}HrX9bne5*zXXTY={=oxjlbGHhLt<`*cn@6^J~EOvNL;lhw+_=@dAi z<8txqvQL(34jx3q800pw2s_X{Xg|`7I`~q`iJENK65c64htYe<-n!$?2vR!stW`bm zC10}p)7{zp>S9x=W1;TFwfm??CqPT74(>yasd-&3e{xeT-?`o*E`dK6$J32lKNi>O zz;Y}h2B?|57;8DKee%f}dTazyYx4qW;U@xbrXb1zfS_!W(^DYS8l^csnc`gb{lLzV zMDQ8hQ*;LOw*wng+cP(Nv!gj@zRdMO{`o?;6uD}m1DD&NcOYvytgCj|%^#c~mtSlo z*TcraMQhpG_$O!Raa`RfPWSCS(=qy$^(ksNdK^5kXbz#|k00bSYB=ICw3F~93h?`O z`4O)R-C^J-6Zvv<+@b$9o*2uUHj=kZtPk)Y`6q*{o@h9>zlBTlPPst_*44Tr1*M&w zT5}*qCPHNjS=ID(hdH{z_LfzocLau0g|{3@2xY>K$+$8dfJC`Cg2dpVSM#4U%TYOH zyt~tbf*k?E!zPl7l1~Ynl@XN+RhI6xx;){qva&k?3=^RuG+njRO?GN_io19B6k!r` zd(KGVIi{HtvY3*uadehG`fadDo87`C*;}7DtF(q$1oiNRE$eDQtD+e>HGO*QLF63n zW_#ZPm?@L#w?Vdj{zuLMOlv`^4YCyhX^2qr()TWFW2~Uhp}<5}1FS@JZoC?j=s>It zs8TpN-1BfTE49KFDuNV5B1mp$!tz9|>-8E`~{KLf| zv5D*cn-B_AJDyykrCXK21~!dj*moRi&B6Vszv^d^*IUIqa%_k$-HahnBZ^NE%m@j{ zXyW@BIa{bkT`${fA@M*47XqvKpR;ixrb{=I#A;xO+d`+pE#1us<6I1$D&XqB&*u0) zjIqS5wfw$y)rgf9^;=#oukW|z*eA8PK&|{9>3c&M8j_Tzkq6vJ6r>uay|@JJi^-kK zvq_pYVD^x4Fk{Fkvt?mBZII;WZOQa)A`i^JFw(+;8=XLZIK-Z9kHL05`sN>26Fo)5 zqETp)r6V7lMn$Vsvtv@EVY3 z6zUrfZx0q~JCG>W26iSIgAPS^**mmRx;xdvdCwb}cjp}`=RisRXg#5XQx87Zfbt%h zBL{p6-_6H;5MbV6POS>Gb5#3asZuN^!<_K@81NYMs&U%;Ftu3c?erEC%`#O6^oc*TfMgOAVXPqy!O|p^b$1eM=W)bx<3nY#0rw}G8#m5{ z9H@b4LagLS+<0S}4bX?=U($R6%wV-Q4=^sO_m9*>j{HjJ^~p_rzv~H3a^jb5=8xYm zb+l8xGwBnU7-hfRWM0~i#@7H0h!GDR+@jWmZhbtRYR@tXpA&q_&Fj>%0Y6mYX`9o9 zeN2LHODxeh{1);}J+;|hl!_EnCgEDJr0Pr- zYkOyFw%EU;SWNU4+@`ws*{R-I#z1xccs;`)qL77pT%?xwjzE=NXK?rXS(bpF0oyal z;lq}Bhs3Bz{&C}PFigh(6DbQKCyEdRDl>cWI5DOjoF6&ZJe;^0$aym+Q+};x#nrmT zsRvp?O@4VJ&EdR}A3_coK#Lh=d;JLi2J~Fhy|^a9EE4l>Ag43IrNt|n{YHRzf}z+= z!|^t{O`KWQfW)X>5-YDp_)nsuQ?ZPTK-AFprd@u6$OgeQWycFGn*P_hb1xvFV7D(Il_hF<7-+ z>>l!jFzI5Xh;y~7&YA?fxfiJmTc<)ZXm^fV^9{0O>ESdj=xM3mxl>k7m6}8%_RgsYauI13`w@L z;tNE0FFqf;e@R~=MlXkx=*1pj%J{AdJ$eb|8$xg`VmaSwSkW{UoV!Z{d`J^gdCo?} z6w_4HrPTu%jPC@R)TYIh(J?4Z>u@QNF@io?7movsBRTQ`_{k^s2h{-v351-9FhqAC z6q%G7brJK;?)^~x>MGP9=o-6bIhWh0RPBS!E6|EPi9eAhq%o(|Tx~R8_?mt_OFY_> zHZ_UeZUB@E@$mUG#3X;qIu>x9 zi1-oo5w%`*PQ*?{Zuy37pa!B!(uTt`1U=sL&i4)eP;c)pw3Yq^?KOp=bT(0t4L%J7 zHmq2b9&-K38?SVO6d!h<9}dM%A{3;?gB&;%7ZC5WU%zLofhR_tx{TvOpaPFC=dZYM z_x|qvh&RDevPryh#XwGPY>d!tFbe3(TaS*uZl&7h6^6bP)>2hQ=av5G4`{$(5ZeVz zB72!9{E860r{mbbPya(OuZ2x60y*iC*DIG!8ZNr)I@WrSLTN>>sC z;$Nrm5j~zD>qz|FxyDr*W`cJXP~1MMW)@SI<38#i>fYm7!k>PaKldccD*A!vgm5Gu zoJoAapX0tDHc9J-T5(yd*8XFla$7VN*PC-`P#!Uon9;kt>hSo&>fqifI6u22_V0TC zxwIG9Ro!U4`5G>QMg{m_%eHOZL9;TeiGRVX9C6iaUZg9-67Q(zO|vQLuriFtY2 zg8Vk!x)$8;57oxj$O#=11tBQ}_?WO2C8ri4?P<1}CX+ed7=+N)< zlS$cqh+aQ%r#?0TZ!W0A)D0Fl*x12bNfA?OJ^F1Mc|9;zEfpasS0c|1SbgMx@H%jc ztXS%sfsZWzM&7Ufjup{h*sBEJh}fWW;Tk9kfZJk-#Wl}D*4ub(FT4f=(oSe2>nG>w z1!hZ*rTpqv8TA+s`4lJQ!i;ESH@}3C3z#W1qhn+0T@nZq$5jnK_gFIWyb$aUDUD3e zt6BEud&*1co~EJvJDGvS6l^N&LDc)pYmQu-#G)RQV^Q!}LgX_&+NFhR#hWJ#7M32x zWIC7*=6F_L5GtelUSh^Lxt}J}#n0ddKJiRfYzcJa$+4*pPv5T<&{Xed!Q&#+ zF?zTOOV$-!>{2U=D~J9XAAQkGaL)=@kw#%R$?+NmxcnsRYk>D3Abg4jVSD^gNg34l z3k;z3nym2NQrlJWs#L-S6X|(_xdgwcHQN3xUL}njONZKmDz3Cg zN^(W$_UyY2ekt9}bUuPa-xzVddl2L!{8V`#ZXmJRAs`A)SJPWF(DVSnA=z~R0=y5Z z0|XM8O&I`A(7yzE%uIHu2ZiQP#}VpD_77fX*IwMo>~auMm4fmKzA`+;qVsD$qp`;>gGc*r+@JR%{9` z%u#IvNtG@qM@(V!VQBCTAtso_jl**rNIFAIzq}D4uu;Jq;h*n^8nJQ9^1 zaMa*?Kn>!hU4F&3`G||4P7#-0l`3q+rJbvEMzBUYkg@?arYtFddhV7b2URl@rwv3@ zfFpegs;DsbH-eYcYglhfzARS&QemOv?MUGGUm*4f>O=2+id^5PRwtNhk&N_1hT9%l zJ@n<$QFyvyw$NXI>(j-W0)Gv8Q()X#ezT1V1h1BwvRLmNE>V*-+kkkxs>Li1M+~>t zDCr%^5l{Y6Nvq2 zxkhX?c^_kSu3rw+#)!e0mcM~)Y zksp+U?I4OE#F@TJkgjrIXMNB3r!YXUjX$8sD^_8v6hv`=-B5kz#x+T@X)fB-RnuLf z)~r?%BI4)CJ;C20`R+c$u^G4zM8%qMF97tO@TIhiTBJ`AUR6YsFL_5a zHl>!N`%1r|Hk3}}q@``6LV5q3w8fs6wfV0ussJ_7&rAEl)xCRyOO<~PZa40gp6DFK zo&pf~aP~?=cCR8l@ayUgI_=bW|G*m+dx>99Fr9M#n~a1}xT%oGrUl~CBoB&kO$La# zH|fWUhWDqfO}jfhr~SsEary}?G4+U0%ANeo6{c6)e*5rP{=;H-_G2TypF86F-|OtH zy%T5Rsk#yThD33^NN|6@=n!Jhst9|5PFM_6 zM<@Ihk%`)X7i-Z$TYb=UG?;m4@9!DE+@6^&#tVxr*v@DKtfvb4~07gYaK z0jMyMym*Y&x|&D9&@;mB%jkhAgkts9a}(6`t~6?Q4dK{ZN^}T(W7($0#btvI;)-m8 z2$nw|(nr{vJ^N@hYeTffT3yXrutA_{J1B!C z0JP4vSYk7KCNxxk;9cFt?5&yGr##z}a%WJxS-SDnca))#O?D;4l8HCs^xXDfo)YW36yb!c?f=daOyPn$7w$J;& zU4Ja-+)-rDo$dDZ1XKLS*xr%0w_Jll@N1~t;5@o@xR_*N^=&3?Y-F{;xyCU#J2o|z z-9H);p0sOnMT-wp6;qe~PRs7F!gYHXSJo6(Al zW#FWa%dUe@BA2I1*ACc|nWVmzrwNvP4Ox6Er1iI@Kx+S``W{WNYFu0tW1(G*W=GQ? zo)xQD0a8>$Y)CV9E^q`f#D&N^fQl#Cw{U)KW?&&ImF^QBP>lZ0X;%;Y!jRwaStBE50Nw-H zUtvkujGg$X90R4Bv-~U3x4}Oix{1(Hh*O}UuzS@B4TwL^7Oqn9m}lEj2a%P4si_A_ zVmS(e@Jjp{P9m+_Vf#yR2iXu+fL0TH2$5F#3j=;{E^f0(!$Ddg5Qsz)0uTr}8p3UC z=s313JzC=%PL?3_&=jmMe2MHa(HsAdu{Qy1qD=qCnVF<1N1OBjdS;RyP)gfryB12J zO#wm9rhw~mHs$cUC`VdAS>xz=9-*sI@nu4yb90|I06`>8NE8yA&WLHEb;Si83 zlgZVlZSwoPlY+@;ZnKCiW_(XY^#3kHGNi^+f;+*N@nB~RozC+Ggi|mIIO#_vDbiw%T|2te$ zm-p31O~(ooy?oqP5~XLTDgIhVN7q=T+5O6;XiIsO+BqB~@MuW37W%yL zW}2Ydc|WKlX_rt3#scFaPad3T_52m?AH{W74nN$LBDp=EPU#8^4n1ycbY;qwNv;vn z`AI5{^xhTmv`|YtiRc!Ha~2v$BD;%|or@MK)2mIjg9NjdWNyG!3AUgIJ)xE>R@2VK zdTF9$(dpheI(!9w>7T}#Bf8NT?lZzBkejY_G@!D_-AX*aC|DN?Ng@_@^pAqXZJWML$rmAMa*+;__q9+1)uT!c7ujDfL8NRii2-1pcD6+167+f! zNIWSOLu#*MeQ1drnRA{I^C7GgE8!cI-Kx{n#UGC)Xo&z+dreDF!*8FY*dlEaR(Xc(hQjR>x;4Fon`l0V#>V<^oHC)kj9v_(jC4C9Qwwz*|pho2DW@8siO$kB}& z!I3Xl;>!|zY2UBy3jY0h`k4X4XEkqR<}i+ck0j`WG&QKUZN4)y1yp%gzwdj0h9#z5 z6`uur=Afvn-~>}q!>chYo23~n+?Fo)>*l!7qef-?*T+JmGVDtB#=HLFo9@jQJE6oC znA{<0Y&Va5HDyOzV=P)H8eQ&`T|eMEoN7yZlr`SYI+pSU7ll8xH!g%O>)CjJ5pS=v zWVa}*WKh_`k~@<`6O)q!+-*c=F*WGbm&s@I*+ykWfB;c+%G^%Z4C)m`1^EXpm2EQ) zQO^tv(J!?f>xwt7a(>`%qEZ(Mj5<~C^g5{0&iS3g&*Ub@dqSfSePx}BpV;q7LYLs-MAxmv56S6Uy@{`MRBJ}{X2?H?gZ%&GL2n3oaTgQd}L1|vb>ifHdhb9b{h zR*%Jxh7B50X4eBsC!wlpa9zp+$mYv9Kto!jB_VgmQyC`GL;MwJcZg$g)L3mdl_%HQ z0bD#ST-io%N+cdS9=UGRbU914KiDYm=|9qy-jC>zh#fZ7k%V6OL^nChA}Vba$V60S zoqvsdtisnjYfZ263RNdx8+6tnR4^;nggu58w9RsV`_Q(>f{*cW@5(*twcFS7g&N9# zZh$V7Y?S|5UO~ARchcP79GB2#%HCSr@i|Y|Y_x6XVFUgiYn9-vY$v+Jb)L2u_~P&w zSB!VLobw_d_AvYGXZ-9zAXo&cSi%%t3L{pphe|rN({!FEiBmK4o2RDP2a(JeqUEIH zDlR}QDJa09bhGCNRp6XCv zJMrBQBdL#Y5zgpEVdvtWnUa(VsO_F65pI03G1HkyDIpIG;uc~%A{z`DsJDAu6DBA= zR6!0h4BP58z)iflYZQvImQ&}8u72%)d&nM*Vyb;{s-vvF(7Y`)QYJOIIhiycJme3? zW%1~HQhB!M5^m0IW3r3p{jqm9&L>2ESH|MrfVDKQW=WyF6aH(4WE2 zwd|5y6wtpsz3`#m_co}W1~UKqF5dc{V>bNtgL%~ogq!ktIy9uU$fZ^t=O&_o_aY0h zuS)DeG)u6VD$x8Al-O-F(5EGBpq7SgXBQ09I5IXb6Wyn?#?e2yyq$%zkt z5NaP*ZMyK<1N9ncuuN!((>**h6wj~IhVz^OnS53#%h`L;aqR7lkDY9d@+KJ7bN<*1 zhpO^%g>_c<);jw{JlFF?{-O`;%>t|?xD}|(K{RVUBxMUtJYT=RqSgXylOp{As2;x3 z72_X(MkmB~WR%ObO&m^pqUG{W(6|F#0rUSNqte!;g_G+n7j`7lD5mY9*Pu$oxt@$Q z)w-q;aqc41g(Djue)gM5T%&r~+v#o3G4*(!8=xWL?~nLaTHbz*V4Q#%@#yMDxyRc2 zt9z_UHoonuE=yDCc)rNa<-a|{ zxI56h@W#<2$<9|Kor>A$N@-{FV6)jLXA^Sg%;b0sFg?WtUfDe7Zy|bjRbkt6C9Lsu|I3a84@f$M_BehmSxxIB zyk+=H3&3EdNR8c8XzX^U6wh7%_UB61pn!i1pW=L!T0WN+PK$ew^bUFxJ_qNf%&}Qh ziSuD2+c5|os+3|Q8tFj;%$lGqRC%d;Sd2X2i|soNRw+HGwOumFq&rbU3p{?%>6Mmo zLc3d3Is8UBD*Ntpx+TgX9?=D&<0ops7;1>(2d9W1EHpqju$Re^ zx${HuBj`hZxz5~u*-I|zfl~^sn5FLkmKu4>&gUt2L%PAHKP2q;&O-bNx^hRrL_rU{ zOAp?bviFKkFPBu5I7={)uE{q!Qc@JORi=8Z?gAiF=sc%)DoY@+hIQ;dFzAbs1B z*}y;E##}2le!qWtNozx$bAsgBH7dTqpdQb!GZ^azEWs=p&9bvBqAe4h<7llqO!p=& z2{)hWEnxrNmFfQB=*C3KB9Q#?=YV?y-gY0!IV3n7=Ra63e_%3cMb(`$d+*%jcKA z?upUQ3YKiovby_|*kxK1;N}pW+`e=;&{B~Rbel(yVIMa6NW|MpiM2MJEu;5nJ|hMc z1P^F~vZzZR{@vjoWjGBH&7s6*pigX)2yx=x?|TNkiKJ>&g?;&A7S05O4$z3ba}po# z)>!}PDmGpkDBpY2;bk^BX!$>1PqeX5UNiv4-VLAEU--f@2-qCC{7T12K4Z+fFL-)o zXtL$P2%qG2i&Wz_NmnmJmq)Rl)!R~O)u8wXU1$Q#Dhmyo>A$9TCZmLf9R4+^B=t95 zKyg@wq7r^m$Ko6AJLRC7Ja({050vr(bl97<4X}T?+V1p@*17cC`U1^Y_ptz2Jgn6c z5nfeb?x`2e@WX_H1Qc3a$W(MZ*(>`;!pM$kD8)eVHxBXNB)-0m;PZ=ocl28t1W^C` zSYa%Fn_v%+!NMpdDV+x}TF$o2>1(vufi0G1eg3V=V&p>}jX_>9(>?~vNuGgb7i_Uz z-oS*QAfKUNvArQNys6eXB@)vlJhx=5YcAortSnYz zd|}`ecV;)rzg~M`tN-SKp(LGDmbO+S=!Nx$wkHxbk>Yc$ErFLwE=J3X9{lqwhi|!e zSDTLhesXb-gab>?Wu0H)p5cu0^=eXphagrAvQOlOO6T8Y(ydYb2yQ0HJuncZ4a-a3 zj8dyX!dkxahAp6pI;AuYv3u1<^;7Y+A?3vt6zefji}a^C$@LY5EltuhO-mK7am<$9 z!G%hLl2u(4hQ>>@5H$5MbHtS-{eB=;(gbH7rG)#`{=E8W%jdlX;l*1t@l6m@aeS^T z`dP@E4Odz;q_&sDb2W(P1~|V1uN#&r^~BQx#Z;#C#xBt~eZ){Fxi9{^JDnN5DnIi| z6T($sA`GY_vh#sf8`(L*mdf#)p~x?c6$xWO9$_tuf%hb`7K}~3sIU+}44DTJFD7;t zdhKbP^XdF=P~d$1zCSxYUVJkEaXEd9KNErZ*Nn zeclnx&Ut%_Bbxi2;pqo5Q_$ZU(=nWNeioUI$9|lSN}C7E_`437bg>-u-()^Y#*_Jw zq{lNFsptCU%3-YY6>3|9M)89{T}XuoVo&rc&-id+tw~s-`;alXFAOygM&GcUU}s?G zl7m*u@4|<@L7b1#D++rq!YLuSlgTF{_1m4a zxPg7=8<((n|J~^s>5}!^O7#2AlKb944j#f51F{jf*cTXpUcbks$wj_N`O}IG>?mWtZQm*M=Vh}kDW9%F80= z1!4eX9!6y+ObRe!2V6rIR)7}~ALukpho-S;BNh2xCi@^b@!@N)G#~!9XHi&bT9GJ# zo+;r6$@gwLte*16v3sua1Qm)Y7-A?ySJF!RQjuR&f==L*0nE0Duk^DPhtZxvPNqF*25Y-D{QUg*-L{0o;$@@T2ZC|7j zzSPXsPTSMD@AC`hw%|kVAHH~Y6xHT#g*{H<>sTM36gie7X!UNuKLN3)EjqTuD3`|? zy1aow>Q3R3a8kpKk8NNb0&tAUHyvHxEDsgrops@Kvz#jsVmL{t((+e79T#gbPWWSY zOsD#>4_CWn-fz4!=&^_@g{l3abVV{ATC?Y|Vy!rpUx3q9G*sI+Q0Q4i`o@mGI2;pk zL5%a0lt1e=Acq8Z&*5)uA$zXD$DLU^^xgdwSEoU%T`8)p znf&*~RU65L!Mc6JhH*jcOUn5eWc+|jAWxd}QS;>i;-cKzR<8!R&kJHNTG9ejR;eDnhfab&qg%~yZg=V zC(?q5two%A;{X2@F9*DlNHB5xZ`e6~zuT|hZ%K{~@PdDf97TqcasYY>ktU;nEJ1<~ z_UpppVbo9d>5JW=&?Wa}B*2xig*sTT7n0CnmQO%gXgQx7PU90?X)?N8Ba^`YN+~y1 z_Urd3SwDz>5I#TX%|zgw9BR>es-gWh7#32X!0bZ?j&J5$OA{2EOwIy)k(x8X|I6G`GAfTyFY<~2MGM`H{f|A zKyirnR^tjJa@St+qN^k5EK(oVQugcLNBVWH!1{xaK|GEm8nBPU%bcQs+(=(|ga_{W zU?8Flyy^^i^A*te|3v2Mlagivcu8_hGVwelwdbGchHR*`z34&03N=mx#g9mMYT>;- z6S^T&x5kh!;3_S26!%>MXEDl7;1tqjun3N$onZzsBNSKZL62rK=uBt+%afHJx|s!N&j1JuwPNV=mlLYZJ)U zF8u89|2S#$;CfhFVG_fytAySIUNrDa#DfbO5H>}XW*}d#zN0AR6Ss40g*<&VeX5)t z3bkxX!Xv_KvP;x-N1kGRT_KX}@q%K~Il~2D>p~Xe#eaHQJXIlHg&w5gw0;j09L5tZ z;|}8;!}wW-XUN1mzP)@n7NG_6*Mok#I-C68cE_T>9}M`IfBWJmmy>J2XYe!V zjF;8Gy&U~E?nCV3zz55rjTC?&_8#HL^yi7&eDUPH!~b$}92vibm;%J*kyS$KQ2vL! z$0sFw?D+fR@%QKAToT3$9Z$q-aH$R?M+iY9&UxP!$$YErQhzJK@lMbL}pqI9cHo;A$ zf`QOBT#ZnumY}ep^g#ShTCfw;AWo4cPwG~rK>usblU_WxNjld}iui=WC`lGSsSZI|hYkly zp0qo@_h~05QM-&hJ?YAx$84(iJxcVN{$rl&;H>?P?Czt_j#A^{q7O~kwnYV8QYc!} zg6$is?QhCR4G-cWdkfp0%jLr(ecH=FDH?>=2<8n`!hkns8tS<9VleA8iQ6y-G~|Oy z3l1q1xHG!sP!`-R8_{<-*wVHbPX>t?dJvzS?U+{l1@^ zefLDI3$N{iHh>BWGSSFn4wz|7O(`K<`|%<{`=aI#`OxjRMB%Zd1l)=UM)HiJWiM_B z-ywCkSQmSU>nfxNYX{HN z0u$suOum%Wn5}8vi>I+1(0(3M6 zu27v6UFHMJaWXB4RxVU(XO%3e?S0n+d{HRhHB~0*D*NLQ>GP{m3~T#mE|c7oZjn6S zBv~=YBAwxw4V0CcIQENkN3)$;`a&Y$#X?!;FF&r3hVHX_HyCwG=NEoAjc)RM`>5J@-BJ7-l)20#Jffb^ z?)4VyVBC+$=2Z}8X%p6~`1pH+ea66m=aW%^!WV+v2b(57=*V&8OOR+bFrD=n+I|n?o>-&rR30U3G#d~r8uB-O zwn*`3v;r0_5TCWSk4M7=9hOw(IR=qjhwYn=T7YH74af9q(l zYnX<3m3}V}nf6J^c;e$Dv0@_A2#@`CxwK-9%Dkj|pr3Q!+5tQODh~;`&(byN5Zk1b za(9XiZ37BYJF<1uhCEHz;g8Rz*}NaP4<=YU^ApRqIs;@?m8 z%^plH5AmbagO-UML+rq)*7dcG0m+x^6llC`?|g{g#DyQ=OP=j{b=U^XCk49(Hj;!r z#?r5+MQv@8KHos+qtx{Jn3e~~O}p1j$33wV2Ag)1s&}&c;~Dr@S+IU!L*t&;TPg|v zAUGE7j=QW8tVU#rB0XdEoW(yTbMdgKT!&(c^FDfti$3K%OPz~;p>3P7z&>Cq7erWJ zV^&%Z@X5yG6-G^TCv{f&R7#_^HdJB^3^-OX$UoQUO-pGEJ#P1=*{`otpkg2nu=9A1 z#|eF(Z7F-4fUuDsA@|hWK*058s3Dkad}>d=>S&s@Ala03b;t_(S5>L5=|!7dQA*Q= zeH$Mti}w$$M;#-EIb0CoJeMLWZ$ZI-JEsILS!EV*D@sa*e9{+gcqXD1=uAD*#*w-$ zBtQ#DB>{`iB^`->JUNokmlFevq-Fb?CB`$E6JPFdw`TM4cU}^{m?BwdL1l_0@5Zm; zD;V3A64gENoN#-L^o0$RskPs>t*N%1)yblEk~yDeV=}O=%dTNE$QrwYHP$4PG&CS| zr^KYe*oHGCvf~u4-7(bF)e+N0D2Hb)tOl@-mS_L{n51v^`=35Ng4EoTAL1w^dRyDi zbVYFIy9Q7n!zMf&780`2^bs=_1P3;ZV{M%tr-(6r*R;~(Z`Kh$fi*j#B;oellZ1j&ta8$`iCCl%r|1}~L8EZMV+GpCw(oa&omlGy zp8w7R_v7X_e#-OzjZ;K8hYpyh^@Y~ywU1;po~^Mx>@cQVqP)DMlkXKyJP&9_y0_Au zE`FNbGs$P?`4?lLQ97IGJIf5t4Urtt$H{wMX?chEHHdC_4DL0$0Ld_<97TifkacY; z3mX(wBKY`z@d>SAHqn9L^<$J}kxya^@KgxD*LOW!bwqf=@xc^S+{Nu%-N*ZhouA_kdUR=aK-YfOaZls#XEE@l)Xu>fLf?M62{YK_3-2?#~q+k7iMpfPcqQ zuPjeayfQ>qV?!tnLmI&eY^nT(o<#g!UQQHs;;tHELPNJ_AzS>CiN25l4d}AvSKt(s z0Zl5p|5YQsJ;1AvN;A}&+UHR|Enp~@j&x0j9GG&nx~B(GdV6P??Wz{aRmHFE$JU84 zj|fhCOW8+71fVY}srbP^e$!jZ=Y*99EE|SJ6~uuew`$QE7oQhpHOXe74mBm5gqle9T~xCLkP#xLu(r7fJf_8cs*}GDeV;hhvYN(j%0w zpyv{~fc036aVBe~5os$*U?dZB8+mMj2n)qN@l9O~e-A9yx{&^k3PqG;4t~k!wIQvN zDB|+FKCAP?B0ek8SK1jF^hvy%?#z zey98xS+Ci^hw&MRx~SzJLUG7Lq6(vzic)rN9azmQXEs$4r#NG-F3o9X4#4C74c_b^N^fQLgT-}IWLyBs8NcjJs4Y1sW^wwDF4$b z@Jh^+IIpsRPn@Z!y{$kDd;=3FRgQAbl}!(()31f5Q3YwPRZ$Cjl&3eXRoS1!z5a*z zSNh_965PM&Q=-bkS0YZT1`_1wD@=5si17=93sw2K99**|7299<^GEU*uq55!ksvRU z0?9VFqV%(Q_ZkBfoUN7ji@Y*o4?t1(ItcCwa@p%Ry;#H?rda|7)v&eJ9w-q}LAnoV zCBXr5R^iH*b`Fs1Zkc4=DJJ(#?Ov2MgiC)&9h zTxSq&z)$eF$`B$sE&}}G@Y!NXU4wRoxj|DZ43?NKDp~;;$a|;Y3`6l$JS{x`EoSNeU;}vB@$9w_YrZb|l^M%(ku9Gjo5h3>xDbHS9B#5c913Lw^)_)9GBZ zJTW}PCT}Ld0S4qsbq4agpD;Uy9H4qv(cdX0MY3|#U9Ts82gtTQUI>qah;9W-5z!K2 z$iZ^VfOST^)mVL0uu{twhDVy&Rx%xc-n~T;-v?{`xFe2yBC`370UQsQAUu1X(g6^* z`=Tb`!Y>X08W!T{wLI}BZj9I%@8m{gDzPy{g$%V#L@y&|qgR^2>>SM(sVvmHP3Rd< zcdOpVdu%l^y*BsTPb})4Y?L$dC)}+Wd?x9xl_Nu=L=M6&5E@Ga?4|dJpOyAPx&lQ> z_Pk3LHI9ThBfX`(C6(*9LJ3oj;Ac5EK>XYNMaJ(JON9Yf9vtHAtnVBk_`dSy@u^K0 zRPt2E7YRnsSe+2@ zc@|)h5X_nT$a?7lAr~DZyaFp8><86haOaaBmx9jQ{cG#e?!opw>0#32Y{htc{V>~W zgX!eI+;ULq-?;B2TVH!%F`sx&WvDvX7jF^3HAq$g2T&9IFnd~caO%MJzw6&G8BJo} z^1Zw3a)XuOI^wpJL5#2A_zJX|7fT2r$XR526tIW84+A$2OOn!}AVZ)Qr~oY@7s%D5 zLwlqGVT2qZ2TGaNc18SkWU(*!N)@0}Cg2V?s@>m#8vm=6O1P8=vafTs%A zu@-^nvB(?o0kBtWWvC`V?ApzFV`qg?v;JScCKrLDv;2fMo}b{z*Q(m;kRSq`md-;u z4L+Hz4k*Z?UC=kyB47S|d4#)yfFt~s@L1Tm6>NxYmkSre7eh+{wo=LpD!>a0s$LIH zxeM^^1r3L8Ygaoxl(5bw)Kj{^48>^UD}|$LLraXg)jjWp8Sbst6z;|tM42A_$sCgy zR?+8ubF3kF3w={;sH?OIp-VxOEMAZ=0rt;8fkby^3XOuw#a)o6wH{1NNK0#8m!1lklJeEGJk-k3E zNUMVb?2;C|iUeM$(dBK>h68RL-R(z(E;!M+gu36E|aBa>InC;P~{ysMu+SH zSJK6u;IkcZD&on_2#CR!W+b@9`NdgAkf*oD1!G|sosxWGIQ9-6+jJ+)b=q0aZCc_-iO7m{32^S+#B|N|) zIU-Ba?)O~i$)XOv{waLPBUtC3Nha%o=wXszT|;fS)GYTkNNY4uJol8?&Nj)U>7$7a zwwyeNx5Z5Skx@#tWx`mZCM3o~YH%=ll~^k=!lm%#9#uJJ9&%mGJtl@Vplc9@krc&v zq`SvjFEMi*wQ7DyM}tq+|B&lRp=z=1`y?vuZ>z%fb&7t^MQCa~!SBe!Pin{VSR`ZB zBExg9L0XfqaBPWdd@<3FN?qI0W}ywUYxfSZeXnPlJRMBhsSM`{Ng#F>Nsb;7bC_pV zj$@s3fvmyoD$~|>I7fMOOeo&!Dc19YJH~YvK`JYMsBwScl`M3{*?Og!gNRwTF z`-Ww&V!AU`xpXTk9Ch%1dtiEBPcd)HaMDly-v+KI zGH~?jHP%kA+L}*R{ExE9Q0e!2btI6gDggwK(PKFfy|< z5pO|;4{^fdF#OXEJsdgr;?<8;64@u>1``bV2}BOye%~#iXCjM0lGEM)V!FL~oGRhX zj}7Smzy#bV=L;u<YOGv^3>id~q ztGA8m{VgiU0XeH}1G2Zq41WQW*CLj!+X6thQ)ZE8F^IZZ$-Wctmtm>eob#!41I;oy z!RR02>}OL{nNOLX>M5rJJqJp7t$VGLXVUe|&LOzFKhy3-s=D(ay|NS(7FrF#eH$s6X;8ts~W{d2cm>yg*v)i2Xwa8O5m%0 z&kmMRxuGshi*1OHZpgBCPeusrPp0D)(mP}L;o;f#K!Sa3o?~UE)m^5v?9RF_7^pJp zH?wWChdyN^e#4U2#e5&~9578ub)Oa$US$AU%J-<9(`5rb!~-qWSiKMyuR~-Ti&z_n zsHDw*+!q6YiIk3agUDI9OsB5!QJgpC@6y$f!%X^C>A^G@w(f(947(d+0pwauM_t6F57EBC_jKt{94ChskdQ5d>2k$JN zkld0@UqnBrtJiZUxE zI8BHj!6Iv)33>?A>3RfsFl8s0yidvz2^`FPbdcT%J_P&ujgmfjGMUJez9q3nYl))Z zHN2H=sJ5L0AiW4WSl4k?c>-7Nm(soYmbR?r3b1E21qaZAj&p=$s8yK{?df z1KeACo2aAF$V3z|mSZT8sPu&> zN4jxjxwta*;`p@eyT>2;_>_c+@TvMr^I?xVz|4cM=Z#iPW06;_g$AD5jdLa;9hSVN z(GdU&y}*p91;{*j#$i=JQl=MAjk#d%exsE;Tv!2L5no>mUyd!Z4n(~UsyVy@#57)2 zhy`zjSRvTR?boRtO-^48F7*0K+ch^Ysf_ZTLuT{Xig*?PcA`?qqUwS_V zp2)xn&9Wa% zlF)qwv8Np#YEqW)y^5>uxG)Aw9k9m;Sx2NLnh-&nA){beD3b?Ni(Kp{1Rk)G$m4F#U-uv|5Cwe-#@O^JEL{(QjY^XQXQ^a)hfc4xqj6(ZdIyE#Ch5oyKa#jA!-H+;O9u76#(FAc4+nFj$w zzubTm){E@apf1e2|ruptc`~2D(c(OI_QpHuhp_P4^bue z`_{2qr1=5dokJ^08!WDqTe%M4zFX<~F0c_Hx7Suw%P9^IGL%B;9w2fs)TeG3RCqLy$K^7 zaG-0g5+89}oJ000oTU4yReE?$?4DufAR|cItE^iKQQSJoN(GSk(l@@9*HeG?j!n{G zpe6G@C=<*hT9$Z&8$E#{uqf#`cCFTYNIZp1<8*w*HM-}?*XpcS3psPmn%&GHbPLeA z+eeu_Q64Jw$tKCy?7Juc2<(hQ#hUxuP4V{kwvgEs;~-aB_7QuH*hr~Ak!hf52BcMK zeNH6j>z?}D6syl)Uu`X7QM1>$wpXnK(Ux}j0Y)Rx)2iibkhXH2u1c}{=AwFM9zto7 zMLOn&ELg1nBQtWl`9sLl_#f}YW#_w>>JsLm@2cZ1T{85NK=q}!%nrdt!8GpHt} zW=oy@RX|MH1;i?&zGL4EztKdk8Y+s`2rp~-cYQ8_jQuWzL&EfCEldAt_$M{=*wrju zmF`jk{S^#>m5dF7w-h9_bpp}?T=&=WA3I8o`V;K~bAz)u66 zcea$e5auxL0y2x`90lJn1VX&_jGhm zUGg6Ntubn<*9N`GjnI=$%cKfl)7>_`q<0A&tZXRa*=ivH5wJQ3n?$nRz}|*uRI$#E zfMDtOq%9&pBk~$XIrRBHo!&=TibCU^L!w?I3vG$j-H7DaKN9qGmGskKi^a*9FDx9$Wgk7iDCml|; zd1@5i2>p5Q>I}z!v~7l>?RkQkila}AVHHhLT;*`1&qsMi@boA;3Axlt8)uYGVQoNs zbWSn$sGBswB|sNC?oPUC4{m=xsCGTW?JV4**A!Ea&XQvwme|h`ZUA7mCC<)aq5I!e z+~w;}i1Q!Gi~orN<&Y*_#;eX&oPyF4#!6z5?m!E4vMI8|6!qe~WP0C`-VOL0)_QRz z68B|`vojN^ zy$P;dWv!^mp;r2ttmQ$$sv7z%Eb#7p1NqDmHbycosrQv>%jCDL!ACGuQE$NF|&9I-i=(qK#=o{t}?dSaPx?%#T==s@t` zz=}MFSdQwk&S+?;cU)o@y&&fXSCR~HXY2HP>MCP2S_8h^f}l4 zsIzHHa*fSEA`+gtGxz=1Cy=k`yx{s;`(W}MBA?hN_FIUpH`Z>Yf$pQsYTVXlFR))p zS9ubjHayjvPn-~gQN(eqU!THO>|Sr8)BIx^HHlkS*}KT4c#p91W~xu5vmfa$HH7NKff zr#PzU%*FA+MCT3!NBgb(*?sTv3D!nI@cs{s9Ld4ony(?i5T-}yiAf9p?l{OojrkLV zAC$yR9M>KoU(cxKtnVoe&J)z57Rum!9nUaRi_#kQv@9I8dmXPu?Y*eyMf^QKmk0CA z#qhZ`mutZM=Iaov9RgL++>F9*0(b)iGPxhs6vyxdhcD1tVVpcZ#O?%a&fK6!#UApi zG>tw%jDKj%Cj}MyY0=3If@1G3KQTzBcPTRNIoiqz?fk5VI(Yy6)d%Tk~5i}%2sQbh63wV zHo-L(7#=n8I|JU7^U=PXLGM?~vu*C#(w&Q-6t$BwB`?$?341y!G}~Dg6)Hx(y|~_f zsT-Lj3t(y(q!7>aJNkn~kc|_5=!`nPGv0dKzmW@%F#DD!O463agA-3QDe{h~-LGkM zYWV#+sgLGpgb&!=!Wi2%Vf=!8v#&n|#zVBhf3#6d(uJbJ@cVH@SaW6{tY2`Y`Q%6o8EB}m zU4?;6ys(-!`y7DpJf^Z%V_~1?{%|F0_WC0!cl7uWjx{zvpl$T-Doy3H{m(RM z!NN|>K?&Ai=SgM@klE9&X_=#C-q@kx(N4g9?&9?uO z>Ep#EVjaS#y48&Ks>$azdRi_~X%GZ>glrM-+7H zS1=A(JjXxCbHGA@AO3B%^Cp!#=WFlR)M=@3{flR_uQU)Z;I_)2(%*3ep(5)aug=f4 zHejnm!l~Az(!)ywDcewN^cJmFb;sAxb3>QApXvHbxB7Zhlk)6msjgzmF+QmJtMW|f z0sGZdODccHZK3zAfbWM|wTli7EevrL_O67C%id!3po<%b*Q*+0q2KmC`E*Zj7rT~- z!L*rmMWOmi#pfacJ^~jrRe_>+ddy1fooY~N%^o#-dWA_~ru3-gZ_*6#N8CH)!qqUn zYYw~_=a79Wmg#LEjKN0Agv9&grphK87g9w-O~dKWHJET!4bk* zr+eaVBwvhcHc|V=vVzXNJ3gFl^?TKdZ@VYJjEHLrWH}NzxE>E9wtJzOp5Hq@9gR+B zs$885Et+lKfK;+buJ*?kJFi7tvWLVENxmMQTS+@fxvkLH520@lWkOU##KrfP91v+y z2|t)y^n=Yam$39}^9_`V`aR~(KMf47rV5gP7(UMMpiS7~ z*L&%*Y7}yM=yaE4L%F=dVxDc1oR}Y55mubP1uya+23EjeMLUVO?}VW?pMRVC9NnDx z8r3~N$+mY;zh^}|rln7BdEu@tg}A*(ZC|t0xYhIJEw|oFy;iPqe>Z|!m`gZ>hiXW& zZSv5|eV*}uvbdL2pn%xXkZ>y1LQm`YFx%)^ldrmk6>FaEBSS*$Y8XM0rDFC-#UqAz z=|tNoKeB2gdh?ItbLsB0IHW@^v((6uob>H+tfxH*8u>gu0y2OL(O4(5nGSb0?3yA1 z*&LR96#0U4e(zSIY+EEUV=`yR=zn0^ylSmyc^i8YR zQ|%~KTdzVS3vt%d{S!L6JamT#ute-XHHJbXb?r)_zlk}tf@lu;di2O~Qy(bx$cRua zyh3UGcd$kwa^CyTVx<{oEWfL=Em3X8h3xY}d7hCwZ18YlAe9@(H&pTW2 z0R8QQED)&Qp}K!%JNKpV-I3;AC4DO;>1kSCmW6-<^^Bf3x>Bf-4zv3R#oD||>K*1U zu(IrPP|q3BUn2HGpIvJScn8f=OoPW#NJKjk&UvJnT2w$?nC{GM#{0Eys<8pY(Q5_`_beZ7n;9oYo-_JsSdAJk{60U^{uOZ|B(^K6@2?V$?B~UeVJek zW9{ws3?jnv-MjY}ZKZ8dH%H0$hTo+25in(Hu1>!GDU(^b3=ow;Rrd%ur%SC~#Z~}J zzT~b_YWNIO;z9o*y+1#ht`V1p4(2=Om$v6xX+bf848)ZjIXZ=WzJkg!jY@P9(ry5|>=gQ>% z&te71T&?HK&8NLo&V@oYFcNq%{g2b&!69IIiT=F^4dOX~J^>evn0r!P%oc5^uB_vS zDt35I|M1lO3Qh@K`ibrh+ut|9E8*K#)5+YrQU)PT#}CL>WY{ii0-ofqkY~@G@@Kov zlQd!aLIs!~RM_?5V&{J5U@1I*({!rA~X>|H+I(cmEO6G_ImOOAXNPbQq z-VVJgi=LT6DKij(8|wUqn%PPfO?&7G_A@b`ptXcIOeCRVMF%q8DEA<_PLUMfCJ3r` z|Jt_N!2{nIfK(xcme-!)<5@vj9j*?ilZ&Htlsk_jX`caa6V*Y|y?_BF`uoPZ3L^9I zBQKn1zK`{$&KyTWX4A`KdeR4D5RT>ClzC=#N{{)EA$(~-T({idiOp~X0pP|C*)I18 z$C8At^8EJWxo#JUU81L4vc0&-_LYE38F2VigeHJV=tBwi z?(~;-&$&Tzb442$G-4om9x-V@>Jc+VfAM`> z9~aljU3uAjcb$YY?8NUpL-ad8Q^NwuNnk$mQ;>cnEva1NjV(6Ce-QGB$O}Dm@>S#@ z7NcXpHJR*?^v(*aFkItwK%`lN=zZo+H@azmG#3!^6mW2$H{ad9!y?`i0h)M~%*&OM z12Zs5#Q)!)3`O$Yp$KO|eDm?axri^vHC~x=w8(hfv$V%R?`lFWY~Zu0e_eP!6AifA zRGil4Maq^O_5TY)eyC)SVHCuv|!ack#vH{I86@r$)+u zZz?>3bt7c6FC_lmGsHG+8{D%uCBT_^x)RTJwxse&5*UcoOA!}opW2IjCKf!WONj+EQ5!Jp^I-b4kc0 zh35U;DR=A=bo~x=tHhXS1EnYMNrFlDsY? z+Z-kbu(rs7xfv7YVt|+*57qu6J-wF-`~Y7B0VcyS<(P%Qs*7o;LD+Bq8aAx7dWLC? ztpAeYe5{aQIxws>Hfg#_KHJ%Z8c5qRl5Y{g$0ELvAN}O_a$g=m_|JO8^I$kbV-9$| z^m&fcSTFk@Y&s_xGmL&OFQh#h*H%!N8h%jE$D2BFLjDH*_8cu_ex=rS&G*T{RPS`# z{;RZxdhYgpM&acdX+g?cWxHj6;REMWE>|j*v)cWyp^d@h%fkR~g?|d@f&E?(_0XTh zPWtR&2eqk$Wu1Fu(Vu(V?xEqy;dGFZ`MA!CDhBQ7O(pOFl1UA$vAg5j)W=1jx#Q>dYKv zsRE__;;)=%-KnZA?mT~Dqp(H0*`=q(*2))$nLN!n=Sk>R5(H>9{(|B5Zi3pHvix$Y z%@gf8KfN-Q1Crsg&JeBM;Y?ljjmrHp*uruI#XF>JLyBn#^`pr0JqHo*LrduS_Yl<%5agOsM*>SmvS3NZ@kgGT%Nwmrj zC)(eWh&ZdnPFa5+Xf>jr;+cH|mwMu6oInv6v!JTUeN^g?7W_q=Ldh1`=DFM#^>Gz! z5!%?XZdHgYu=*AwwDzJqB{;9vRQ(%yXpzAWy%=nt-nYMpMh~%GD%Ye3?gX+)&^_zP z1D^#C}BlYD(21JF{@N0Ff*+VU3N~!pl-eYa~Mz8F= zXCZr^OLi!FHQ%|twT>%XbcG(L*}}2LfSTjLL0RVu?j%7FDlNe-6*w)cK&plK4F*Vs z#dmJg%P+WzYhbyqgSGgiuxuT^Kx5MvNF6Nu`I*B#@ql+dm=4b7_gv}~F7;HVx+>MX=pn{ojSbxOsK0wYwxz2V z>XbJ1->7^Y^;}H6?Y4r}&=)ppP1OjL)<1Uy{a(@@eCw7gt?giTT0HSC&$zxmf~)+P znCsgT$wTK$*Sx^mKGFI>Hl1A$x{d_f;ABVCkwsWjajEOX-xMb0Bs z(z#>I)4D*auer0TPGe(=>2Zn@RC+xb;c4b$1dmR+nIz{F*6B>rm-uP}#a$fKJluGO zf9gf<(&xMPP)Ty#2c4M*&7X~+Ht_t-TuZItG80N-bHnPUui~$<+w}q7JVo38vo{Q$ zKL|-$Hh-I|LAs&9+IX+AA&DBq#4G zild9xL6<9{xhUVCl+_xEhMsG=_-J^p`PQTkN`oxC7XW10u5P?ME|_h*YLY6`!h`uC zu3TC4)uzHgeWiUe=x?h{9OKesMc*uEd~|u5j4ExSJd2E9GN(6R_obUNjK_8R6-X2~ zP#}3;&pexZQte#x?whAvE8-Nc{()YjJFR+xvsbEo%x*WR>hzlGTpb$4g*Q~2{U=Q_ zI;ShVcRB7sG9Px6aej=h{+`B(%DTc<03+-Pf7|)&crst>7 zIXy2c?cFK%TN7-Z`ShugKm5wJ_<+;`o8ccF>rA?y)M_+PgbZK`9>%nzimy(Ok`wGy zI{ztdUnO3?gVIGBlAqxoX&oO#uQ7U+f!gdCA!+lpk@|_g9++du*v8_g=wD-`M;k@LD${i|M&g90+}OeX6EyGKF|HUA5(VQH61tjIt!SZ?Pss|z1sH2wve5> z@4KJ1ZSoJ2?g2F3>u4T;kRNWwj+KP{evuq8wB9W3VwPC6FQ#{#vJRs*2)*Egrgc|y zsOnQpW)4#^zmET^-+;ODaF;T{*=6B|UMhJW5vJM3F)))_xj%S59OL`AS?g5Bxax!E z@QUs+y9Z|Kptdh|Df9X({X*IE0v&_ovNk3(PMQgvx@iq)Q;@E^7(@p|Y>U z8SsQTv1?xv&NLAn)2NC(vzvjQxO({SpYXj_`7+p5uj0O`uKf|*cM0wrFrF1~T5qfr zLu>I9AQSvJs6s@Uo_dI1L@*%C5X=Z=c;>w(>k1Br4k4Xv`9DL41~baVLw7Gk{NDF_ zYf0hc{pVuJF|0jXrZ!~aF5(AzUBOblb~BGeO(;|F+V{L&J;II-1fNGl6RPKwcdW=46?}JxQ0b7?rh(9y znuen5bwHNU=Es}N=ywY)!vw+tyZuh@;~WYlMo9^jdv5YD`>iOl9Zwsl&+ONvhfle4 zXnID2=hQvaBWO73vNa2DL``?aEa@pd+@}>5xez_0(em|KXnc{T>A|54PL~C5hl-0& zr7ARrzHL13WB?@vI%FnNmkX$v)npkf%qDza@CdNlfTlBff zK8i0qMsr^ZgoMa)GgH>R6y)Q2CCJ`mh$Z_!OKLqHmvGxbH>gz@`KgL{2TEb50=5yP zVhvrU#}&Nu(MsKNLLf2$rfMYzz4d-gfenrfF)~w(7rBInHlLL#_jB=wTa8aTy*6WE z*Vt-rM>0*u})1b2lNQ053~TJgv^e5L^Ddya<-pR*Mu`YTO9!B0 zi1P=x4a9E}U;GwOD=M^4{zZC1i#UZgHnsa7I>#t}-IPA6;$8s!+;>8M*BYXI?+PRB zMUyfEg3Cb2D_QC~5)D7vC>Suw5an8tUW7hLG`0upelWJ>nXyGfR~q8HnKIC^(tyX( z7V@m1nOebywkBk56RI7UKN;-1Ld{e^Xiz>F!t#Y_W{*M8*%fB50m;QcnQTBKO+rr| zUW*iPY*DM;nVpa|wNs6h!{q&TawdNj>vB>R>^Y+Rr>+BoD|i;wCp!-di5&mF!E6jg zn}~mxRYvWMsoY;dv0>Mn&6W?yvCEDM4mTWs7!a+nGZgXbC&7Q+MvD=Icsleo>h4cR z@TOM6B0xqvSB}_TO~e!8)zheUJ%gs$cRt#{gv}tNK3D<{EJDfsQ=*o8>LsY$L^BGutGFzSx`X(GZmx} z1G}ELKv>N_fYP>2*tsFor$73cWBY`5MHyCBq`jJm<%Sa~97$QI8U4f{tKm4%(L$8njQy}}JtFpkD9t_(anPqpS zR|Z@|jnH#(=rU|P;Z&guTn1;*@O~c@C!H`1-6_wr0{WP_yrDr}1DT_)uZcxshQ4@W zUY+WVd>2$lz;|Pa7MK=pCA~h&)}RqZATrXk=Un$BeIE)f<1eb6O zX3+Dw%~c@?^!Y}DA@`qkc7e=;qu<@(9WLz(&^MqzK>2Rqs;GY`zTp{ zMrQICmZfh*^Ue)9iBrQNbsIcvtDd3$rKmBX7|O((uZ4di>ldiAz(2}3;z_~+$qy~~ zs*o4F2d-Ffnu59N7JgA7UF{8LUw1q{)*UfB*@9M0lSzyZlD^aeLM67Y00DKF9v1Ck zldG}o=l-T_Z~R&lD!@2ncl(^ zC3l<-y*DyB)4g}dcn$g^>k7bbdNpVKBiqRSWld;NucPc0^$m6Il-Q_n(X0i{{Qwb= zW=7=7W<%^jqYpWW1?FgfxRU0WEiOg=ZB-YytThy!kGlFZp%=$U&$6F2^m`q38FA*U zZ*wIw+Gkq5#{!xm>5;zGpDX9*HFtmH0(5@(*0#RwmZz-T*1};-d7oZ{xkGbC_rnx{ z^Jx@j1Y+q4x1pY=4$BFN(*Dp)`4s`e9?Pu=HcrkD&l_rSUbaH{#$VXy<-Bm$?nCHp zcxo&1TYVMRbK8et(jT^TH@%e_hL)mFD^4)0Z-0V9QEl>%XF~rRa>9mbpEg50y~*LL z1P!Zs3Gl_LJ_0l&-J1spdPC@W!!)cnWGuQPSs)vi;r4`#wQW#dc`d0ZMQTHzt7nCf8)sz> ze>Dqz&eDJ->7~*V^~Iul;cD-c?-I`pb&oM7nXP@E3HP%=B@wCfA?0ZwSZ4HwGJH2~~il48TB2G<4WaMjap|JAn>u{QSJigoziva#Z9 z8YX*c&Of?)$MP#nQTYR`vGz|CnxpcM4#^;5!UIA1-1 zbeDY~uBu<7=VWTb^mb3IV;^8;yAm7BK2KXoQEG!Npzf3dVPKOf`Jrh$wikJ;3Ey$gK1_}#=%yk|NhBkPE zTHSMsda40#=rErUHmEHud#$AVj~tw^z3L4ZjQak6)ob?{*6Ep<_Zi;oUMRj=fMzJk z!QRGhRQGa6n*nHp?Xd0{)5sQEC#@#SGIJpkxat*uxYKjNzkASel3+@3J@U&Ptl16z zbR{0tNX>Cn0B#j0izBQQvOtu7gD=Zq9+N_;T7!`56wA~6Xv^-vwdjA(^|tsR4`74L z!2A$?6fUbNC}Ycq>6y(Y7VR7Rg|8R8ekQixDi2Iw?>qZVY?G5cWMfwrFr|iQKKdW8 ztRPSLST66Ka&G%#lnpg=djku_XMhC(kD`iXqz?0c+vAXbbvQHPa7zSH2)sV?{1zH- zq*CkAd?BDK5V!)TZmPgdg$@}xb)ChSCx)kxf@ixmfiAl2-}^rkva|dFW;dWMKW)oy z&YS0)ml`51Kzl0-!73>NDLQl?-|sN$P~h@yJ2GScAn7C+d$O&$`I@OSb@|EhV&^YJ zZ-p3IRF^2f*rlRjRa`6o!Yp3+bKm^&|M(=&IcwAaSM zS-|I~NkCNaKXwq>Qz2$RZa~;FpdMeH_kC4oR@>M#qRskxS|GcB{q{d5?K*4b6j!i$k|U z_&BuXuF?V8Or)rf!hg`60crcdQQ3ec1$K(I0=odkdbHYiK9`MM*!ZxWaX$6LEjbz| zsPO-7QBjN8@9(ytch`?V#g zP@Is#5z(3K5K1OHj+`?3ssWfT|h!eV?p`8ufmFrV>x{Y=$64%WO>_0h|5jU(;t3{&}4@n zEvAvyVdpH-{wry**FtE!`$MIux1hPF^N?m$t?v`FGRBc39c5=Xxk8twqh)VzWw+S& z%=UmrS!hH{-bRa!m>Qa^z7IP=7ic`FJf~oco*C8Er(<=c z?>RJM-(1Gr(;rPO&LEpq`=k_Q_fHZJWV@KIK2bqC>fSngp!7P|3;qSpzLB}?%+%s{ z(k0#_fg#caW@U|b>f=4b0|8!JohQo_+p$vpmjI zv31#w1OM#ae`-hQ*3MH~qdD$}y0`zEi1|->;-q!fgOx`(^i{qULPyrJfEiH|GZ|&- z)~A@SoUH6QS*LD&iUXQg+Bg;8w2GbAN)g@WX4W5S)`RI>rBhnpG#Rwe(Qg~i4zkEd zv^DTkz~|(q++*@rQtmPQO)z|oC|}@J$iFL4jU1UC{n5`lR(^e9Qw|DgW{o&ERC=DN zu`~!HrRD6ZY~LUiz46Mmu3VHl7^@fM0pCb=CB>TRUVyJ(&zNqKm-}_U)j()CxdVS( zx;$v^*cR4wwJZiiQ&;#W^77zAx?28p^8n^t*77s}oM5^%3Rap|dg>o-1tXFC)#r1& z)aRQ<&qwmC2&{ZnV*?WA ziI|2;W0|G-ut5`Cd`;I-GFL!+!e|j~k9C>wq2^>8vWf872J3g(bwF7e zD4oPF>^4lV94IY^nf7->BJ+#=6EK$3g}CB+Tya0tqy+ShRT*9X!1L6TGpi9zt@Sz! z8YkB}+P} zd;gk7o_B{{O72MSh`;Wclt$wYBY_q7tiJ<93;n0*b+-pJjTZM#JFQ&f0C7+w?|OAJ zqnt}~bCEb@fP;L}n9627^Dp6SOkf^sj`n_x|Fg`lY-6S!wVo^Xv#YrSqu*Ta|35J4 z4E1C1(>?mm+Fq)ho2L5D`|Yd(wY78*DKhB#yu58UeE(?g)D7fw_#E*efuePzkO*OA zuG|t8qO~^E`j`em+@#Bi6fw)G|Jdp7-@|jh2x0*&b^)jOt%FmRW4#mp-WH6z6~3G| z)ixUct7yi54RO%PxtZswp_~x(Hi6p^%N2eu@*nEjVj;gOzrYThq%+bRl%XH(TsaN1 zhWw4d_C8ocxaH)FCnY|L+G(N=_?>9-?J~N^l)VImHIl^0w`O1)q7ah#{@{OeZZ&FW zs3Z};hAu4`y!7g;e$Jb5L3V1ME>+{}DA1*b`Ce(&6nEa6T&zO*C;M#EbDe#{5F{yt zg_k)R6{wG}qVVee|J{&Fr8wmvI8pc^Ag7NWoKT48q+~*hOUigwv@Oi^$Djhre|rIN z883&`E>rK0)kbkyLEGAIry*ytRJm-Eu4j`2WsMWGlh$xuNnvpzjs;eD8@coN`bBX{!8PWHjuBp;)f--hE z+xy$#MAw-DL+A}1-}1DdvAI3ntB^j~^~89w3y?ul+v)8CWlQ_Q1I*;kRUKaqjDo$yxj zXs3m0UFcxkY;;5d8Z&a~L)=El3+(TqMog#<$H(jjfi_IRVXzC7+X6tA4l&m2RDHX8 z(#l6v?6^AbT67-TvBtZ_%=?ZsYY$UztwphX7OL<>!wK870rPh`Evb701KmF{4`s{V zUI~?EgUx%e4aOE*TSM0>^V~p)?byw{;fnu$1arC9eYh@g+iOSQnMp<*J+h*t1l$?s zcV@P)ZhPk2=0qbPi(@SQTi~gJBNGle+1ajW;d%|J)2+U9OHvxlQPsVP4o&33p%OUV zn#j)wjChJWlD_+H1~wQav8`98mj0ez^r!Sf97E5V7D}_UQ#zMOPImpp;Ajn+i@kC8 zIH`hpzyIp&hlP1|2Vjeh#}N4H9xERIiSL9(yVpP57p>LL?5^nSTx}NrVqAu2Rk09` z9{eLc=T!VBIwNf0@1g257l(bXzPO&7pl%+eY_V>ig$?tXZFYo<@{>2Bka zj)qQ+n-@G4+CL7%BHxE`F=MN~2@Av>Q!CSj-qV3Kb<&M&BdxQu)f3FPKE=82R)LAH z!rBsJvVtN6P<_f(AX+!O0iKk4de8O0uL?ud~w{ z{w3)TA06D0OQ6#sm9QAoI`m3WP-*tpkX<7v=MSwPB&|g>-6(y_1-=P}Y?>hh*xG#A znIatmRiRkDl%R(L%qxVkKya{OCjCv2t%aU~VOeE9{&n%2?@k=hyXu|RLgexPl}l`I z^nKm0P_HrJ%DomruZ3Q{qZIQ^zNSB%M)>+(AnjjFz63uCnZRIM?U5ggzl%va!|d7x zB+B{`zI6kcyMLct!j5{$|IJq$8pVbUjvlPMqZ#~M>YF_s*9+oNiEY4hKzZ6f{9lZ* zE+&Mttkv_RvlFWKZ?p$v5KEeTi^V7KTz;0NviWeyGcuQue_w#E%lM2no!$3F|(Hl+~xVe zhuB_>)=X294>TCDupZ9nCNGn3lX{B)HnUf6=!|qn{}=s0Td+aTJ(#+y$oKIoxa<7@ zMu2{f$)yxL>>viE@&krUjTjjRC?VqsN#&nRdSuPot{hOzlemX_>&`L`^a~zK0&)Z& z>(~#cDMTbNO z?l9Ur-cGGo|9PGCdu{C|J~)*b*0}_3pxDspCUdN_!DdtoaM6bV9XM@7TJ(k^?ok@& z^9McDuYly^nNzf=kWc|w!ymoE0=>|uNIY2RJ18T{=mTFo1e(a7gTg>Qi8LaiS^h7%S*R;x%&&*m{GTvweT1 zuxZ>JANC{KfggnLRn zT`J>q)e9voW4ptH~XyHZATgYXX?g0>_&ixB6xrl*^Wj@|R#4mQ{D3&<7JaL4oT^&2sQGP@u)^=5G;{?tLbAKTFGN$argas2;)vP1wmUl_gg)qe21KiCotxO&ra)s?2cI-We|0N_`-K|_FuW2*Gn|O{)|IW{bm$B|jyN8|*^ZvG zpZ09`7*G-&2q7sFAq}y!khTDO>-}N+Lyb+(Lf%lUHZwoS5dgV!U43W)*?b-&Ed*^> zSs{kR=CC+@MypMd`0e4?V=^-2%Gz8H}aC$?#j?-_Z;CA_&r}@b~E1= z3O->e^Vl`V%LJeOWXAyb4y+Uqy|NWzu`9dZZy|*N7OUwplc58;0NNUe3UW|u3AN$6 zDux$wa3*Gq2DP784_T6KN90M859CR@ot{JeUm69@8heZIt#bfMQ4K@REX5S_7=S1A zN->-)_4B~g+y`v3uG9F96TpEf^bez~iIL&KGL#PK7Dxj)MB zBfrApO{}6lk|s4CPJk|Ge67VWI9-y?1$gk~NlfyrlUZ_-$?qHje6zz$Ta`TDn2ib{ zwSPIq5Dw5B5wD^-(vH!M1xCi&FG9D1+U7RjontnTWkE48Xw2vn>=1~CGcg%Z@fFPe zE2l~gNNP!s&9nmGGf@QmEh1ew-v-|!eoKH4-YU&!UpQ=?<**ofdVs04LiXL6b`sD$ zv_B8c54|!>o3>-s7r_loovr7V=BI!0;hG2S{6&IC`oR}jlj>$TVt5xt8-JjBj~{&a z{jafhyf9l$7!Jr!$PmcSkKqT>Y+2nPhKlFe&=0WRc%~Krr^W7Xn0wH4^Z3#^ZYEUB zT0#~s*BR=_k%tA#k(d9FJ~k4{|kR8^|LmtD#(-QbufuNG|5X|i}P;oK7c zFqu9DMHREyf_Zl*3-SCq43bKj$gw4UiS9qD1xy>$ zb@u`>ce-qwjukOf6&={IVR6v+v2C!3jZJ_VN#8%uI2?2SQ}X?xuOanYB3}Kh+SgDZ zW}+{b>a*Vgcc(=jI2~iky$St6X=sZSgq(IA*CS3d+$bS3`w;TvCs6typi!ZviKO6ojtjtKzk)!qY5^DqA2w`m@SGjiXGuTP z7Oc{1_VLiFA^oppQS^`=Hi8;c&4iP}q<-xDQ#HsE28frn*sY6yKqU+Z+B zNeATPx%AgvW@nvSG3sMs(~a@~X*y$C?rq#YFi<`?Si?RR_;uUU$&z==+=U-I+1Zzd zz#(X>2yPp&FRU*Uc5z6Ahw4v_qTs;8#8a>JM~G)azo5DPv2as0c-0jL2o(K<{!O}A zuH`NNMRRpO`xu|W5bfvBakZn)=^8_pz~0)=VDQMmw|}lr&(3+h!O)5`LtO2wL5M5u za`(03`Gz(*RxI7C?`s&t@_MG3MXok@*;@y<_rZ9Q?sp^BUlO_>MwBtlLd*)}3Gve? zv|=IC(jJAx#!#+ne)H##V2w>f_ZT!sX@xAKZ(bF2jaS4KDyPk{I0PKDiZKR=HY{Yy zL!mqXcs^3N9DF##SqJ(9{XpjJId}#ZKxV7*)d#RL$Ffy{4zY}A6n#qTPnGUi zNs2iPH(j5rpW#>Vz<3wJBnRNb)tJ`fjp9+1=Udlf17x5IdjxLgnIW#BZIu*42*W!C zaU?TkU0hKr+hwqQc@N`9qiRvvKFx?nd}U2nZV_-7vyrc5`Q4>*A2b?sa1jGB&Bo2= z1Lw%ck}j%AUW--i2)5#xAEoP`J-D65o@Ch>#A6xL{bu(GFp|Z6#iwXfboFylER|yK%Ww#bO@PiDKHxb%*mokJ*KZ$5c^aw# z{$F=2LG;LoM#NPsAA5cU)7c%-31mj~gTE;pcyCGsNQZN7`UEed4DVUv*w9DwCzQ*s&UUKro5X0Idrb zRe;TO;Y4e$hZb~Yy4)9x(uWItp3dXxJm}e30icN`)U24e=z`)u5g>4epJn1tOhm6 z54IY-!eb%RRUVXel_e9y3Bg%G8YO!!eHLT!6!nmNtGbSS$rNLym`ukNp8tS@VhUko zJh+tCv6SihDieoG6)V{$H`-hKD-eY$&UDdejeG4qybr#&n4o84iQfuz_zaG=vB9 zzNO@>2-mg!qi<1jK0cV-maoH!$^cuI8iS#$L|YY{4m*vcqecu-)LVxeQVk|dx^bfs zBU)}lgh>!TFs6$!Ka2An2q-;Mhk5Lw=?aY7nd78JV9WyFD{5_Iofn}ABOvB97VTWN zm`4)@?N@!mFaL4h_1=pH9{IP;nxV-sia<)Eqg!HQI8*;PYZ(C(+w zGwhp9tZ+PE{k}){COA^!p7vXPr>_YEbIzlk%i+6owY}E5uFHNbQvJehF7l)5P=S`= zwwV5C0A`K6AlNU)jNmh%VH&8LQAmm2{}>n@>1)?ue(Z{k^+)@^qMRD!`s?F2Fn{w8 zK99B@2$J-lfh3FXYh zrgLY~T6lWb>(Tf&96)bTd|SWRf4`8f@M)n)!jFcu|9a$jVmI>+NWL`lJn^;9s_O(= zJeRR}$UiY0-9IC?tDF{u+rx3uz2`Lc1-_Ngwky z&7nkeXa6VJxD-lk^(-_Eb{R~bwwc@OLl5CgiK&&!rQKoJtG0=;^zpxh1Qwoy$9lDd$;sb&Lr>6csFGYF7^U6CIFb5A1N`<4=}jmJ z)24tAG|pdX2{ThI@aByJfM@1#qGjKgE#VJeFM#b=YlkkrJl*%#WOqV7Q@t|9q)0w@ zs`43XHaKl>L(t&dk|Gd*({IS;{n&wXOX)9!PRiz195pthfJLB`edtF48NAW}x;_x= z%^S|1mAUYgxvSDfUfRt>4I$?8^^)O^3KJl@9!otx=;B|QV>#jsL`OB5dZn`m$5r7T z$alULab>JC?aEf2RWsM4o6AS+DXxD-{DpI!gK7iIMy0Y#upf~A3O}(>D9+bX2ga3k>l|6s8pkA7LNE2m+kf1?M zL@V3&rblyW%A4%tw#ax_dw|)2l$7tPL?u`38Y711N*&CmzTxe84MOEbBg=HFW!lx>mq1tw;rN!IV51Sc7yRMU*< zMNViRL$`Pf^vu*l41e6BE&EF=mzSKy2+ICt(#N4O4Qne20}>7V|D!b z@UBRu`YEye7y2`D$Olh-4n9V!8Z!l1H5>Z_|;NZBE-XI7^U- zQlQVWO7Ea-ueQix7YG9#nF;^)=CG#;rwiAMR8Pv_faq4C$8x@UVjkv^bZ$H{8P&u7 zf-L6se@h)+8N!^rrf_lNv%&F>K;RZ~1BtIK#76KTg(u4*CW_E)x?nA9A!#!O?T(<= zC1)ZL1vybL+bqb(gNg?q(2+GZU}7tmW3V(tFQ=#w5tgtu5jFN^9b#me)>JIn6B( zo}L0Z+QIxPtnb%8NeaI-#W4q1$hs@ztzHw{>@sCMAQHp2VnyT!_zji5B$YHUPwK!A z$ziK*U{_`i?&%`Wrbf%t0^0ycHY#fT>;}-8j4Xscp=)@Q zx8%KSo-A`i|K%x1+nI@-Q~B?lOvihkssa(6M|k5ABQ?Y@S*3HpSwJHOF+pZXsTEA^Z7qche>GnEn&l%Wx1vyvd;YlxB_AOA77cT^w-@87{@%ZWDc{Oo8ph7N zrlKW%Td-Dhf!!suiLd#2LLD#9kN{!ZSD>t{QZ*9`wQ*CFx`5dtn_fql-v^oeoG?w1 z1&Cp0vlF3zs}y0HYT(J^LP%14nrP%~^|o2KCyGm!W9X*lX`1!@zeYZiqS;b1KswBx z8ZS@rw+QU2vX*vEvVuqJe_ud0I=6TX~^mH-l(H({&o(g9Rp|QCy9@mdD9I+`*=;l++@B>-N z0{y`oWpg6l=)!NGuO2lMzZ-{tXwa?|dS08FCB~;q9(GY`^6+HM`B?b<5*zFf51WR| zGF9rpE+yAzij%l)9z7RAIg=$8{on^BOB?EN@2j9EInGv(qBwyczhCmw3PV)S?o97A z#5fc_qgOGv>UP}P;hVuT3y=k4mnYI%gV4Yr*yKFS9ahHB&6MA5M@|%ubWp8uAdjVe zN=VXMLGrp?J4sKzlk`&$^--g14kD)#+)j9+bE`$U)Vnh{W31P+Y-2FUg}%H8qFb9n zCwm3%MGoDYYK-%x*K~6dw@Cluw&b^MXNyGTTHme-)D|GYmW&Fsk-_q6zOC;Wv@kt; zpZH*vZ)dB{G_-Y=Ik48)@=&VJ+6HMj@M@{nmwF0*OE-{pC&G6-?BLtOzVXc1DObG~ zQ+fxVA8Etdw#x9X%T@eFFIqNIxjVIYre|^tBJ*`F&B7J~{c*kR54L9V~oZ zR)h*Lufx-tWS@~ycHAc0c<5YhI&|$@WtT$QRVKv84o%ROu0;^g!{ko?UH9eDZ1@6@ zv{^fo+JH`=OzPg9Gk$p(Eacn0I$Up!?>gnz;PW*8mH1!sp=z>B&C{b7x;13g_wh{2 zOW!&c;pM4xZMdj#BQ}L@B*yX+su%O??CJZU284c2Z_DI$@*o+fR!H~jpxb{4Iu_3^ z^ey~Cv;9uv z67UfPyfOJ0e;mZJ9*}L`i!#Qv<&|1_HhQ`x%h2-i*hDTh3$Q@)Y;=2cI0F&&0B`0ZLGYg_vornTVWCF)kWvD7(c4Nb+H!Tw$7(f^xYYPV z{S-%Y3%mwka_-^S0Qrv|&8vu`XzNz$1oattnNWgI?gwN|cpUMJjTl?xs7#@C+>LAI zfG;stZR&RMBU-A6BhGwUF8ys2pEmpVM=+7y=utU>=F?#TnU)Ap5FBaRMZ8!GDe|xeiw{Gg>5?~&JrQ=;{k=VUZ6-GYHKmhZ9^!{D)~4H!Mcb_1Z;>7j9iH*D zn_v5&5Ogc=&jj^|2{gwA-6S+I45%48YlXuS&{oib^oALebO1>PTMA^8bZ2pzgS*Ql z-|gQwk`3T?;>#}vMoMu_8oh7Iy|^#&Oo2R2p6i>@rPrQ3jNU9NT~+V8A3fqYQwa(x z)toa<(A1Le;~k-|QWhjkTzBv4b)$=GzDAHIb zp1!|MdJ}@Nwg4QHeIgLm!DM~CiVk3(BcpRgMi+fvS_3e<19TlFz^&m>0F>e_}eAp=DcD=n0r5&Bo1lf38IfsWhY$r$uqGal2up?x%hZtim9 z1tpNl0Y`88wbM}(R}UnMax@N%p@(F-2Zl`k>q*B@@j{^(&GGIvn@-nq7yOS}82b*J z&K{oH0`RF(?*ufDd}51F&Kek8#2uQ#)O7V(J5L;rib0I@rg^@0}O4xtoY(6)*Lf%QwYO}1pt5zw|x3vzqPso8HqqraNrFY{|Q3h7e+HqbV+PvA)K zVwh3=0>C^EQ}#DmAMevW2H1`s_Xvb{+D4?2A{Rv#&Uo4B@`P3*mJsjrieGlt`DP#| zI}Q4NjK=+~>H}0KL^e8F!S*_(x)I2uba-V$AoMfhT@MJTo;Oj_(EcIPACN=T0^$bsL%>$*`%l8 zp2q_GOyAmZS@W1rm5tMa8R4wMqV8CTMLjvWw3tau{^h20zOn7tD60(Vz@>-7vs5#$ zwf}T^gISD?X?W(&i~eFq;8-p|NG(3gVD|E8!0%Zv)V!B&S2F94k-*#kfWNOSQ= zgJ)~J{O`@4yat|CzLl47sSc9T<^ zD)p{T{oLhQliXqwD#r#kv^OgkY@)6p50Zig8&(v{we-$YLi~a zvnn11=KuPh`RCt+ituwh>zwYNxII4-_9NL41er<|rs0u&Zk5;DTVp9`i1WFdYDnr_3H+(aEF^L8^(!(JMNLQ0!5nL# zfvy)nxOMaj($&_HmbAk*oJ|gUHWpw*?}HGnGz)K$n$pl_e!+%RvWHp|BjPh&@}G5+ zioou-K|9#s3?{&>ppKLjp-KV?ow{;QEZR1RVmqh>p!JS4qh2|?5!AtTv*7^a5Dr-v(vF1E~x%bg^+5* z%XZ%##V>(DiE?FfLlFX8RD)BlvdkY=NKaTyUY4+ic-F z7d~uf=K>Ci+do+B7)`y~Ps|vc951gEg1PWq481m9t4$goJw43Wb-mQ8T&@zk$F=Y| z(TSq+pjbIgycWJKnwQAIt+YN3FG7c)>4%M=fv%yZ%{MK^@!?xBsRgj7VyrWa)C4$T z-6=Cn>edhtv*FZM>RJh3kor@A-nKIk+D_2k%>L zo}OeYp7ZTExGg%y1~yLShTTQ%u2Rj)$vCw`CydA!IWhY$aWm za^DBNN%kH@6N2M*F-$sf3?-Kqq^eWxF>n@9b5A?+%yc7<6^{fF9P;w8D|_N{WMDK3 zaJ-H(Of-VCV;g(@Hn?P=GQ#lEjPB}M%vDTj>0DI_pnKi18+_09=|yog=wSQkK1fat zf}GlqymB_b3z{`ECv_Xh^3Oz;dtu6`oN5GdDu?Gy28w2_b8M0LxdS5~(GnBly+Rx{ zowVl*&H@FhzUty0a*Q03DQr-PA3%Fi2`9Ke#r2SUA+k}`n*a~TO;~)MI@WZ*5nwsSuInB)e`*89u;KJ$a7(4C00aWM zW-bGAN9-I4IN5G9GqZb`ROK?HavPFM>x<*Ycs*QUY;KoEfsr$rS!o0B)~Yo&=oKxE z1btM%@`AZ-)hB0s7HXzKlmMl?Y4C#FqIWoubo=kbnmJ-0nPBH{u(tVv>x?j^*XRuh zr#srSBU!71LHPJK2|zf2?UB${4JpTS+{DZdl=k=|&L3-4A~m-+yjsm z=R=<1WXL7eZ`<R~;KaWt%&D7_U6AJr&B#l$VHk1C92f2@lgAU&<1FPkxN zI{*Q=#SAsubY=L>fd!+G8&fe~x=Gx8uJ*xhgTS0<+ix{lkFiK`|DXAk&H|IzX0&C@ShbQSaE9EUx~j=Q`* zJWl!$t7d7L6S3aZeRwyXg=)yCJu)K)>pm_4ZE*;G)Y`!D!ukpmN{=lF9g;1`9Y$3$ zbXjCV%(Kchl%HlHS4pi+EB_X`0i?!wKdQ93U~)OORfgLrM(X{r5)KnjXjqsu z(swQ(5lQfEa-hu;o}~P!f|`?NT4#`hACka@(**M81Wl_m)QmtI`GK4ehb7;83?PAm z#cXPWQM#zD(V;1zGDO@}(A-yO^`0~u10_fac_5C4w-8J&;SuLpRR%FJ57WIYY&~w% zDzBFq2Bc?+w-&abIA^2LB{;oKeLuqpX(bd=!bKt9e=FIYMEfP6ePnk4$PMEU50U`a zEqY55EX+g%m@qqhIBS{U?KHz88;IC2hz#Ta{q-%it1@@Rwicj$Aovt!YMiP{u#{Ku z*Say4hwOGgdTcBV<^6|vbGcPp>rR#T1R{jDSQ~v1XWSuZhbbLm> z<5^YzN&lH}ZO!SvHJc74$j*hQ-SA;}p2cOj6hdB+Cf=z* zDVN|~hC)HqZ~>PoJzO$GvWmnuM3Ip7ZL5_>)FYvyYjwKRjqbtv9{Ijit*?M8oMrXB z?bIh`{LU1tDds|7)x=WdeS<>~xur2xE#n=SVFtmBp#Xs7R zBh|G$FIWnLIP~4d1!mrnjXYKdpPr0a@NhN~2284~9qG(~Cd+%KX`WXB(5s3C6RF;I zb)8q(8o*NY6&2*M_zO3UZJI7Uh-4S3f}0DBev|aICO|0_S$Tf5Vb_kEu)g(NVZv;H z*BHhYt$-_A8R>4IWm*$GZ$cD_9ynrp-Knmp>hV;UOa8&pN2qKwP2MFy=F-k8!dF!z z)(HH+o-|t$e9sZSf@e`nMK>j8iIFvR@*3VM=i0IAwg$C=Q2c30+V>@pX)jW|FWLr+9f%+u>0*llPGuR@XT; zT;!Tt@hVFZY(jNN}_9Tg6pJM_CDY)>~&*dAQWc+ zC@3Osv->1CIMI6b+M(K#)zc^@Jr4gVW^o?28c8qAsowzTcG+N7JfPVTtEtuh63nRL-ag$Wt*zIWvm-Lclmn9D{S;SxhW7?bbxX1QU=bLW7#ksPs+7ntPCZYN$LFT{ z8lp=Z)!2ZG73>A;yEiojYh(Tetf2%b5IhJD6P5K@%|{rZCn!%IZ-VCNJL9~T?S2{- z-@CBLu_D-%@ept1PYA-(1_r$&(6+e*_XM^Gj1-x^kY<&7^$eoqOd%L462cx=eaIQv zO6&Bh4;e+Ay5!_{q0W*Ig4Sn7sm}Ny0+o$9e{_61Cl>0rz9-q$Yq+;(&t>>$Dnvr2 zu(N$8q5;>u)~wp1Od>LhbO2aIXvdb#%LRBLar9r#%D^@#_^Q1VKiIlu5tzl6TRH<1%rHGZkcZRt?)qw693UI}Fl4D>Ga8U7f0t|`d7 zPfm1(o?{aq=eizVDQM?(=0#RP&D+C8m%uui{dz;l!;F5%@a*Z$OOD66uA1hrZ-4kO z5YH;mFGWn`fAr0K{O0w{(lKe2wNPTh!*!q?*urbaLpMX720{UvjsWO0Q@}}Zw5zw1$t=%8 zIvp}#pj?69v4rq>UR#sP<)A!6nxq#)8A#^ezbc45eWYBG8tK7$cK7%q7ryXOk`*_Oe z@9sVxHN;vq3ZjZdJgu8Y)wNqa?ZXo2M9@q7do&1lrAkpkL#~M$M0I}1;F9J7&}~D& zTiY;Jj8-=Qh5bgN5jX#KeMV0@{8RB`5QSnZlAc6?ok}T8nKr}`?Z#VDjHRJ<-XnF+ zN?+vnA-!hG$U!|mse=P|2x1b))oVq}<)H)Fgu~UTD%~s*nzG-q?I)%1I;axb3R9qxw(qqX z)(Fk!5(BDLHn@?M%xqcX!p0b5QPpDn(o8l%f(51=B2p$(burbgPV?9q1_a{#nZ-`G~|W_!idWM+f)+!h{3rsdjpW#-`V! z?v=7?+v7~c9580Pl!qc!NBb)7Auh!mx%pU*uiFHeLqRV@_VNt^8goSkxcC3LgemwJ zbC02FXkgI*7b4NOhu$AK6yVD9<%KXDoi=F~>Vr4%7U>}cPycOO2j0g3eh7A3CZE1~ z8`()${H3hv7iQ>u74Z8Y{Qz6H;!f^VlkxBdEeJZ;DsYi5cGr%qHTIwnHYD;9m3~TN zv*lWYLOLNi@X35~gFoQw2)Z+?vc=FSd92^;L2nJV0j> zl@(0q?D!NWxpfSC{O=Rl!cc3mHswh3bttL7jqD7s-#@?z%Z}eE-{WUuU>z~4*eI7a zBl$&-R7ADL1^J-c{$~+*B@`koL@WjJpoLyMY$+8(c?9JpcAz8*0|SOfxRZE53p)4U zRGHy80+-0wi=c_!n(h20G%pE*Yuaf9?pQkT)yPAGNmD~kdzd+_)>T>EF)egCo42ge z*&s&CdUEID)i0KiPg#$!r1&O$X6${b+q1o%H860D{*B6@jH622>=-*;ZW63+)7S?fKi-(4EAt4fxoW9YhTD0hnhO;6}d~Cc=Vx2j-Su^Z~m~ptc0x%*`pTDNFx8(%Gqqn)8 z>9|$6FuD6)cPsqTD!2iAD1c(tmKy0FumUtqa2)GT6*&;q ztVU{i3g#37;-rkj4sadsG8A> zmcGZByiWXxfJ0OaqK~Tg{f4{=r@ zu#D`MXtll(ohoWT?x}3bizc06{}+T^g6Yq)*1=gVv)yK_#-$Z*tHs>We;a$L4QZ3B zUO;Q zvSIrn{Z?RK@L}#htDdG%LyRvo&&^XL`RkvxB#e)43Rs7=?Sr?NVEo8yftaShG66L3 zzxBH#`B0b6qzvBtjQ{@DE=@&xuq)@4W+hj;lkXTviQ0dV7}JG$FtRLlC6}VvgpJL>KMa3WsR~C=DX->02sb^+cbEWc=ze+dBhQy3f_Scf@kmK zR;{qe6`smwUT+VTT92&_8kI7k6i7_omjrNq6y6!I{P4cBO=;W73TTYo>ZwPyg6k=N z_;?CvM$E)izT#~U3;^djoQvc9CwleztxuKrZt`*J@ZW+I1g=~=0NB;Dvo=EFk2W|h zB=KiH(=YK&A!ia?N9<izdG1_7%s!LRRew=KL7I(D7num@meTEnCOpiXmx1G74XSvth^)R~Tk_^-Ql?=*Qs z{q_%Sd$9}opce`wQ~WvR?DXJQ#94xa2e&b%tC0lKXg3vgD@Bu<4Nt`4M!B*=G{BRq zH}v`qUHg3X%QR19S1$UPZXvB%xkZ{#d<-#uX)P8Ve@78cb z`ksKC*Cq*2{an1gvvU&}BgnQyB$70~6cGL1VbEBE4&r}mXb$M`O`rd{P+v7N7QgXE zL%Tn!tG$E9;W3}OmbU(ZWD3^?YDw!lpnYjl)H6&OikJmLrVe0afGecN%2ntCEy%eL zy<-eH5>h6Kry&9)uoJfnhWAoWcCaX4yPh3EqymB&1G_EK*N(5aj|(!p3dF&bePYF} z%|*>mcNyD?+%G}TK2Ln@Z1rTaAIXkfOg1FeZ=SSK)6stqGRKVx;SY)?JYPD_`k@`x z4wLgB)pYl0+t;TH<@|RBh2j1vmB$7CKf>MwzKJsbA7^HAa5ia6p=Ty(Ia+#5TdaUU z(}D+bGzI-Cax?{X7ZIAapet7sU3I^!&=!wfSD`JpuF?b)cXg$SsOzyyGoUCUl4(KY zY$lVmY120Ozn@8Q-T&|Rdi}O*GC9c1JkRI(JfGwJd4KZpw(?8l@PmmZgZk)8Xu14g zFADBF`psJS1y7^7swVd8FP6 zSmxG0F9+voF|xUKDy1(~J&L3*8R;Y(Iptsl6}c@k6oF8C=>`VIWSLRh(4xr_sE--n znow{|yUk1$kB=lZ)MYfow6vi4rB3T@@o`i~v(oow_+QM0&UrTH0j_LhOrTJ3W*7|- zFbqMFBW$n&LEkN#{GfH|MK=f*i$#8O$CcUJ;}5C}trXF_hkgQ2}7 zs+mP@4EWm*|au1ek<)oQ<*-qE4#Np)9LdXM_3Qzwxm!(TD$Fl*q!bb7$MB32^q z>EN(=vOJf<>d~PBa&Ehrj=q&Zo=$?kyHjci6dj1#LyG-W4c)b(cW!;{f{fNu6?|KPJ0tx&NIW5k`-~(Vytlzt0kckwW^M!V|I8jP-h4x ziv(zrg%AnNB#V#P^Hp~BsGaU8$XIFcyl?|eJ z8#kJR`z4CsG~Cdz`S?=ZShQCNY}afl5o;oD$K?twlM$q?rb?5o^lIYI9>t;@>ipXA?7v~#Unq0+ER#mq8%;`< z$~+{#9=X5VJKEPaM@&Ni2By6b-`%c_Y!;rOOUKwhR@9|5SQfj+%u(n5ga47}VPU6h^~?J_^6j#)r6WGp+pLEp< z`Q5oN2>mLKJdkp>eA5Mbi8sGH2apQTO3*K&y=<~mTjm{cDe`lNVm*pCtWfP$GN90R zQqBV0O|k$4M*+Q{50$cf3=Z~TmimG~y?<3E% zt%_W?90vonEQ%nR4lI2uk}HkfBmHQ6s`!D^D~nA+ys81<4Rc9GAuv^0^AIZ|HLgVA zpO^brsp-0nf=+Q^Gmr-8od&Q=Zw(H+9?~QEvBNykPl^qhYt*SNdQo@kWUaojqSduY z%eRl^{pdy5y}44jiy5{$I;K-TCvkq5?7UzgU>Q6PEWr=q$|m{K8bJeg<+I}MjSj&R zCtOgEX=Bz~)T-9G)vG)8!5+I>Md&4mnuJJdMe4q-`5?r}Q8Tk|$Mwo_M&NFz;QC3N zYXPunDlV1-0wDjTNBR%JZm0ZL4=Y1dt2MndgglMEm4Fh#s)z<({L$ zYg-ogSD_^5-TM!vc^_x|*N$&`1oF=~slF-C{h$Ih0^$o==k^57QSj~NeCLI=5YtCX zWZ9W=W^zX~-lt>M=c&8Uns6n#&7AN95_W=1FmA5wZ#ea&L)d|uw+S$2B6J&CkpK{Y zx&iCZfn+@$*k=9DYw`i0WF*E`LF~)kW4CW#?m}=41%Y?8l!gL;dpnP38U^R%Jft0A z+X4e55E=(2yw+N+tzHeg*W0gXwP;O3Nag$GU_u+}lq0y0pSS28(mMP;kvrJVIdaZH z$&%k+67nMsVsBsTgS`y!NO()9#GsW#^u=a0#X(OPoKiDw8Zu8v(<)fyR+@8t25f7y z__A}`QG=~l<;|os*FEg*(5jNJy5kXtlKuSYe<49awUN@L^E&-AbH8I-BJ@qle`7nT zUFg~vce;f`lmSg|cpVrH`tTXJ$Xtw0T|Z0A0t~rll2D61Zbt)CH34a!GZl)~jJ>8W zm!TckkBQ3qSuXYf8l9luRD{`jAx=0Cjh1qQE>J{NZCk5_0yz(cHGlBjLy%9E5!Fbo ztp4cSvpVAK$=5*+Ca1@+;$|cEn^tSS{K+KPNv&+9v3l;sYuMAA80v`XA8LeSRoBsM zE21n*5uak+$H!9_X23$9bI7+YFcn*P2Rl!kiSDY1brdIHyrccqiuOKRjq{ILq8`IB zZFRhu&i7!Qag-5Trc=r-N3^(if3xdJQ41l&Z(*nD)(N zS$5a*LM-opRLmpd>ZWh*mrQEP>w9P4Y*c~WoJFNI(Z%NcxJjMezzfPNllNEO_eqa{ zxN>+I6!g#o@5gC|^5sR-<(LM=k@MtoP$t4jWqKG&;D02X=WDVoUa_CT?R8~RWjf(4 zHM8L3GDWM&bvZ}b$~iu>PsR3KyUpwMzj3>$=&PJ4r}LOr*^xrNkMz6469Km85BoE* zk9vv9BVYMaS+~|Pae0VpKc*s1$$WDUXt#}u%+?M zB`hD@QsO!TU@e{XYB-7hdhn+2$7S?NMQ{MiHn0Fj>yl*m18&*^s07dzS&pE}gh_2+ zKC*DOm%Yz6F#n70?1Pi|(A|)hY09q6qW7^2p!8vWcqt!B z2D~t}e}b402C$Bqq5ZCbAn$7iwyk2R)c0~+M zMe7!*_mw6EnHT?3DHoOh7lZT_s;Bn}oA935MMjvufdP0ggAY|NIo*GY%AI~kL!4RE zJ0b=LG!$NvVhr*HsO=CGxn@{Bxp(ku6CaS|xL2S&7ay2yrDvHCby(AV^*ElPpD`U+ zY2c1P@5w@;4%l_eX!h^$3eGJR*W~60X_Is^WkZD zzn|Hz0;fvWD!)Qt7WZv*T9_3-fTqF9+ECJLX!#Bp(liU`2IwO>NdNcT z_r334Z3Fl;r4Q%%)3hBDop!t8aFUEUz&iOO@gvl+9In<-P?2~ugaiMzcMjqfuw8<9 zrWLnSdAgB2nxR1m{Re{rcBk_{Z74r6H%=7{ufb$uEaXQM8mr;Y1lT-z zQ+`|GI$3;eI!-0mev^7#*@us*)r-X>Iaxt`CpynuZ8Vp31||R&j5P{t7V&ra1C!3E zGgdDy1!-;d{LN?=jLjdNnW>7^jo(;6o;I+8BD*GXAk#x>j$Vue5NI37`79;auYt?Y zz?vd<{2CWht;r9MFbbNU!`PYiCqK$0d(&hCMhIRWVn9r|ay34snz2>G%>&4a{E?OW z>*tK<>u$P>#q4RVa|rTr1Y*>(owGNpH;iNs;eil4N1nrlVa%at4ia40KZb8okG_z2 zLT^L~`%TJ1Rovrv*AwsfJ?ieCO>-;X^PL<=P5A+d|KHyaDY3?Z-ZSV&ghQ=HfMNkA zmYUJulmOUQ?svYfQt>zZs>G;o&|B0TJ->;ZAEsg#RAL2@q0|A{&N?m2kn;rDP-ajB z1$*45mX{{;#&SXq6=9q*U!!8yZ^?8TQP;=vuaNmP3h3KKzA*E4`HSe%PH<hNUxX0u|^aLngWU$yCYe*6A9^XH^jeS( zC7h?@op<$*2lj88P$V@ovwoT?CP$un!CDfo(DV%N&upmC3p0qL(4$P%v)UTR#fdCG z_+U%#aEX4(L%-x*L=_tw_ZW9h;Cq(|fN&2R%Gd8AV@vBE7axN;Dwiy@nY20H!;SDao5`&y}nA+23n&KK53G$rNzPeO-7{syeU?WvUhNIa43G-o88ha)Y z${T9B^J)fpzQXavrWUEuOyv}r9Fh$*hbg#*I+rY8EwT@$GNG?Xdp?5X41jGi-qvdMqCdC>zwr<7%z>N4n&LdV}}d#Z?U z24|9g+Os9!p|g?dnqk9s$mc)yhJ1ddZX7HzyZ-cj$q13bh;X9~Ij{m-;yOjB#TdL* znL$3NvChHdtO=w$#+3S3x$)U>$L z`L6d)FW-0Lw~upHTpR2DG=<8_ z=U$_-?G|ORvE^@^Rawm1&R8`;G`u$X+?asldFbqbo+hm8l#E)Bi)8VO37(YP`>|c0 zkB7|TIuJs5usTgR1MO`4S!-@-hU08AwIrp{USB5{RISJ%)f#4pZ=(FHy`c{({%Vv7 zYK=%frAcxzhnVF4x;RKZWYv^nK=}z4IlxnG#EOt>zlR=7hzXJNBjzjb!K%Dc(cHKs zbO7Pl5_|g$Y{Zk(TRA|3a6}wcykF^Ef@YlBEC<(;{j$^86z|}=H?XYBYGL|A7#(zN z=nq|rb^EO7R@IEauoLOVH#MbK8mj09Q%th^!i#gLzGq@W8MD4&;a2^*`{n{fN6)C$ zh@r_kPR2CFfGabC&;n@#9(&Htg)09l_4KR?SK2|5h&4bI-p&~G-^7eeX{NIpznpT0h0vpF)7Uwh2q%{D<`nkEO=T=Fb-cFJIG-V zBl)CM$mP{&Dvr|C!Z1xcP7G7mCCdbll&al?TzJ_G#NPy;yYyzW`sPA9ZJ8Q@d02}S zaDmhWmK4!a0W($_3eL#>h82kaqDSQ2(T6H6e5icT(%FyQ8_HMiD~b3Ikx3b|!!bMZ z)P!X!NwT>pu>R4k}*B>~R;>$mU~+D7&_)O-CZc1v~Ng5gHNxb(q1Kv zvgSKbqJ+{>Og?JdhzvBY1eKkrF)vaflQ|l&_7Hq%VvCMWRKoIaQVxnPW@P zYo4L1W`R`96qEz{$^l>AtH6Ni+ak&^|dB&?*N5;I6Qhad1(Z*h*`DtrlE+X3#YFlgo|y z5mIs(d(_yMBAKNu(B$EAky?tVN1FSSMWbYNH26~H5X^PHW!UrZjetFPTfTP%MZebjz!I>q*6f6)l&(!l9SE)5%O$^+GDrKNY zQp8An$6xk+|B2XtBtk9i{n|pH?*T>=p`@q8i*C$>gS)70USuQJ<`~?Iy6rSTgZ1FYF*IL$Oh*i}_;=sVdHri?^zqWp= z?cq>T$$&Poen#~+#5wHDBBZv5Z6b3LIQI4~;v1p4Hn0Vdb_L>F*mleHVJ@!{R`Ip| zy@2Wfwunms;0UbN(SsoTG$fZcE4nAaKLZYDcmR1xedA^FX#0|2lc*b6_(g)Hj+F@W zGt!f~d-xihde~;N7JxRgV1Rni`DEQ(Qyul zs9Q%dr1jtb?+ups#hJyG{7>@ZS8*sLa8zw5AECsjZnNFmBb&#yvp1bxGAzM*d!wzheh4aTs$&EQ%KIxWd4Z z@n73T%VAB89MJ>>XStg0&vyp>BM1Glmy1?eslIL{suL3;z*R>B(L^uHm^szdEvb`|}CCDQ*`V^nIuaY%Uk>1t-Ur==~p-{R_sZ zfDPpXeh)5*n&vJ>I!QUfo{#LCu7!}nDM$Q17qgD`ak(5my*R=nNw_pnUQ5H>l2ph+ z7f#{&(Is@LMUtM;NUw?`dkrkWXh(e1LYPfxR_I~SLvp8Lw_=#w;~9CqGX%p(>(*jb zz{fz7Dvz2&OA~O@oyCxPP&`?{KCSn90gok700e#_3KADU662TGnRs0r!HOU%nH53( zBtbNpge*Mf%7_D& zarVF9|ByYo8+B}xCxB;H9uK7#jx;gZIM*?+dbsIogS5!C_zT~)#F7Q#I8V4pcwUh` zR-~3w%hWNf&!(-&V6RV=-F8DU<~2h4gl`~rF8V^9$GPsnxqKunqev`# z^v#V(pY+e(9ij}K}u%2L*ksuKGfY1XtWZJC77Eo*PO3Hzf@h$)Wdn-*4J39BD z{%a_s6;nKIiTg1Flz~-D$>+eGm5j4)axsJ-Z`uzyC&?S!kL!q+`#nPBeX@TpSE0~k zfsuLmzr015`v9Ut6HZymx+ZaR7|v*T`nvaDZY~-4#h-nEA575<=*~32LCT-V7n(>9WvyUB;Y&Bl=fY`X z9E?$;&05Ln2k^}4?fQ^jV`ykf(4mTq+C7Qcl#jX_>P9n8No-9r#&?wAUI~ZQ*q_#@ zawn^m*-f+5%)RX;4eH@L?S66W;9bJYlGoQEUCFdL|M1M#`v%s&JU9uLknKjsAzSmU z^pOwL3J1m?JtQq5ecWob!nbO5*EY}~nxPEnsx;woqK+i`{Kgcwnl!J9ZP=CYA?Z5; zyMYfU4_hCd@7ZLoNsj9ez{${Qk1CT2pE&1p(!m>R3-lj6^(fJCY6QXXgwZ+RKcF!C z&1&jgvvZrR+9^p^)jW?ubJ?W0*8`6OrJ&p01oH8h21f%#gb$|7fsQrc-buaz_dbpA zNRV2h^sgXa>clxuoQup6YuvjMlsoIk_Ylw}_!xuA#OpnOud%)CG-$RqXSD1KuY}`Z zyW|<+Yb$~%Y&)*ZOVvu-^aOAYy2}snsO3q66uP*W{}?)ru0T1C7gkz&Te7P^NukU2 zrc$y0>E$?$tS6GMD!_FpV%4P4-OVP2(f7j}y>LPZ6`)0&7I{){>#J&RP_G$GLfhL# z@O%&-$Cd2!CY7M@3hmsLxy^LmRxJ;@^66@->khHl%wJ!HYfSCm0Ftnj-r4H3kLdO_ z;si8X!Z`dfYG)O{UW)vUq==GlFl7CcGxO1A>oE<3f`sq7lpV!v!rg~z3P@0bYm zpU0L5%jQwx9Xd3!Z=z!yxNq!Kd#=NxCy>~rCEpwA#KI@OY_d<%toCfl02fE7ZRu*^ z4{Ew1URb84uQ@Lw@cgvSy93blvp`)DdE7v*B~WDiODW>?O1RI7bDuvKc^r)sbjOS;PWtw{50sQ2Zbq41pkRk14a?N_ZN#Sew<eg(_3H_E zLT~G>YPP7C4yH)1zL|9LHTPKjwAFVu$#t*x$lO1tdS1;ISGivtOY8#78ZJ#1B7&sH z^$*1pilXr{1*@nBK`$nY_W>E}`nHZ)WHj_0^i0o)*A)vr#X`qX(;M zVP7#HT;Le2FXek?XgBhWPesT4DRTe4MY9P80cK>=cvPW$S1N3Ufw{x243BNm9BEeK zqWXg?CdO>Gc%&Q`Yf@oh^;epd#nVs_Kc!_6Y?T@s_(*>u-yJXfpnS+lU8maDwtPdE zQeBg(r(QG{l1v~qyFsnoM!Htd9rkSWyn9LC6Sab6a#8c7SZ^ZTup;z|f$8|6)0SlK zf{d7_EZ!CjM1#r=mu;OhPTSFlgPiWM!nevhu8c_+KBUvG`#w@m5Gt76(?FZ@6Gb@A z>Y<3-qpsqFMn&2Rbi!07hU%H0&FV2P`O@?#LfAO0HhK-y-IGy_&v42nw6@{9r}O@? zxUHjh&`HMcHTSQW5VOtV2~2Qk{I_X4YH{w0X$U{u_w~umgw4yY$VF6YzR<01y36&b zcJf4IuX~!6xfW%;S-7gI2SE0A$4;P}A8?(7F}u@6#`~C^@HeUzMumLN6UDrboU_I~ z75BZ@99lPljJ0o~L(~0$uoI`;l2S;S)YA`!$Mmn$Hy=(2O@-(3+l*)W)t!tzDE*_+ ztVoqpK8Kz3Rxk3%^rqyWt%@?P$XFZ0Y-}k#oZbMoRo<2kIn=nKU7s|-aa~_9<>4Agb9W9HY9($ z-!I_F!ei3zfE<7T65Zp_Y3pVY-!qoT!Hf(Hh*w|+T)z=6G5z{FW!~+`x_z4d|I9qW zC?JU_(my!;I8-^3Oe6{Q!qD6k{v^!3A`SA#th6vIA%9eMD4E%9G=vVg@0Mz;p56@H z?f(cHakur8fq_SXbr`wZmiO#bMx@}OL*bb;5`pQ$i%f6n+15BdG#wD|eb!#}f+|so zl}T?$7O?jGD^@yJr2g%h#P?&}2t|rCnRS@pyyfw4CcU7cHVXK?L=Xee!|@P`z0LwY z6cq|K7{t)@JIuAb2zA^(WUb)x^8GFlT=bjR@mkXX^I5=K6=UZ?P2Bo+?L6F$T2JMZjt z1iNQjsez8i`2JXjCa_Xig5N89GGF_XsOlZLuR*l5*nh(8sRn0Gh)e{z+9pEn)yHeClxFBZZzie!~jP7nB2V*{K5KN7zLv-wP7ye2QczsO2&8%#~KEU_g zBkad?ZcA0Cd@d^2j`&#T8DVnx(ZCQQV11lpi%c#vVllUL#Z0 z*greph_PgSFPib%*!ZR9{KEiR1+|_2{mt~hXOn-nzzoyJ>L|g!eCs#xOJI{7h4J4? z{Mp`PyGX7zW}{H4=pSKcb~n(;7BSiNi5)OQ-{a>!clpp@d~%E3KT~O^2S$#K+$Bzd z0OchLW0i{*kv*dEGbd1j^Xb>ZlgqE&qu72s(v#rS2|#{fJ=5#f)grjH&v#>Up;+NK z5Uwp34Z|AAxi1wp6C0C^|2^PhPJ4hZez0-lIZvkWxN_@KlXw@p?D(14c4|GxAZdQ7 zVU>mM86BSzc}VD1r1q|{_2ra@ZhZOxK=cRJR|hDwZ+08~kWufX&JC2u^1VqmWJ$Z} zI$c9zud-u@pDs;%2`zO2va0RCuF1B%I#{nRW?h$-spNj4y~n1@bta6FsUq{Z(@2AW ziv@{V65SPl+D!IAHrP{@>(Xqaj7-yHo963RSmnZ0mhYMNOsOqKWA2$Zrd}LxvF$Jq zOo^!0HH>2=^NA88axI&hQP&$`mNq6jMHYe%)|j6WhfFUv@ibfFg|ijS^AzQLT5y4o z8OPEK`i7%n@8254%*Z%#O2hGos5xjDdxJ_Xxg9%8@5m3!!2%&s^DHGC|4z9l80)Aj z$rQR(oC+8OuwP16>_(FuXDu^aQZb!lHSTRc)l zGl?t`VyPjX<2|x$>Ym7NyzdKVH78EN)`Cmm3Lw`+h zEo!AvY9jdcWbeC(xw`@(CCIg6yKoiKsM|;)om|C#9uRw%_vRselndF&=hrBaDx7)6 z2v6E0)uAuD>$d^8W(cZqws*R!4|k6+XAJ6Il39}fw6lV z1{X|#dFl}+xr}zzO0cSwdsJp(3OwP`FPoe`1_&$E=N?%{VGywWmP*m*rR0efSILj8 zD^!AiLjL}$xd34&S-5BVOTr6+(AlZI8&P+P%ejTeYL_`MqHl7r4;J+2 z&^{Qey|5Kf0bg{4a{#YI!VEkRT zX@f?WcbN)d1M`W>>prIE!!IY}STq7W-3`MG_Ox;lbmUNvgcia}z@&bTxlum$rDr^H z_pVI=V9bBXj3J>5^a7JTic{Y3X4p21OfpdCe>d86VrnGI*2Yc=LH6G<8C{H|NLdHL zMW7DjKa^Wz^TCyh$Q@$u!(Ju!0BZl_bEe%!=RT<1eBCqAwM(b4O3W7a0|g8Dzqdi# zszmy#dzN9Hv!GGZIt})fUZ&fqTBt)Ha*w7*xx=X{TM0gq2ekK!iQexOxg4|1u8DKp zzh#EaKTESJn>|Uj#o5M7mD#=d+27pJD7hwcj!QiTm*h7@(%(+8z*CPGvz^5yWG-&S z!ik>1rgawzWg?8Zg8^|Fm=yZ6nc1+J&bsgJtPb{|Bf|i{SxBV&^ovAQQM3;rLhF5E zNgtjD#EB;UbGFm$J04IpP4)Dk?InyC^yi|H2|;?|R@*>Q#|wLT*B1rAQNllM9}5+B zVu3(TnG&2${H4JIzNV?2u)4>&j$UuA1Qz) z?;B~%CeQsNITfBlBe_`7fHVM#oqnPk@U7iI1NJY0M5_krBWidQkb~bx=R}qRrHRq4 z;Y*VMwN5utmaCD0@9+Q1$Zsw3*~mQmDqGe&7SK=^q^?K_rU zeK)<%jGM-5*5RLW>*%NfwHHgE(y)z@c(4_YFH|QxELxLT)FS&1j8XXp8shG-DEb*Y zW$CaerW>UfyS7e*!{ia*u9q)TS?S*SE$$kdwoiGFIxo>Xe_Go2!S0mZu)fJ3vCQQ^ z9l<!#;T^R!+_h8WwV9gcNJAd+Q@3xr%ncRh{ZZ@4xW|k z17swMQ5UsZCb$C~YH_NtO<7?SR#4}M7uxzpo=K&gJ`dydeHi>2tjNv5yQJUQPHN`2 zbaT{JGkWih<4>nJr0J|J)O~L&voN1^85(`9i*5e$FWmRO>rSL+Xug`v+K$5=2*EW?Xt7kN!mm1`Mx(HDCR*t`1 z%j>5K^b_QIzB#t%o@^|bYte+I?ssw+>F1vj!9bn=oBGzMrhk z=SvXFyHeCja6e@4GQp&)C>546$x7c?1VCokGPLIR2ey@pzq5FGD%s?NBZa5(Vlnn= ziD9A>1%iKTh2*4$GLUwGncQ2&)NwCa2ewY_bOn2IF&#p(vaYxVMazo3 zyFW4RpXlt-RdNoy9^4w_JT`k}A|VQh(ETGHC!1|J_LgQ+}-99Syo$#zEYG;|2kD#HAaL(bSi~ zb92<5L_AO1yq(q{T5r=(1`fi=Bx~v(GupncwumvvXFXY&0t}png|Is2arB^M=sn7s zu2fJxH^wIlhhPKWsz2OKVq1jw;U2`%=~$+iZ0m4&p2YYOZ?|b|G}2LL_WnfoS6h@7 znPeAz7$jq345-rS-@^oZwd?>QyPZ^B^-MIhZ7x**Hw}nZ?6VB4xQ&Fq;PO-g zx&ckj_uM9om`F`moQWGO_h{4Nn#xDuj!io*nnuh=HPFDyvF`3~sX>xm%nI62N{xSN z1Z526AK6fs#*?gKr^Yu^P(qj;V}-w~E6Rk^>X=o($ZE?u!h?v|R|3Z5$h|@p#Ld!S zf(jv)g&cwM2nhdtb-(a52>~n+*H(U_AA`~~_GuHyVaJZDGg1S>Vz=-Jl^LVs>{5&l z=~f*GLU8cr2pt+q#uSgUEf;)JrdQ~nzz52mf`JGGmB|$S(Q|yo)+x>CD_hfI4 z%8RLkWugM(zU|inBS2sR|04&6sy5|o1J&`3b3gZ>9M#@7{tT`jtAa_Z$3d@F)AsFW z@nW7$bFpM_rIuppfyx{Z(PM43XkMR7EHJuPe6ATf4**>@ng1!d8hwMc!(JhCh1&CI zTu{044HQ1E4eh=Y5c>y#A%MhVk0ur{-Hg@&U`9c5F~IC``u5TFsATd1!Ji2-zvXAA zU&y(VB*rz=jHs#eS((2KXb<=*#zt~ld_9f6!;7U0<7|7S{H)=09U5!+7 z?E}xb zQEF-+*r1#)!_Vkgm!$pK2*y3#44dJ;zaMHU6qmT$rVoXQEiHY)*VT#7UdXUF){mv% z_AG-l(elgLBKDhNvzHmPkK$rq8oE1HGVtNdF zS08KZ z=f2^)Hgi;la2mc4vxud3GHC(DS0kl(@&oPqh9k;d)~Vw72;!O7ji-k1F<&3+xHy{? zp7)ukFPimf635@j;7=6`JL%%Zf+EWA2;OsI8!I_R_oP-#Kz>D4k>Xv5b{ekdyW!tO z4QnL4Fpu3bovs;^&jpo#waXgatoLLQT$V{3@9BQR*w_)OG-%hjuKTIi0;`+BlRDER zQN7*tef-T>8ztql;dJelW)LU*T}(I~h>xVh+NP&F)wiJrG^*2fKT9w|OvM~Wv6$|9 zw*fH>@%}F_WGc+To)}=WIyQ=V4z9XRoB*0cbF5m*deg8$J?w) zUvog?k}lWD9tCjJ67{1MOBqXa)4paB$h2`yB@KvV(tXldxeQ^%ZSTvevS+z%T(4zTvct^0?19C7z9duz~e6J+0IO!*-S4}C|0Lz%x@zI#3u*eX4-~9lRw4Xy? zwLc&%#Z&Q?{5Tc?8>E z4o+N`Y#;0<9My^fbqrXZ%AP5?I(n5mIP$G=@t)bRe{7mp=~K|q#0a&)D<1r&XVlsR z%2$OgZLj7GOZ}+q$xGT$!tb0VOaYdaKQRw}QCF-hSj^;d)XhKnT1&BQ6h@X3k1Xbn z#^NhGNS`NDr+!XsS0XRKIsBvG%o;dN^}s1KN{a_4308nO&Mz~dni(`+pR5L7Y^>|7 zoa>+EnF!^qDoa|;wR|wx3d;!OjrSAB3Rf2){D=gW=2xs_<%~U(6)w~F(3!{0=Eft6 zWAS2Ky|4TkJB6HyD_*3KA6gH*-%I2=fW72N4G3K}RhWU&WY^9HrhV*7&iCC#q-gFZ zdf>y~Xs0;rfd?V6p^;z3wtPw_QB`C4yT{j05wG^VrLoU7P`%~;5O1H{kW#0x_lwJ@ z>BhF^=8)K*dcri?&>Irxr=7N>ASNRwH$Ky}Ikh1qjy&@HXNSfG-t1mhGofTJ^_~%k zD~yfI^YLj>>mtZ3iIbD}2*>@!H3}mQm|EuhCT#?maLGtD1U!n=Ip9B=ApBM}Q_~St z&SKLbMwpjwQ&3rj11NtG{0yjSO=7$k75(bbKd?`Me5yN0L8s&M6sJr|zOWDm0(nDG zj1AQUe%=UEH4RTr|4kL)B_OuJFLJU+J@ao)(#t5zs{nQK{i_!EfYm0UakixER}GLbew z4^r3fTgVU@zIts|DKT9s>EEZP`-!HEdAg1#u-@xuGoPk?n!vRg{gbuWr3$7*W@ZiWUoO@HPINyqxv&_u`IVRXPI_KHD&@j6}YM%psnVh>J_C{jrWC|M* zgK@2@qI2J&y33OGYNSf0o&(7(A1;(lh>2d};hY-$j_^k?n=P6RtXp z{wy)osJFLo&ZBdEbX^h}?p|1cg*grE9>QuGa;(A0)1)|TE4)9pBy21e$9Yy(n;fA4 z$~6?%HDpDuA7Fl_Q>$RK2^o}u-XT(%M$L^=EsNlHot3ByV=r5n-h8VRe>C7PZq%%z zW;sWIe@gb(hHNdSYBE+b9NtxfVC)B&M@$FUfGlr@M0|i|GCIo2ABUg6jBQ+8;_VDN z=>?jL!EknCZ~TM!n(CaF*$_z)$2zZ}z6zu*{ikma`nH-dl&tH3UtyuwTj(@Da7Vw- zhSsqixZW^${_XKt5i{GyQ5DHy`c`cE&F?3X_#=z7Pz1$Bpb>&a@rk`a@E3-TIq$ky ziM?*7tJ$n>rti?aw!xwAA0Ib3_q6_APkDJn8wPJmJ`9;bt&i$0w!*uHnf#2m+D|Ow z?vYgV4V(9C`HePwyIjIYbYKkP$Y1}v7p(?d zH~ow*B~obHIZ0F6>|6W6nL;!rZJ5WxMb0uOo{&-o(hym6+}Jgq|CU_G6D82cmyS&# zTsq{xyHFaEw*_7ZYQ(K#t=SzTjgMbI_?97|s~{5VRACR+xb&XbRv>p?Cg&x!64Vd!{iJk@aT7wZae5zUQ7#j_~_k_(^YJKjaEyLVr=9$ z`JLaThc{~ZQ^~x~Afz&>0|b|z2A-0iO>{0xRp|(T1^!$WWdL>x{d&py_r^HM`J=>S zwKzZb*Z#x(`~HEO{3;DhXD67MHw!6uz)dafPxWtT%=fBe>-4CnI~@!!630dE=ljRm zYHmK_1f+j3%OxdKDFYAq?5J9AmVhM!sjWKo;biY}_3&`}L!?-GH90T(*QzkqB!~Dd z8Sh`69wFa0;|u+OvUiQc`p6!2^y9h$aS_nno4Fw{kXhWup}U$|?Fe1*ghi9Y0+MC4#J0sa{!+P{6A)u3kLIyp|oq)_ajnXrh}P-=baQ1dYU-? zB8s&QHiQ0PG2;$UE1DMP*8<&Kkyp|Y7&r9q*#m9XP_0$7rUdVRoS6BKm*BHnGG5;l8OMUhVwgV~6OE1+@EDX2L4!S!eQj)`r?ws0Puo%L zb+?&uV!pN|sByD?kD~5=G@J}C5jd3@dDY^(v{yMbGykwyt95;5MJIdyIWU-0=)CyG z;c>LjgC;P9PZ~DLbdcu#*W_43vk51-Tvlz zw6A>}VqNJhQ(QpeMYUG8{B*Etwc}LxllhGwtNS--5iD_iY*8e?I(Sb@U+ZtFfgP(H zwF8@FTUzdqgd9%M9pwC=79cSKBAd5_gWb@DMsZAzW&#W`cfd|^MzzyOOH11D&Tt0cFkWe0aGLOeBK>#+AS~*( z1kl;mVN;R0(gVk)E?g~N!!6O_{yKo=@e#*1Uc&N#rG1ti7%$H9)W9G=w^J9a z*Ioy#$WQ;(ns0Sfh7-gMPO}$5Ty*qdK)r!Hz6CG9!ZGa6WN-hpX!lsiDCvVnl6F0q zVu)+AS{*~$Sp>&Odq4DiXvDa4EkB?wXeN5UT~DLf?zi%<+m$BONAvC?QuR4{;%MJ9 zpLl}BCJ_@tbt|@+mdj={U6BSUYGU8lHIgA)TK|4ShY1Q(cvtF5jL$~D+yx%AFVcNH zX9v(LAJDx`^stq(Y#(cR6LpjSCEH%C&94x}&0UDmw9V3Vo(@kJb)J}FA%S44dz5Kb zIxSIMHN&+t4ThQjLJiK1)|_%r?t^XC&DIFXlSXxa(ezgN_kT6N;LXJ@2~sIOkcfJ8 z-E`Z5>a3 zy5bI3okS%r1nqEwBWN($d?U}5gw)d1XZjR@_y*b;=$b4Lp2`=XC$P4r-^1ZWG~WPK z{L54$4~X0Cm#CFQ+1qvo^n+bR2$#(e=BZV0pc)S$ymzT7VHnv`Nhpm39P3p8 zCrAZwukdzXtD+*+^G2FYDm`mXx<|ha_h*}{KVYYGP3ezm!pjxSfgO6N<6#e%5Pf`X z#>ijmlVBdyajPtEV!}xpwWgAO@Ew)p@^#(bNMHUC{fEU39B_9@kO3NQDRwNY1;-S3 z(f1Sd%c;^KorB2$=Qoiz#NNm`{#(MlvV^gXr;I>8cWN_xyMWAOa#R!CNgq*8Oh7&8 zfdPly07$Z*slOYVt(X&wA`mGc;?XteD85h6)cmW!?t77u=vkUr;nLInBgm(&k3H0K zTzfItr03#WMzB@^vrVq$o1*=*Ct>Vw$a)PWnZGP`2p;#xwC#ORXwIf>y6ae*go zf;UO6*rfz^n=e6Z5K(PWNVN^Cj*k5vVlV%CzsCf>6Wwn= z)M4yT=rx}rqrcca`V(IRP7abO4l_Zv3?r-|*+(aNFaqQy>Oq;c#nPb8d_P%g`J`zq z^?2K4vhH8L!J0@q`_b1(^|6_mR1Vl+eTTah<)F75RD{7I7#eUK4rP8YwobDc1 z=;};jPFfZ7n|_XW{OeK{9~y6avn5Rr-j_+tY?SDeb`kPg!4vLJwxeK!%d$oAiRAxe zv*m<8Q?ps{8?yYxbTO|XmreTF%w)aw&`ty!ImIGL6WH||YO>}0kQ z#x9;fnkf6iw~nCO0M^iUks5DOV}hLFyU9e3e9<|L+HdkspPZV^VF}X}Q?#7zX!+_b zOgk&QN9~@6oRcV~b56caIDPVrnagav+};m5^SFB)&j&iik@<$S#bok{r2z=>hC2pbm*CNY<_1MDtT^9@U?qzt_TAg1ik1WRAAEJC&j+hL zFL==5j%#_z+pU_e`KNb0id&D2Jdgl}b}`eFg7_200efcDp8T~zMYNb~kbHvGO0Aiw zk-l!9Cgyr3nuL25+oq`NW{9yC0ve2htx=YCOStIA>AR@9as1A7TaT)n+GeHRGUr?9 z_Hq2lSpIAcvV=pN34voRQ9EczdG;70d)rwc%-h+QG^^K*6;m6^IQ`+Ldprua@5;rj z(7@c5jBlRwwcT%9awxo&Q?sYT+wz5%U{f~sC8IP8ZIyhNv-QTfGUKTLVpy`=WARZk zNB{rgd>!Dl1sUiNG<=M7(bo~V1h4>jyFgz;wvgUQ0?RBwhdDFj30y7kCIZz&r)^fu z-pXXX999}0ziwuF2L;M`oJEdMvrHT*@kKaz4+pj>E>z}Txun-zVyUI0P4%CTmY(h! z-}r_vFz%1}=K7d<7WcTzrjFNMkrFOznUz`vi7jm<`sLGOEwPXVQj;(X@AVF;nJ0%< zAV%h-XHTg02lhnThK?1QEN76O=uU>pHWEVVAedTxosmlfCk3O&gvEc+hgYrJu-fri zYJbw-t~D2EFP`&%A3ppbb=G_QA%kP}hf!?7r$vVeHj?!7iNm?SkIEvJ;w@W(&PB`S zba{BrWZI0?b(-X9t+xq3`F^Y=u~ni^dl2;}Mk%~hG)IYQ9P}y&U$W7+f^Z)zUUi+`s8HdXiyeOLbk9UH@6WJLN|BT^*oE)){`3*jLIks@SWM}4i@1{>Mg{pblCfApaVs#z+u2FhYYx_g> z@Sq7DU;I%V!Y^u>!=7svj`|x^iK|2Fz2EqDPo&m(w<~~P{rwL4H%yctb{o;j9=iGlOWWSFK&dO)C@94pAgT1!9CHU`r*7kD`B`K$~mp4Aey8Lsg zW|VrI%QseoigGQHQS?(I+(CrH=g^0I|@ z8K=_dZ}8WF<$zwq(ii54QzO$G4yhO9KW2O+Si0t3rzyVS!i#v*0gFfg!u5=j^|9!F4H6t**987jipyWwG4B&Qz&mly zk#8FK&q%y#2e}sL39@gHwfcYT8+k?@D@!N+S7H>L)=v2@9M4MzZD)z!%y_YPY=6>P zS?&cUD#AeNVc1c_1|^9kJbRz9+__zEv9YfX&gdE4tII}E0bf|^3E-!s^6%^a+D8s5 z*J*vb^*zKMm-o<5kG(^BHj#NE<`FT;51cy!aG;9??>Kesh=X3 zJg~z^hWI7W24R!oeC?COhu{KlPP+OPHWVTr_J`l8f1X78ifK;9s^KyrgitM>LVE6$QHb2^=7dbuIs$gYYj$F>g zF^TIy@yj|3EBhjur6uGg3E99;U4rpKC`L}M+W(u)^p zy`St^$0mfQHpaYGjA8%-eZ%(za`$aJ|5%_|q3qRF>~NQ`ie6@38Y`@&(!ER)ufNS8 zd6|p=?Pa|FF~y9}L!Eyf39URf&8aZoYm2dZ502*M+M33A3a2iag73*!`N#mZbx*}e?O;q|PdejV?- z8?o~X^C8zw#lj`^nERO~a3Pc_4jt}40AsC^jB{_%ESaNDSusb{ef+|MrL!9pR}CNB z^qZ;la1D%KkHo6bPDDp#Z9L~x-rVE6w&mFe9lF8-AqRVi%y?%ND?tu}LSPHwzq|F` zFj=qs^7~bD8g={DBz)t)r&0Iv55?%oh`1VvdKB!D` z{F8sk@n~a$ZHq4lB$yldlJWqiT*frnk+e(d{UUY%;Q z;;D3DDPjb2-DT0<5s+J=*UvzFkb26qmcy6U8TtFrE{MqTx$gh0Fr&tDZs zQsr??B;(5a?nF*<%5wu1F5P9{4{KjjUN=l+TIbr5wKGe?588YH_iQsM=MkQg{w21) zjBv(HV>;~(2F@bi;2h(d?PA-h84dYXW?)Y|QXJj%tYdY2d9t=^Ce~!V3-WWNNbVO+ z>P&Uya>z6vkf*stxBq;=1Swi24AMl3x>kT^q%1kI)TaCMzux|rQOjJfVd>*zjwp6m z6{*+bT58%>GxIOdaW^x;GVonJ!zz3~KEwdB9Z~m7bpXh$;F8^CV#ds8o9V6L2R&^M z@FDnWK}5BnHi$152YKE_CUXBXIqtB2L0(*$JPo0SOIm4aP>u25#Hcs!L-(uju)?OKNJ#EvkwO1)X}#4dx1U?u}pqf86j4TXN`McIxJz z{j7S7iSfqHxc~WcKE=(QLARo76(9IrxvOuGxlWB$wgSX0xYsNI``;DnxvyHCEzN#b zm5Q=_9hGw57hu6$<-fLNpAmZEo8C^L`BF1H2DInNEgMj`-cUz)EvIIi>7L;~{rN_uPH%gA&Db8JvWBHvCuj}A^VIjOmQ&ZK z2!oWfy8*@LwhN71Kvkx*wdz$tgtmAKX!dP;wOqa~K2lW5OFCzD>k8NNKlr{FUnSk^ z@Vqz{0Av8`)uTf*9Y1+i36CmMp(|gF`lkneFRvLhxvYg2Ey}&X`O>}|c8fF)4X7%; zUw3=dF%#^)l_m;AlJT}Bqct^a@{N^fUBwVvrokn{71ZMpl$)aY8v%NFb!_Rp$zXmd9e{q#Ldz1hV%eE(8?MWgj}W9>3NGe0uN^`2STNB@6}y$O61 z<=Q^XGuc?1bYCEulolw^c3KoHc`+Rx38X18nbmMDZ-CJy9!o4Gple}*90@6ADZKwvYODt#~NN}&CN7dd$;Fj1I zI8$FTTAYRht?HeKS=Fz{uu|TY1mt<-+WZjm#f1k~g*vM#GQuQg^S)8^KzM?zHj~h4 zqrp893&BI?FEubB4^wHT%U(IEZ#w-}!}*2n@zqUw4@v6O*o1UO{}Lnt+!8Aqr|WH+ z5q`yLlk)ZGYn|o@kme8`H|Agu-G49-h&~;rr~4-xI5zo;bnj{|JUD0vjp?F)8I_|n9`Gcc3RZb3>-qZ*XML~m7VbXQ zB{ddA*YRfKxgyl^mpY4nd(`*COUldZo=HAwPb|yg{kJY+g>xbDooH+%BawUkUQA}4 zr*LpuoWZ?g!@&<|ifRF*fF49kE-RYYlX=L@y1(Jk>34KVOI@+2O%dxmfu3%(PF7`7 zT_SHja+tA_(Gl`o#@@+X0i<$WC2x2*dcWOp_~pARS=IG&;a%luGEkdf>>yf7PYwbz zr$H3QDz2fX!g4Y~%+^URgIH^#XH`~`86jFT$_S-VVs&)zpqK54uLFNW{Y=VJI|l25 z_67B#gyA^3yN*O~F7m7-P> znNL_m$DIYOLWreJbp}0GOlALpcQ1{^8p*E`&dCK`%1~SdTse$5b996R7`L#8d2~cr z(Hw2Qx>xs3YyV4OEi4cKp7BLi4m9DqaA0FDMm6;?($E!hfAK_eK+S6YY27l&H|oIdOWT%Y<{|Bp`$1tMhtp=l3IG4=d@gk=2L*cF%P*z7Q}i-%uT z?4Rb&a}Sgf41}866V$G|onoY@&ey=@uxV7c_iZq`{?@V1U40qt?a9bjQV{o$&2J5m zIvQoK9r&q?pPJV2zoD$Xuv>g`Z zqC35cX}MQess@3f|6V>&!uOPmOQOq~ip^qz6HRZK&J5?KS~F=ICuRb;!7*Fuup=PO z?0JJ8p&Vq-9&I@MNby57o-vcwZP5GQfcw`d>K_pPs=j`&P^qdipD8n+(N%dtu634J z8x9%(BOOm(Vx0-X7iw0`D)GO3qs>Ce|EZUSBKKdy+OpRLqXSblXe(@enky1$oVgPZ z060$DEa5k*A`3_xngX5oI2M{hWWw<-PWS^kqWqBjG%;ooAdJUF>!3ICS```N3joBs z&3VZ26EZ-mCkFDJD85u!eaDbaLRvETjMo??59t5aL{=#!=ASRM-y@vxT~)3D>Jd2; zI#;I- z00HrUkZU(zQFaGjYx=1MyGAqoTn_w}+q+@hs8`p+5~bIaIdPG%r}@cL{QMqNs%`fO zqu_liOReG(?Cf{zvwTkic4D3&hVykMay7PZcr~YbuxB8#~s7?J0(#UpAB#n;? z399_e+KtcyHaw7eqGy^$G2Ya>08fo72|0rUeQulgk_555mb38%X5lcjkMj6Bp&;yYsOEz< zveKkl64wo^#!6j=v->`qdZwAN`K;=Njb!GxzVGJ%;GL%T?ksG~?_eg8a#oeQ5_w2F zZ2BXUb7}u%x`wlHUsO(_@&>m&88{u)sGgCoe_3>gX1|H%ajkOTdzRlT|lW@2wH z{Ow^EEsRG)@+xUK2Asfm(7fFA(Yd$@n#_Q@&?rjp7j~+T!;)Sk-sk0mLjn^Vm_`V=%vS70Js*WxcA-!grU8Rcxta#1%4;d^AEr^eI92oNm5uuBvfU znYiABeE!hD(COd;=7V~BM1e*mY{PNl8|mx?lM%;!$myC;jKE`JdO&HU*li<~Hkz6| zWg`n)(Z7U0mB@!?@FySDjRypb@@2{~F{}%UO=ln`G*nRC!v|*Z;R^9VItIZcGnr@d zC4y^L_?~p83p>a{J#FASPWMnl=Ayrhip~^QcC_54jnGb#FJ3d>S)6tRwl&f~q%1i0wvA2#HTEBd0 z74yuhY(E5Fj%mY(JH2IpJ?528zq@L({V$K;v>95E4=xjzde9De&|}mGJ9S`2dNw}L z+*&90{w)4)%OS6E7aicVOtYJ$1n2igmeDUIAE`f$2k{#zg5B)bXiQ;51N?}6Ad~?S zh-~e+yug1&YG6Cl#3qOT{o0tGm`de1#q7|0N-Pe@G%gXQtMY8hnVhOU824b4-PE1z z`sw6Y{#=UvtS+y1prql|WL>(hT<+Nt%bHw$t<93b_rk?igM~leCVX<_xU4{Bm)H?m@w()SHwDtT_Td@PY3T%^@3Er$IPFCRl_t;KIc$ zcYT3k;667wq+sC@1fY;%c)$$&ueblNUuXwCEaNODPhGSf%B1E2VS&1BAs?s^7eT0= z?i${`tBkYf+rJ?vDV5Zx8ht4#U8fVyGMn3$^O3v1?oAWN)^XlEjcTV=qc-C%5KDmE z`_&6hAz*QXlX&VL#1r9@K&CvQ8d$+gvrz5cgb`(({!|Xe#sx^XE^<9p_>v6V1}w&Y z(wHFZ)s&1t{m5D)HZOC*cTpM7C6^{F6P7AFpK{k47(J&M?#mIrMvI$lP(bWyj=ll4 z9IcJ%s#~5*#YEEHxUwACr8>S+C{iMF*%WFI4(U-pM&2yF@&}**>WV>Appm(UPfyN$DFfG|{Whr`pt32C zKjhxeFtfW?E~lsJ~mZ zy56%C^qa5kLhV7=H)cs0&n+0=x+(1(^eAHQl4g^DnVuZjawDZsY@ZVDohZ z~qNdOnR1j}SpaS4``0gMYY%^%yR$TL59C*Ij<^9XV#om3v(?&;wLlIbIQ=A~T zFVX4wmoi=1&U_(TL#)UOtnQGte`H|@NdVVdG#L^DvO_(go|t|tEftq@!VxN)e2c|p z?sKqkzxSZ>1@-~mqn8f6PGtnG$AOGsiju_#b;-0k&fL(wy?@*`ZbhVKXrlJ^rp_hB zBl)Iyk(Nx+Hj}D4^u9?Dx%X!Gq>3i^VPp8!&lJ1EgU4lV?oY!cC$jib)kNrUi*SJH zT`A%NR*L21-|<(77l>Pm<+^dI8)f@|#XanX1C@8Xs%;q`F2NS|1UnZ*_0AsBN4A>+ za2ZpDU?KX#btn)5j~5aNr`q1CSZj9vi$=#e)HTyR#JqwY2$HhO#P5PiWE?PHCe8%R zRo@TPOig^lL9@}?u&`_(8FHfGl+H5=T5l#X(HbS1=ccysTxtu)h^3jfJNWk(@%~wS zH&u^9a7akGlr$Q;IOckq^D|u$X&Z}sc@NdBOrtF_PlhdBm?(6CZ%9$~G}Vk3E1?-3 z7uV|e3wr+Nd(b#)B=dax7~=6AzZWp@W5vlZQtqmydg9c9*JsdcUz6nuvqo9BL0E`I zA>J2V-c;;xrZ{)hnwYJmG!@4F9NEUDQ;x6=OpqHNIog^1zs}Gva6u()k0s;t0M#>V z>!^JQU3@FXeJ*}p!Lo0=1N?w9P0H(Q#RsDgp(lu9GdZTIQMM(!{!EgE->LIVvSkZ~ zJ1{sdQKm)Yr8JVQ1P4%{LvAazTG z8kHHw7#Fj~Vu355q+*}xuc#D2{Df{v4J5$;Vpn_M^7wb!k4?o@Y~{DNyVu`rbb~39t~qwP_|>=;zI53&$bqnH~5_$fKB>UkH+S8+FjJ{jA8MZx_gC@>g%(4 zf4O+S*M%iDcmdgD3M<+&gx`^~s!uiXQy+S(Z?d?&?pj-}XRel54FI$GS z3Li#3S8AXk2Rg5x1KnEA2`{5G1}mB6rDWHs+Fbm$E#LJIVZ77dU}L@;2ZFqh8b%~U z7l`o{I*JRq!5wCzHHH+EFd9Bx%VJ@!y3(p#Xi}MiKb#8=_79hK={lQdi{pe8GM~J! z4%rB&ezo2AWs`=P)53)M??Kz1+astQ1xbZ>VaVpYoZNmZq z#dWt*Ieuz#(|`FERGcqU>%FSu%OTAd#-usZHO~rZKJ`JjK^K8Ex998D>98F+F@6hH zE%T*Gmg#-jvP{pqA=9Z4zYvq?b;zgCB*$(g7aG>g0Z#3XRMFh~Ryy~H&C9w(l|M#z z+R2KU_HW9sD&8?glK7n?S^JM2e;T@)BmKn^dEDY)A~kQYVgeB8?CVbMCm%wBz=`}j zcsqy%B1@62bT_At%Ulu}x{-~d)9z#H-U5lVJd8&5-Z$v0>D5O-cpn8vI#?l487$X$ zQtbGflpCKEEfrqY)R*$oYOx&3%tMao1I(K?C&%QZ>&Ef->n@B_l>*mXYg4yjfsvhh z7{anqA0F%MZ@4O5{_^EiQ1I$LOENR{@$R0mvNMD4PH`7X%6BY1fNCnybRq%Mh-!eJ zd{(lMLk+_hzPDC*&g6o$=J8DDVUGg6>Zp!AFnz&pS;xYa&Qs}IRrNLEQg3B&vD@HJ zaE68;r3d^UF{B8|D2olYW2w(WBMSc-6UX~uCunA}ka2EW2M3TK6?ZaXbkFO|Oysdq zNNb@O)L;DV#yj|f(B!lE5S@EINaor2Bxkq6q_{rHdDLhnZPSDV)ZLq)Hjo}wgsA+c z_#nD5Ag#w+htZD>e*ZX&-Cr>`?iDk7**ATtYh~SO|M30uehXRb*Tr3(L%0(N(d|*P zU7TWMf4-`SmLd$Y)3tE=K(mqZjZj|~6zPDF=2eXwJ?!GJu+-#3XERavqDhS4tvwi- zH%VjfB6_%|Y4 z#|rIZYw!l1qBN@5lLu|BodaL{UK-Dd_2#50gh6ZFxG%_j$|J=flr>Q^qEm_Zs4dv} zU{r4pYu?q(o8X))RFF)QuN_rkI%lA&9d&bFCeZ&7n9oKr6Z@Ak`J+5F=Igc6Q6Top zGWpNyYOCRgSusmURQ~dUQxu~l^U4JdOnu~cRQBH^%uwq&WhJL>g)oF6soX*~PVAbb zOVpi2%dpu2zkMv;`42lH9s1Q8@U66< zXCR&91JkBZU5kL4tPtdYT4&&Nt*L?S>dQp3@-C7wZfhbSx3RDp@H3b>;E?fAGhBMA zjF;A+NQuQs$p2rz;%pR;2aev@bsqc+u2ZvEn5SmDAmr8U0SNiiPE$jDK?f;S7!ri7 z1km|=upBIOaajJZ2eyV{7PnBM)Puws;{t{o={Y zk;<*=MvLH4A*Q_;@taH&xjY!?q2>f(j;isNT9di<=uxkFRol2{ucqRm0R6=SV(G*l zD(39{>NFMVFw^93VFewhT-5Sjd9$(#&sTLfzio|hP1#r{-sN2yMA4GNHKciCv6<07 zfv}xR;x`n#q*_>?mMCI$Hw6}8{EP{$loNHi0#HP(b4xA9R8fula-~Jlm?!*5%%C8= zH013j*H@l+du~X%a`8dWA6t*H@2gtIiK&QNTA=4)r%g{hfalJCSbSLMQB_&Q6_9Ef z*G_P*$orFB(`z~1w*@uAB(<4Fo#7j`qDdFklIWlS!4{<*f{Lm{i@RhmK6rhd$dB?z zpAxY_$qIG$-H+6g`f$TMwY*aM{!Hv_g6))UPuLN-mWSVrZi$6pc*sYrl;G;k zEEN`$fpq61I#%-_*@}YmLq zhJ;rCav*=gkR(QD(lPi$Y!1-ZO!oPO8LFA)8_}^PO=V_Rk~5GEzbivHLfeC{rs@+> zf3c8?Y}osX7C3%P)m?mdB9?pS6d)H<8hVx8`-OA=o#$_Y)KIH-X~OsjP~L8z)dShT6fTMF*!Dl=CGLha^3yBRKol36ix*5OTD>W zc@Z+xlR1#>O4Q|uS*}NtioIpcpIr5Qsc8PtTkAd8pQBiCyad`}C&mJ8H(y1vvVaAW zb5sMlPypBT)oXpXM z^}kQ(bh`re$R^fNDQdLczg<95&NLuWZ8;w=K`GPbiB~|<7Jy*NdLlKq#(JnXjO02)t1!wmchB6~QJmaE3n&dNjjne5HRywHl6O?A7y@(?^{>EP@^+9G} zjk^{N6$avDK1akMrrw>6MRC(#tq^ilFq_~qw<7-5)L@p9oxPJd=KC~Vdc*of@7^j- zuZd3NrO`qPvqsT5U3iyS{doy>U?2ymM@d#Caje2!#ojcE< z_JJ5yicboARHatU3Qae zw0(b)EA^#0f0^e#KV9)90A(+O_ypTd{(nB&4)isqGpup19s_>vT;qt zu_5%=!ZGl9;1231ifg^v+87?7`H9(h*2a6`3}0V_*rX+74U)5idq_r|I2z2vpOTLZ z&TLrT=vi_8knH=Lus!0I(~^Q;AINpSP?_jOq^!B6q2x$Mp_t*=WJE@?@+>+@uBOik zuESr)u`H^hhlC$h$1T8e|p2GNE&{J$Qk5j~~cGU(KS z(5ZTJKjOFQ{U(^$7}i0X1|g0Kx%K20JRjn=?<1KvTj*AG1iiuUx)r_Toj55GQTXX2 zi;+nJ)*pcK*Y|gvcnhW2sce1I-9~Mm7Cq+Pk&IeU5reIv3DOJ2`MTd;4P6>HT`R@6 zrb}gAFouncVT>~qCG!l#2em?Pa7FB+y@;6l5@8+8OQ9F#+d=Y{!9TdUt&CGtCFqiX z*G+<(XF|9iMO*&Yud`Ssxu|=K0Of!h|ItyjqQD7^HL~dIfaq@bf0ZIM(#*MpSV!YT z;dA_&71LW&bal+rCR1NHt##_CYTtJMsU-eum`#IrQoKO-foXDoFoZJ+cTh3PR{UxK zh@Sp!D(I2g!L7_yM%m zmekyX{?>Yra-o^pQ%|%?L;J}_6Bgbf5>(ctAy8nAcQ7S#T%`hS9i@b6xh44t3)oct zYswGcTH7#k;8yYW=qUc>l}4$s)@(wH+%Ys{g}Qa?vH z)NJM)o=p5kFz zNQ_~eINOoKzTxG_Ojg198_~wM&@SyHpAM-o|E4+Lbn**bd)wj!aYlP-K@88aGA8R> zzoBuU5>?ehx=Nu_Wes*d+A0m}Cy%wdIm~=O*@E)=huq1MqAFgNry6vqij#i2YRs2o zo3ThI(qAH&7P&NPo#Tsr~eU;$LA?5VTQO z)&W0u=xYZvP#aAKf4a>rW`MvrIdrGdk*MWzI|xU*OTN)|G`x@*MHswa%&uVtmKmsy zX7DFdMVnI>&O_KNE`@b}tqmw6yJ`PV(jO*KjU z2REX{*{Ex1bOvUTTfyXOU-pvn3syPva}Yi)yyC}jHTYZZvfv6d0gvT?L%2*)63b(B zA1J0V2w)u*jZbfr6o*Y=U))F!gGIyIPw0?nrI1O~1$)EvpmCfVLZ?TZv;e<|X7)&z zSR4dL^-tt?Kf*Vsx!<#l%gxH5Bwf=b0@RH+qz3G>1c_LHKci!cfXAzi>Vc=joC8xp z^FVzBMh1vmYoZMR!b!;+TX{)MnCGWeF_pJ~gpq~Fmi!<37QPwExGo0& zdeGPo>w?Y;T^zBc4Bc&v9dVRy8+DaX?b0x*7FA31473dXK*5r5zock^F`;btA15|D zo)30QK4lG~xf3e7ON0%Yg{<;872N>Ay)*3}DbB^l$5pU8)h&+*9 zzuASdjBvn)Kno-!t*NDUHa+6~YfWe+Av-)2B6j5F5ns2~)Y`ztK2Bvf(=~3?UTu;w zQcuU$vYhK@P+zdEf=8p;o(ge3(jY^=NLWH%8r-}=Csvrsycltl{iD`n(lDi@H2J5- zoeg}Y&2a4NtkEq#(Sg>i6Kus`QU>l&nHCAZU2ZSwDUycv%#BC&3T?bqrEeYaehQ5f zyr{Oxc##A09wLUt!b){bB~(UNpz}WO#1kXFBh#B2@*8%MY%R?j)#cj*nFBKxm{S}X#q1}!TP8TB6&14&kUy4o>5XI#Tkz9v=1@~&L*Rt> zZu>VK#as#KC(*SmI&6^5t(0tm1Fy??)yCOqbvit73wq56Cj!?WW95fL(qQGeP_59j;}^z*i281G=8TQ{U zjYi@e|8&vh*a2@#L8nLVya~w{)K){e=#*8Npvdgsu9(wm>^)G{KhYJ^r+S_XTJL(k|f%6+W5Bha~$bzWsQk)wnCw>h)RvPfNmkfq8q!!*#4c8ZArv7XIc))ba3 z%*@Gnm9x@dFal!_t-z1F4M6`V?dKPKRnID$n%jUG?E2y3X7ZtT?^tHq2mNufJUx7% z`DRTq-Hw4+da=GjTt&e>LBu}{l~J9(tDamQ8OQ=p6~(t|_v}G$XEhu`iqgDEwh;65 zQHVgv)!~jI9N?#608RgpK}&9|cm2E6eqSV{s#YW3#41f8L#0EQ(2z6qgL`flVFbag zM3%JHY@>&8Met6gnoogUPaRuG6q1T2&DZQFsCzO_Bg7EUQlc?s~2~Y zQ{EZbe;Al{I_zup4eLfZ31R)~XY0Hp!f{z58!x8sQfLEdB4-bcF>Cj6sP3dv~K_|v^(eYVV<@Z1xk<*d`Aaro+V(J96#R!N%}&O&g{YVY&w@~~uB z`&WT#V4wBWPrzQIa%RSD6tqrp22{??=3gx5r8|Tx>eg^@aA>l@*){AZ#V%5pC?u2m zN#X``G(!jidItFI22(VT52Aoe6Zh*w3+tYwBUYMIkjPuZOHXXCwH0VrnO(!T<<}~| z8}VmSb)UPt>X(}J%I7fVCUp^ts%G=Pdk|1|1&0Slb=8p%^PRw=juGx8MG5?x%v!5F z>Nbcq6CG(*9&SNuZUYemC?IhDX2M_X@V6|t&${FZ%^7$+QJmVo6!DLrr0s_umFvwu zptd>u1d5MurhV**VY#?MxT4x(P}+ix4>`h`OJsFB=}Z=u5pL_%HSxkjASf^bhzZd9 z(J$XU&i0y|fy}R^y;-J)z&9PKho(siGc}o)MshEYr?IUZ?ee|^@ec2Jf9Dv)xa?A+ z^3%bvlh2NWog9DDPA-nw$?{y>j6>+>DoY>c!*|34-@~4Rdi!Q$tKd*<-?b!3Ocd@x zeTc7FyS&a6s=z?NW~DHByz%JaTG0v>M{+p}UF5v9yj@=F=zv8#45OEN0|FGRI{=y` zoQU^MM0(kDqZWA7SxlL;~{^hg5N z9IdgM{s@h&6x}c6Xxd8oz;f|kZ)fmyS*z2b=*=osr2Qp(?1das1WQ15A*A?g;(H77 zJ)0)kdztdjrSBI{vcD_sy|3rbS7E{_!iA{U3 zvvbzxCX&{_FWKpDNl}h`1LSkst#-%>@ZNY6@oY0wRSwNQR*B*n6DE$e*Uhdoo*5dv z)lIC5W(^q_E3RX!Jy+KV!K~-G*VRQPzVPm7o;bVJ)g-7&Q3qC>B4fwU2O&!8NAZ4R zMs#8Zio|O2T$fLcu?Ly+LsorB&VQ2gJ6-!o_Z0UoxEa6*(R(=He4EA)Fuq$gjg_#i zSu`FaM~4PeUAtX(A^(4$vS_8?|1qio?gWYXD1JQL5_s}&JH9e0r<#8|BgdPVLSos68Ac~V0^Et3cXwcV^<|Qgy*F4{!t|(l1 z)qmQ%_iiz@{rJXgSH)?-paxMcR*Z9r9Cxpug%}bPP|Fr^0ZcA~?ihK6Y}Z_rL8>Sk zZzukED*mkSV_@US$1IHBnYbIg(_6wXT!8{?c-^`rcc>u1`L4c_Ved!G+CiEtYDV|b}ziU)5|#rU!!d8 zI<`HTOgxP>Mz*@;n9bhD>!5@z>Z&!gUM8>s$P7NnY&QTh(F+fvEyX!Sw}jM{Q*m(f z2TL2oAdnRrveTr&1b}PfScUO$!vy8x-kfXOb`*v;P1Q9%=g9l4;Fa8;$BRiFZ~wd> zkh^mGc(-?-t*~<)W!#3IcGK}cP<#?=Oo3-#kDHi5v+9=2GM?neWVIsz#ZbO5QR`J{fxceCVJXHH_CwbbCqGdcUmA#`~y9L2%6g`@D z#zTZ(L}PSdE9wlw2Y~NK6+81uXBuTia-Yg2FrxaaeP<6osFCYkX%9@Si{k&+IZ?}V zVveQ2=$wcfEzw`ki3OE}&i6{6XBx-a3qNln>HFTZBBFN<$kD?-j>+3Xx}P0Tp7!1) zX0+{H9PirJzZT3#&&T%t?iF`Xn`jpQth^Q?fX)LEs5_SQAbEN4Vdcp8>cVl!PT!1V zGDkvp^Hl!SDEsN{W@*F~#nhS4`2VLME|@GP>Q98zA#%Glk&HihR8k&xO$nK(fLNmK zlP`zfLi^;VOzjgb+0N#H33Ls=>N`UogT7LL8V8gkw!fU9Ds7etF>4>Z~M-yV(f}<7eGOZ>YT^0UAyo|onmGfqs z?J=w;+E*=`#t@x*fpumIRTfPrI0%6hLCV8z;nSRv6&9u@)&38is(UVQrS3( zIk;4!&>yM?nNny(xTHE12kc@D>AId0P+aZ7R zq(jw>VSkfvs8(y$y`a@^#@ZctPcji{xYi=F4JMAGg^L5A$VrzmxAYn5UYBb~(fIe-a=Ph|{HUb5VcUZ@?7J>4JCE^E|JffeX%-_Iw-zjvfO(0+z?n@V%$Uld_t2Dv;(VZw*S=Rbu zK`CmI(pvqW{ZKyI-k)=peArsvfr^%BLW8uyGs)d-3)vJ!>Ct<|RL4}E=d_dsh_k6{Vr-z}`wG~O+Q)Rs_3a7cLY zYO+Khq*;*C39fYovue$Fc=$5_;9NjWSrm1DSVT9b8Ri#It^gUi3nQwYmXumw=Y94! z`$v>>8V1E4R{GrFiIVfjv^D{8gw>o{hMem9{>YJ|`3SFWK#UjNp37^kXhi2gn}^8= z_Bws~^$a3p$xO>Mk1?&Iz)ap6(l`CI0bEBqH%yYc=mCwDa@73ekntQYO^PPigM-1|h_5Bs|3&1ZeoXwc zZmez8p~}zSR>Hr(4q(`woTe2jg?YNEL7VU;DN^q2Q!H#J`B2uNcb2tD3>rgYUP>;Y z;*in9c^X1wX`c~zyRj3Gjqrg7-L<B@>H7QiG?@% zfI+v?+!s@*EM3F%xAMNV2xquLpEyNi;zzVH^*8%hzW$I+_I)@FaJe(FCIUZzSHQ(S%NqM84cy{- zq&7!*l*+fTM_pBC_9SM|a$SJ%6bHlSHYnQtfD|Am2N6S=aDyhYF#o4>ik-Q5xi$_W z?PV50a?bs@5tbwRZpbn%7N0Cs=H+NwX7k;!QKQQd@=b3<-I;%i@F!B42H{+Hm+&4z z4~X|L;B>0Zwb2z2XCOfGBczru&TV1 z0S85#v(z~A#ZSS*O2C9`x|+W%_n)2X_oge^Y7L* zrY2qSU|1x=Ud#yw08IkgAflp*B1EXEMPhMJlg>rE2H=-GDOz;>wI+1%N)#r62WE?n zsl-&8gug0hrb{$Q{U^u}#0K7(LW#0&;Ky4Q34c;ydh+TJ7AdN7_=g1ma9ZjF)-B%t zSV7}ZaH#kh-_^$p0ct^H`7N?ms&*82*l&#@eaV{*?LRdGHA$9wG7i{|#k>5^Zt-Zd zI(7z_@yM~#JI3&k64=mDO1&yGUGd%dAb=M#72uh`ouD>HmZini4`515fCm8>p~@m0 z1VEt4tp}j}i)tI9aak{XW71!Cs zwHv{KK~ZtSK+JfCJK#f5;f8XS>&KxdA6$pM3i++x0@$b-V~}6vI6t&YwWQ6MC#(qv z;O2UO2?r1(tk}~`nN)!TKv6RC65(*%S}RD(crEUPhD)_)39ZB!^66{s>;=^+>R`fV+|=|Cy>WR z;@a%`#)xn%?$Y^6*>E7k|H_?DJ#{+O{>@z7rc15GEtB2vX6YcD^9yPVmX?bfbl@CYXaXP# z;{@8!rMjcQ3kx5TlHvYjWFBD`{PL5}4p;#V46HQ*C}DPglYVaKw|8f{U#trkjf(0I z?o))x>Ks*g<}poF;gB3^-<2;XkjgW@I$ReVAJoPzzT+R%##NyaoKLmWgv1sbBHJCo zB;hRSoaU-Px0$3DR+h1R_#r0;P|qi*_aCT;=9K}QqsvF0EU9DgVG3g~HoXwuHl9DH zH}vPbkJqT8Y72~ic;PJib4JF7lbjdcMdyIIj`urs*Pd?hEP3xwUyXGiR8g)GDx>eE zg+Y+fyEHR7Wt|Of0Q5$0;!EVrknTyK1xL1u(XN|Ti%yt%2o;%7$uR{67os%+;?rty zW+1lQhVlu(P@P+fIW%LGE?;rYlTWz9J(&fp(OcwOYQ!EP()E<~k)7F&&X1pYWB0Bu zGmPTD-dL|sZNq((tLoP90#>3XZn5{15LsnuusC~CcPb5I?6(;=6x0=plaTEAnta@z zWS4mD=fO%F#BV>D{-fO>W}@{1S}6c6%L+f24?CHG@#%LuzJ6p__4Zt9snjl#KFnYXhtG}S2aaHRJ2It%UPf318NB8X{XBwy4*4^EZ5f{I` z_j^|r(pwRwcZZq8OpF`-@D98yGy9nFm$>=-xe$7fKT=Jhdy47UHzv;Gn#MCNUmc9uf?(`*cveIi;SnnJCl& zuQs{~RX7SdGqq_eHtD{cTTI4lyB=in9!H#)+JBRao?mW<{Pw4fN!}5V@55 zwc@RM-5dp4QvrXztlC=~V(L-OUu+%#mk>L^R#69}6ra!$ub4&YERa+|GrgUAu&@8? z91u}{;0!HTivT4fa#DnSM7b#cbNyM+rC7g>H`ed>3H9V7P4^`Ga@(ZH9I@a?yxo8C z&zrBI>ywR{Q>&1<%;a+7=x*t7m>2{^2&_kf3`%lj`q4i;!8-M7u|nj1ftkSwLHcM7PwI)tbTA z<)IcaCwRa^=}`=T;-x_#jw;`8TDbe+0l%*9v^m<)b{^9mvr1AwL|HW8`W6ZrR#q@zQmWuJIgR8~ua z{il{*AF~TV?{A;`d8e=C7PPbZz)_d(O;aqk=Kf~Xfud_k_KSz7Ju^I<;!G>cB{iGb zDC`XIS{BXOcZrKuUf){dn9n%kLUXP zNJsFmMy~gaHXTaUE^T|(D$$C8;D{AL5PlBz)05}VNpXuDL!`6e#jsgT=rOsVQHvr5 zMIP`Ny|7+ktun`&3PK2f588z_0<4-dX%arfdQdPmXz*-R7}C&1h3XiOFY@0-!NH>|HwV;;i$f$@4%Ln4hGcPJ?YJ! z&<S&sr?qp%!yW3_wc{Tz&`yXU-``Q$s*J8jPVz)&i~EdDdO=4#nD5-#PzNkeFo;a-iTve?>EI)ziR7Wngw59-CND7r|;3S{Kw_a zQ*)u+Mv<0uVKOnRa{E)9t-4ml4sW*5O6GK~9f%Y<+h@NiwTu>%jh;`^&O6`|3@qVc z7@*SXG3SqyULn4pd~F+wc^|k-lWD!)6aV$>MTHHA?iMon&^-HR!wkh=HsP7S>zIsZ zHtAjyno+Lg`#>Pym-8Pay9~ys#ak(F;TlRRSRfzH$r^YlL9DZQYD)!!dS(+PEBv_x zUt(3)m)+=7eqbt%<%3{ow?U(F1U17BS24TPTvuJZ`;W^3PubTPui*(Va%7i33&O6=m8k-u*rSr`xrftp^k%?udUG|7%et#~>nlr}H z-!}zA&4~$bhnZW_(cT?AHy4$l-gTNe-bt|LqT-t6vFl&fU~u05#Q;aOY8pMSaB+iqVl3{mE!85cnZ&^uVnsvPOIYeYn9ZuMRK+Xv^%wtJ~O4kHvMmK@?+x z{Wg{Mm&8~oAHU6qODi7->TE`2CX+SC|GDRGIuP#Ve$w^`B6{=D+~8rr$kwb7Q-qBm zmr)r~!6LiUqADTRllb06!nDkR#FGPA3E~<{$B4_skPlVV7fKgihbmR{9f%k1BNMp7 zD5dUuW1`iK7M(Oh-v<6%?=!~>?g}eDNY;?1(;X}y}PV%p%i{J&69Sua&DeRA_ zlf4d(??*(JdLP-Iw6)*|H`Vzyt1Ma)TJ7?WM_sIXwh*rlQvr{i<Pp5ZKiIUX3@edC~G4dcLG8O^k) zTTDEc(y=3nw3wV+!D;DZr|BH0nDA%ylIU9Ah2WTS;XforWcdgB_8qU`hX)8YatQy`Vqa`Rr96nbErd*ZuaF>uP&VDwA}{rvpFZ z?j(dy-q5HrP1#5hXyPoQ?LvS?>!V50geXeKpl@TZW9V^MiBKJ`N9%^{mk#V5j<_e~ z9e2~-vIxsClS-cWZj^JVc39wtB}}gfYlxQ$ln+wgTD(qS-BDMN0)y+|?Rru+XnJoEK5}6ab}mG*df{!tc4^ZEqL0ufoVt6rF~S8k|Ge44{3a0iypL;H-+4jgq3Loj-#st!-YxN9`Z65fjSN ztm5S82BVnL9`1S4{eDMg#NM9ee64>e6|L`kr@vY=3935xO%mfzgHB6Y6x-LUZ==a2 zPElv@1|Z|oA>*bv`g^H5;p`=;+P$p$15diP>j_oft>d!k{Mu^4xk|>O6Sxx{NXF6+ zxMw9k(Hm|^5S?rpi}@dyjpYz(#hAzNdNItD28`Ui^rTpT98@&E;7l!h`ATz}*}m&O za?wWd#i^d8)Gt4st~}Op2;lnXJyS_l3jg9P_xoOD9r!?8yL7W%Jq#y&s~NUf1Puj! z_NmclboRqGE^>W}ea+=|Xw>`+$42t*STM<0c4?m&1V8!0fvHB!_wD$3&$CLUAFDy= z1Tj%Rlh^9o+n3?(g^PD?Y`c^VTzxGtYdPHCJ?))~DXjhp|H!XtJ%?X$_bjk~z-NUx zDns>%S-7T##7R);&j8aTwIxt|76Tr$-HIF6nu_O-%Fvm(Iqt#@bdFC(mDjL40H+$I z#byBSYp@K+8~5@y4e?*g0F!{HFT?#_5y_f*Py64Y=wM=~GFt5q+m}ZoLqVDMjCWcq z*~cmRGs&YLAlh6hDth;JEBnPP`ahki4Kh8G*0+H9?CR!0oBm6d8E$oce7{ezU?9`^ z+?4?K*Nk8G7YrtUc|*ycOIhJ%MOyLkM}4g8E0UBeu6X^=1C@+7e0HwHT%UzBHgmlY zxl3tuKLH((Ibf(ow9!?Q0s(MrtfC}RvPa$%&W;Csc+MzYcK`dGG66IA zBW=uPip7nfzf?0)M8$s9`~kGI8yH)#ZISoWt6 zKa4f(#eocP%hg(0mv^eI0H+Wnr>BIK^4qySq-0UYK3L{-_(g_s$}LlHYpWfKR*61m zM^eGIm4VY8*4UG-mkOdQbRE0>q-K>E&!1RR4921O>e22CdL}gNZ%xo2QDtvu4u#+< zea9ywQf79t@aE~~D9MPZ!I&bUz-3&unGdb67N68%iN)~V-LX0)jnb^#xI+b&k=vYW zuZUzpU(PSKsxlp0PnG_cK9THasuG1m<|%QTrOY1tEBOj<&Kj>@|dF-h15Q6}uv%&{7^=P86%ZS`9;%+uabWP||53N8ysLogc7XVsOO!Pdz)@(n< z4S8Y2H|nKUpgN8`;F5A_3}%JurJa4 zFiBMGHYoD-NaQW(&nejU(0_J`O8c^APJb>G0kmaXnrNj+gnUHp`aeaCFshDx8W@i% zA&KLEtCLKVOu{oEtl-;`>$URS$Y>Ury}0RZl(UN|nt)>NR}k0z9mPCS`%(jCoBqv^ zPnG@dHSN*@cS^$+pD&U9ykieq_jy0W&hJ?w#zzy3-WtU%1F3&>@4gkpP{mf>lMT$G zsbOv8AGHpxe<3?SVXr1J(XHJG#T`}m7{9n5X26`!YhLhdzQumoGq?6w%HMsbht4L? z{XD*Bi6QZ~)n9nWGx_O`SJWTO(F}X>dn9>o^huG|j9g7eYqca5rf32_Vu}FlK=0&$ zUqtT9?hEa~J7=H5DMnn#*O%GKgl>)I2T-0x8MChiL|^K&z01h|WNXJUJ1nTS9IHJ> zCN@dTTdbsurnnO%GOr2As7r8@b;l9&%*#i>z&Qy{3-bU$^+_;INmTeHxo*v%?8 z^##cj17oXSZ5o&_i?N)s+C6Jr12b6N)8e{XF#$Skv=dp!Fl-P>x|xs zuv^B$H;dUVg&OVKtoj{qI_rMELK&~VeV_y-@M+P-5}P1=9S&%_EX0hJSP$~$93!q; zaI!C1Dv#EBy|5T|+GLxHkATq#F`F&9AUoS!?DnMFivMdal+zzjKn_oF{%ycVp6DN6 zeXiZtcB|};DYT(w&Np!SpnCfb1uLx3L{*`R=)FBhJ&{AbeSHUezAhDI8?p~*AC4N1 zyb0KC7?bSiXkx7i6~|b~7J2k&W={KC61~|sUAEC-fIxO|wI=%p$;E7)__r#>(;UkR zU;AvT=@uCO>Cp<8&9;d(xw5ngVk#$`VuHi`5u&eA*0ZkQbXNFMb=vlo8cEb_u;a9V zXh1Wpg#}3bpJwf=?Na+|Lr;$58cs%jdKjW3GQOwUlcLBmc~ufC9Kx1I<55W1g%p=| zL;tnV+D3V;U|fXD%6V6`touhRGj<@uyWocM6Ki{yIeT{dNaHHqnlkta+v3Iz*8c46 zt!)wu_NQSW;5!;77iZW%KQ0zLel;C78+5%wTdA4)?NIGSv--qdCF|Z~B%6)1x78~B ziJjFQU4u^ydre2?_&?3qVX9TXJfhOK`-1N+H<5lf+*;7Hz%jvvuIDaoAi>q#mf19v z?a9!6<^p0y*ZzdbcruH1Yj=__hXnI3D{EHs`)3RLfAOnYMwel1RA$9Tn-wPaS1hxn ze+c%GH>F_PozekMeHQf}?0;D**7lEAU4BKy@_$Fw591AGN6}RW*nJ<|f+*w7l3xRc zJ4B1K1R0m)Cf}UMrmkPG;1boZV%>!=47CU--_uO=$J@`ZolMQkE_&3KA>U$ zn#&b|7dPlX;D^C@yM_I|Uo>)2MVh4ZBWH#LA`D68VzxkwbeOpzq7Rgrb?oIIApynI zj^-ms+qorpe?tI|n5hLzjHG;f4A5-(R+r?S2B9~BLuMAJr2pD8s+Tu`s-9Cm*xN&H z|39p~d3;lK+CI!VCrc^NlkR(y?t9Z#3S~_Tqr=*?;BSUSNCBNekfsG?SepaNxUi(4 zjy|#^z>G2vO9F~Ajx+&W0LLbvD4;eexB#NbIcbx$Nt5^bra1FF@B4nZOSb)y`oq7wZW4RHS%3|Ci+w21 z3qB}Z3R0?Q>}i;#owL#;Y+nxff;{09fi1CgWQdG0?UGTQ#&Iz;-c(OHJ?AL0&#B`2j} z$uA3J7uaW+(A{swA9k_C&h0Q8>|%(;#K~q385?Erl1DeZ3_eJoQ7a zd9dyox!isOv%d$%SiN4+<>)|-9c8C;S=3n_0>*tHK=nh%lRB~7{vkDN&(Jv-eZaU7 zZy=ZzBw=Y83j^8lk|2=vaZmV;uxL1M-+Lf;q`PBp%d<(PiD_StX#-GUmW|^EskaZT zF!&1G1^U#ye|UFgb3K8#Umh6gt+fVwsqvP&v~YsiTc9*cu4RYgtrEbwH))Nl0y)+p z%kI`uhe!$UK)gLfdNy`FIH$;3MNIS#bXpKe~)3IZZOyv%_21!r1lQVC=3eg z7;IK!Y>04+r^?-sAd%93MX=9Ln(Y25KGbK4#IU5UdOXrQ2Rn;J141np1rk*Zbfm_! z@2f8d-k`D9JamMMRH5cP9X`*VK~AUqlKShfsXm()XZPjWQU!3G4Nb#;hh(2oE@2Ji`XFbI z%l?FUwL;wPfEw`IICPODf=qR%=XWPuY)bUlI@NML9Jxe$vAth zQkJfdzWFG>tDGDE{JW|%i*;{&rsw$UbG0{KTsux;Szc)peyE@q%XUfknin~!d6nCO zJL&!}q!Sz``J+GewuNH3{xM$W-VDz;?r)r{DNvsw%}R7XI;5?Odet#t?c1=fmZtVBJCLPh%nLW_BE609tvr6B|tRR!htd75;Jc4oC1iYg|i@+5OZ^koR zatyY>qZXYq#;T9i^!u(AvF=RA#wP14ofzGYNs|%%7ys!aWM4}~4RKu0XK%RaS;5iH zIa@|5lYdSjY)vXoGd{}C(UKhJ{hRtLN@3-1$oY2=v^zl7hd3$McR9rm&{a(^PWRw~kpR*ge!vQy8@ zyU)rmeAQ0Qgid+R&4nL#XX<0v9ywK!V85IUbmtZHkkDhM|0UEy`-1x)F|$&+JLy74 zRwOj&|3Vm^LvW`4y8TX{&oLA)Sm(n@BA^m7m{6m|cxNKw1Qa#v^|T3oKuhgf8bOc$ zJhZ1ykiKeEW05A{ilQhfNXnEcBx&f_Al%*@jx*jBz97kjXud}GwU3rp1+oW`$v1{K zV;U0GjXYm;Q)kBmqvelZ$NUwGywJ|iGGCnx2{%V&mY{-O&@$Yt`L6FUoSMDnI;2t#v_j)X=ly5HE&l{ZySH1u_E)3Y3@08Hy$$22|Y(h}Kye6y)&+ zyHMd}_75^C{kv11o8PQqQ(kRh`7G4=Yu$CGQ|_kt@WTjNVfrdV6Cj*$eMPMGB*bze ze)!+<`>rbIPgk(;e<-JNYX9PSrQ1XtKY>(PzY22`zZoINB!vov5Nl`WI$2>m&E}6} z!B=7X2!Gdx2_x`-ZYSF}l2t1-&9>6Jvt{EYHun(U=UMc6~A0w2LdX6?WN=2`b zTCV@J;aJuA<*f02YYzr-W{u%AvN_N@U#8fgw}?~+ z0)mjuU+);nkTd2tdXp%!q54czpt2IdqeM024^JPkR^0@5XKiDLFyN^SSILcdq+TD8 z?FE-qZ!Th2fgfWuDA)^f?n6BDD=a$0m3DTiK3QnZ4oj&wMhR71oTn}|FzO}Iv{~{+ zm|_6~1nPK@I_Xu>N?sq^AcvaDfhx0@rIo0m7}8x2VRI}%q+=OD9B0yhrqO>73f8UY zcm}}+(X(1f@KXP2`t|y6mW#AhORcj>G)>vV-nq$xpzivBkA5E-4#}oMORym71pPI? zS=n)}!nsk#U7zC>?U>(WrLOU_KjJmgQA_FaB&x80^v>DYw(UCgr zCGuG@yJP~AT{0tQ>ec0txoi@}j(_y6vT&*UF-zBzQ{9RE$vSqpxFL*ZfE4}RR>uTKM&RXYmnDt4s!HvRW z#z2wvpa!OLp@r&EBXFKzs1%3Aga^_ZvEw!Su7Sq|;dB#~5;OJ9>6~8_bl*RoXgyNrR1Oc?sStSNOO0IL^=g=@4y3R{}z0PP6NppS5NB!eTnoo^f z=t=t6e`VrAUnLjX{&n1|>el)7vYu99_K#@Q)rls)6@T^31h=}?W^tpzf;*A2TY#?*A?$%?} zKK&-FEFC_uGt@Lg)%t`rze8A@;mVK{)hAc_R@l9NQUGmBQ%Dw9gt7R4YaIJqH?s+- z5UO1EQ~7w%$(-LY;kGiez~Xz@*%Qk@_FP6d*Z!kC zUB7H^qHKGp)}t!8o6@0y???@ZEmG;Rrf=@Y+x zwG`%b$^jbxuY>=20qToS*AY8dbCkS4y@cwDw@z6{%lS-ieV}_KW=HFJrKC3Sdqa5H zt*@&-8v!#i-T)1rCDu6|{C|78{^X8Jv_B3$0hIA4x=Y+TD@&dR-KB!|s;51*;x4 z$ka}JPhql)9Lze^i%=K|#oBKn+hQ6fIY`GG!3(hNYwEp|5HGgJW9?-;UCVhO*~ovp zk=6?P2A6Ud9BT}rWm~_Nd{pA|Q=e;{y_8(4rRLpF{WP!uAB-PLm?2L8p zqKc*_RX!h0n+}KOabJ!!VW~BwS{Av}FFbLH|9Lv?x%a{HYU?PIlnJ^wD9pX?g>i?U zhH>cc-cCQLjg4E2Ic?I4O(fSqk&QasbMt6u;tE)~6K!1mMOWb)mfyy@YxFZZByA31 z<-xJ^>)My8t8Z3uxdYOlm9gMipV?Dk-sIdZsHjW}$~Ap@u^MFjKT^;%TpAoMM1O3_ zcW1d)5$pf9joLXKlzmy>usuUIua?Ygz`DpvPBRkDSg*3m3XahqEDK-`V8O+IH78*CrSJbnLgxY?}zw6kjc2sqB|ZvT$!A+LHd$ z`-zPhI;Wn>r_0DWv9_*aYH|wBNxL<$ikwnKyso{8@mp#Enf9zWK zvqMT{Q>lkp6B8C6Wi7d3QWf`(8u}Jr^Z$v1U}9^W1Cp@#gciN7qz?WdJ~I)U5c$kT zK6lwc(FXKt4Rgv8Neg^JC@2Xad!51YuXmIY6#>DFX9GG|gcoFl0=y2%nUwI|o z8{r%3L>NRyJx1y5AVq!ZE|`b}Mp$n!xfSI)S%=n9rF8!vnJa@DcrH}$G%!N^-+1` z(YX&iR?R^)g30V-$o>CK#4nP3QlzIZG4=Ds^VF@XORkL!e8eVRF2O@BulGgwq{e+a zM?1;vD^7SVdo*3e)zsb8O%F_0N+tW)wz(HhG(&G&8k*s}EgfYNwWqk7Zd*p5NO0q1 zR@yzkM>|(n3l!jHPZpVYn1)F;ga?Ek5Ayzzeo7HK1hbvnL|IC!=0o1X6c0)QRXY>u zasBho;$lRdWqg74D(k@TlTwU&*!H7n>1a_AwRQ0R+x+CE*16eq`S*0mtAmT2|Ddqv z=kwPC)CI)YU)xJ>s;TDY*8P`WuB z%jfUjKzk>nvQr=U{W!PAe!g8{_H~ljbjJhV5%JyI=~-0SE5GUR%}~o6$Mdb2$}LF(x%_;kZQM1{c~^;>+^T5m;(lH`d2fV z^e(sfv936Ckk%Rf+cct3drej;eMI-D^2+0L zWY0Bzt^X(()8woXW$c+?+-7@A6;n`OJE*0O+LGvjGvGtUiG$m7tuX}%RR_-5 zYTU|ObI;)q&!#}=V#}j`;aVYyndID6FN~a@xndKYVO!iLq}Dil#5Q zyzAl`yPg|SI zX+#|<%kJ&ZF)nHyb#PU$C>3M3;f9QXC-ovIV}59PmcYlK63|qX68r~dQL~b9# zkDE$(yF;@lr0NIr$>C{x!DDr|s-U6(tVwgqTlAZ1ZjOP|W=-KP=nu^v`6IeH93$Ed zPtih>C+DDookATb<9>ibRR1peBF5WPC_BD1yjg>HZjnC7^&@pd5mG*;O6+GIX}cMk zU_5X0X8&tLu6c_kFT6~U9T)qL_@bz5?WZeRms&sG!e74X!X&Bv)XJx(5T@qsNuXwK za*cL2(5BX)iy56V+>2gc!O@3#x#OBG~R5Wz1G z5IZi(`V)yM@G)f%bWqXr1)1BtU5ifjDpW>6{3c>&ZSCw`>n$%*o}>OetE%(2bfo6Znyb4#d5}LnepK4NrG1KwFvT;6l?FdKv|C zM%?$9kD&U>^Uvgg+y1D#nC1LpU0X+`#=K6(jXu$8kxOGzZBMjNC#6~IuuY#)V-#BD zh0%SGj_)4Fy{s1MzQ)9!qI(vRpfqm{CEHg3>lSZ@@gjZ2B!aCAt@^rAN)0o(h)NCgaU%cCEw*F;YVTi=&ed6EgQ9#4kO+(Vu3xEO zd)INwDtDbr8j8c{>R+DVl(HbbYqouf%Gh73WoEAu&6FV1T0Jb%OE8w;Jy5z(A_a&b zy{M-|Xl?)N5PCb@TroZdxD_7g#d5WP)_%EV(%EVX{TAM-elJ4IIX^WFMTk0FG*|mPm;O% z3yw%nOsW&El<6A;NiVn(T*%*dr*)KXKwal{ z?RTllYNaSe_TH|KZ*~FUD6Cl0>e3^HC!RP5{xK(1+55+i<%m}Hzw+IP|ylVtRbK)!Uul&7*k+Qe;Y z4ei(QzdYoQ7i70;sL2m2Tpp0D;-JJ*1kHu8G!#pw#1u?|8wZeB961*Gd8JuR>nf4H zcnCi?(x;5vjfhkcKHo$VG84E)U9~Ov5Z5mbuJLz`QzUoaB&kbZd$R+nOS09Qi5P92 zBcTD%ONwnvDD@N9Mru+WmGbKLy1U!Kt~x6&h*6q9*EQ?iYXTr#i9!n34CD_%_e1VX z017};K*qAODj1w_-k>{2b&~S3pzPtK9`H2kBlQTW*aGaRdRwr7+l}n}x@({4u>Zhu zzTl!m(udf2Dz(WLyOEOxCiG60d8e3rq7oe~B@h*&G}+1J5%hpJ)?8GRN6u z<5!Ngf~6qpxM+*(D<3#Xi=0yCOxcI}3kSwXqn`fh*`Ku-=uRa_qqaKoZmaXC1DWBZ zR)fX-rb-qSc9wLc4>-IusyAw-dv3U#^T!0l-zq8aKIRSj#cymX_b=r7 zPuEg5-Xi{Q=vujx!@p_PR}MU5Yk{iZv+OA^dY;k@Oq(D(+-P5bB-!i{WF^k8cmp%P zg8fpYKFO>rV|(q7uYq7wWu{&@o5XC&*Vtdl3geSVV-nJa>4`5uUsGfsF>=YSClRL~ zKt{L&BI9afZ(`PW;agGO(w8cGmd8;G0+X^amd|`=O1{xgrDN3ZiwBI}sL7e`3ARfd zKhX#ta+N&U{Q2U^#*xBO=9n(7gIB1=bKe`qw?_z{(?#ma5pRw}RsT})SMq}+ggw+| zn@5v9LXe$1v%cn>WZ1@`ef=QkCF@8%<=sa(zc`4THy?}-EF;V+bWP)Ts`BUA7;oQN zq=0W|IHZ6-PrbNc&Tpr<6S$^JMel7IXq`g{-h{V_{QCc!0WOumnnkck*laRiunzw( zcPtm_$nvQ#W)=nNd*uAh5=E-(&w{1!P70^ptTcY7=>Z&6rb@CrqF=^QFAu)OGlf;< zb4gD~jIvdz!r;L0c$hCWI5hYw;A^wedeJQv9bQH zD0{wLNskYHni6iZeqzfG>{8{wFhlXFuujR{E4-Ep3#z12Kha(65jSkAa~|eVsZs-r zKSqP72h)N%LSyLD>k4G8aaUr66Kdf(EzbQxG;pkzOk7l?cCIDr!&VfN^X` zk!_k)?)rHF)ldeUz2KrHk>qx{b%V(5tgWv4bsF<;AL3r74u?uFhD76BE(MZ>f+x}xR_kAA|NfHZxxvf5bz8O(fVmU#AE zUY*lV)xXDIeuRbo)!^|YYS$!dmO}CiB2=+uOQ;49?U_h8*O)6mi5{jW>kj)MGGjPv zb*u9$Q1!bCA=uB%lrNA9e2@i$dM#8=r>KgTzO=1UA03|3T5xuQZ}3J)^wZ^THys{{}3w6arB!4csJ*u zC|xB`>YQ%%DH+k;WD!3^Vx|aADl$;7kD7b2n)^`c&kS^>QX2uOF)%iBuQX*q^j-M(dpbJfHpm^V@%GQ2ZggVwK!iF>#*w&n zw*rJ_>~N(-c*aC4X6MlRM*J#S{HfNeKhi1hYJ5ALj+M=yy5`}HH$O$~AgkZkz+?6A zC{MP;8|KKaG-kLythVrmaqU?cp;&80p2eumx|>Pq`8is-K+2oiey(v-;QD zb7i)!B2=T%XXG=8pOR{Bd6)%*QHZm_Xqg3{TmB>6{t!%7ysK0yZpa?06<~jmxRPo? zntu%S@lky_>{|!dX?jPlMhV`M33Ueuuec89k;m87d)Sl4rhT z!%gEpvQZnAz;I^|C;TL`7XMDJ2R5EudZ5Mm6sTKvevZBOA(X~Cj&>}Tf!cW}%J+mV zw&N%2{cPyRpob-gyPMQ(7~whJw?mWc`k9}+#K_#l-d_tD7J*VxXmYb#m zQ^hPsl}(_2nx`b-C}Ob3sE2@-Zb1j5>>QvGtcpq4oUf4cA-#Fn8zK^CA&+F{1?D-p zK&SN3(CX|-;dBlkt?5~W_mNI4%Qf7vf=gpNzSQg%X{&yas+k`|XIO8m!~*3*&)MvdK0Aq*H$H z8)~?BXr^UYKSNSRYF%q|_Wsp%&T4Qjo+Y*ey%3QaBXXlS`_k!<;qWgFb`~0UTUvPO zc2^#MKzr4ga_;6HA3g6t(=H*~Q_oRN_a+=0{GIc%RFn~1pW}R%Z)pX4t*aNt68{(^ zCqw^8%0%!)ikyuXKY;~rQMom77ygEEW`VPkVH<|d!4$b3Sp~=k>(_~1P<61MA=h8< zS!art`%>TNI-uS9CjDW$$%o{6!IT5p5F(A^+5&5Sf`u6MQY3&%8F+HBTXkObDzByX zYrIg;vC}H(KEt`|tZRZuNsrl{R?B0__mMH&!y-Kfh%FxEBLB$=q6YQ^x~5YL1_K0x zaT=Ojz+ejMT*3y0y*JB~fvIf&s)#o{+22{q#aBMJF@4)!ak+siU{pOye9V;o^eobh z5?Dmtr%)g=FnF-DDWN3H13{{~&UTJMfyL;w z$>U8{R5gG|AIQ>f32xe|^M$jcd@aI{mC~o8i^8&BN~BS%qffVBy7aZVH_&h7E^~l9 z!}i{rR#}5^OG}k^;p$+QT&?ilIXnM$puSaZnI%hdE4M!T+0&ury=CnAz#`^G%wabL zA(@YCxTTN4wmjfqMld?$OPzmew(}1)%b`hfxKl2>=Qzm65Om^VB6#y2gj?!i& z_l_ZZmoz3ToMH^dmy3@~sO$f$SuK;K1dFbp=Q5>QpACVK=octneBLLEv;R=VU6TqO zft_*G_5dllaUWZ#=T-1m_NPhhF|vQ_3AY};{%i?V_P1)Qe=0xDi}Kd^;L*(R9P0&3 zb|@8h>21;5!;zAonLX8jHCm13(R69tjh|D=-isG!l_N<$p>ggb-~N;{^T$j&`1m5% zCQ6Bu}c=saM!^f^(vN-_!K)BETnBQH~TG)T~>b!wkv@8Xs_dCo2TlezJ& z{E5*>bzfS2W!lT3j9Io!!t^K--3⩔6N0!&sBOY)EU7XO6Wb93=^-_D8@ATx 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%0DV1nba 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

kJiLiB-dBI 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πvpQO3>jQf%Sc7?~vAX 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 z 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�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 r?OFO>@WL1=o@|0?8S^F62eTUQE&4 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%0Dmzq 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

OP-o6RuRMY_37_j1wMzE(nn~Hl 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

_UyVnszz;9GMHx@b}YiL}-7k zu)b_Nh4!_Q1%-6*n)r=TaWRl9=T}hmlR>xXXpP|@<{>w^{{ zPygab86D_1Fq|el0pXIlS0P|VxHpbyUetx>S@nS7idx>Sn?z)qo7>zx+B0aoeruqd zLTxMiM|(}m!R>rLy*xNB`jss`^=^9)ef4cG$jIFWr=1Y+}AVz&9!sC+6 z+sOTtd(%Zf<%!`Ab4NIpSzl?|7$5ag*SL-+a?9<)YSTP$yBPC&CcOgM<6ZvVmpS(& z;>Xcv?0QLIzC>H6i4MlRxjREZs_`fxMo;!OT(svSy*x}##B*3ZD1f%s3NfT{HR(>| zgg_E-5`Fc6a}*(Mf{{sN$$Jw|k@0l*2=ROtJRg9>X)Y{`uKO*opII%N`c5x_#0m16jE8GHyR6c0z}{1R5JE*TV)E zrKrn@lz7xu0IDMPMD}yOJhS)`Zvy#~u(c@EBZ>H0dSgt8T>E>sTsvT_8=x^x}2n`V@JCwR)*HKnzmJsZs>z0F_ORFnL3v=950#5R-m&ye=_aVJ^qlBI5| zLUElm=P+#@E2Ocp-#4gU(FkkQX?ig>lx|?Im#Cl8*;5RROZI8(_10_y)1q=^IZHip z%n)Wo>gL2IilIVl;0ha3JAqW~HvXbUjCZS%2e7R)m`?$$_M(uFP5TlQxNt-@M0A%E z?-igQ#d!Vs`v=QRCRt_{jEM-k!}cBYXDZruBxyR6rnT2EsoB0?uB{4ZH~b8co`d$} zPpGGm7tjKIq5GsrO8aUp1$9W#{wE!MhE8K{^Zm@O zfyltWsz)KITzq1Z=c&2xLQkO5JTt<=08yc$xNt@hTfzhNN18?(lvCG@< z?<_qt1Im*P0R=NG3GL#CVrQ|zLONo7N4(A@2+3fGV_E!s3F{7QoQ40H;=3E1f_9l* zv?l|A=vT!yWcOzg4Qx>7Kw(r_F;h5^Czck?MW4%K)tJ>KMRG|?k_*%bU!A8ie*o$}cLSvZn z#(EzIqWp0oc7w_&d~KWJy)?%e6&;pQEE%=*-`F`H!`$rC8lz9P6Nrn2D?+n90HE85_C*s(mxiu&{YbF)=@(DB@RY&H-apJuJ zCgdvh94d84K+v3PJP6vKh6vbL#$|tMi%&SzD>S#xD_nV~ezs|=P!~$9$ZKW9HMz%` z_Khkdp0;#3g22~5i)>H3k$v84Ozl4$v-o-jbEjITS`Wk!W z<;18`ltxas!GzzhI)-Vhs=1*wT?6Iv;Rjb;Wdz5Fn z|0EgphuL(LOlo1OHEyDCy5B#Ebb4Q`<0Vy#F*pc$87C=5`J&2#I;%rbD6Wu+K~4sF zBhQW+&BP~PqB3`{!Sw}KY$@iiMp?h7gNMZ{CaHa3PI#beJimw9m)fpwJTfx)h`}op zU%aQ6Y&UAemwCmw54;a+#8S`|wpjf8x!vz+jS1C^shXGile97Uhyt^GIor^omg~M@ zOAYp(qSPp=rLSrl6Rjs>G-P><+6tQ%deH$XXprO>mEvCLzFN|&Hvd#p>|pb|rPlAM zd%NxRNoH5NoNvxGIetsD&ZXwXyili$DGa^I(qls}nd0k2oeY7i-_SLj#t-ycvQ&8F z+R9h85GEcu8`wckf^zXZill`yPRBQ<2sPpO?Ol8s(MKQ~%H?X%;DGHkzcqL+MSe$O zKYH1*aR_ywjIMf_m2|459#@jq?0`^kxRU%!Ih6R*tG?t}8Z>iZxB!rH6XV>#42yj3 zT^-qH)N49W?ib3KR_{jbWc=s;P=U8Eh_Y29t{x&NI|fMC5L&=GIwHag&ew$Xqqa-+ z@;4>Nip<6WH&W9k=o*?jP4q~0J4#t+@%z{Vu zp~o?u`%plIU9S*_ea_B@8jaYPO7O2?-S+MFGCyh>Wo%_cnfD=9P#PF}iZ_iFm94CQ z6$GMBhQ!xPLRv`&t3c%f4WCC%nHaIVG56!nfFIrBD|N=rq3rfQ4x&LbA_s`5b+k88 zZrnhBU_T_rAhc;!l>x;`W^+<|2B@it3l?>#U|{RTlO{`|{P!H^Ezqp3W#qV{w>9VD zJ1KhKiaTNy{Bh*h`_ z76r#Kj$%zA<>0@a8+^~GLK zF+TdUj`Dn8YiwhJeGSZV`EJ{>J_w`Plx>+ez?AtsHR!pa?R#SpgA-Yk-s?%^0AB6Z zs+g6tN=y}8bZ~h`kHCK&WNc;beT@4%e&@u1H|-OzXM7#Y*4A*YeeB&;re)kBuQ#7{ zd%dxDCWbP$vP?sKLQgiq<4L>M&I;IVFv4NWxeldSjgQRJGLql&TNWWAT_qkVStZDc zOFU{9>BHIKW5U?WBl1XtdldHaBCAuD@XE{7ukx>^TIWfSSsGYLp<<(V6LrbXp)U9* zaSG3it>3XPFw_Z)G~ej`$P$~3^aoF()jJX1V)PnnETXib*NLc)fs@%? zCqgdUOKeizK}LJy2C61Z#eSMw5kEC8+M2$Uj5( z(IEr7-8fwln%co2xVt>DI#TOuTen>7UYon^B>73B^w>*L)$${`~3DX$jV6KxXqzFgD04x_rGDJwBqlDCX7ieoymo-Gq&JsZ?ataIv(r>8-keTfk|dG~hTa09KynJ8PzIVl30z z>#WX`6vw#JJF-VHJ(=qt_#g62?8zjYHd+EnvCNQW>*vmKd6Y_`o)jPTGV%E$CWQDa zh)zEe{UQE}F4F>%x;bmRE#>d5nqHuxe8GAp_m*$4+0xIvIg2juPjZpXwAg2(Xz%G`q1m?+BW__*(=>6- zr4#RsA|1FFS)ik{`pFlaJXuK=j6ls+i0HN!EQ4_*lqJj0@!UKm2HAur}p?R!izfnvG+O z{Yxwo@3H9592$hywvIgi++QTy#k|_qqb-9Bj=(#rGM$)ak)|>}**$|lk(3fUgPd|#Rp+TEFw4DB-MOimWF5DCAHQIita zd~xEvIM4`@orG@!k!g|*e!N6&^+aQ;5-&_YNKzAtW;^lc3zK7+Yx3vWIEG0v?F?*w zN<5?rtyY=Rj0w-oal~E|mVu8N;+wVG;M=_03s(pVXx6^L3IV0C%oN8!UH*_2Mp?ad zf}dQegx;p;JjviZdBlwge?(+$KR|48Sz)r&0Y?N`T;dasjZZK$azE;EVv!^@ms%J% z?M7-(R)mENOn~ZQEV~S>6#H$>yA;#nw#BixW-bnmxhyDosoN)vN&qS|IEVT-!38X6 zVu!!ihwuwtrYlfu;KQ!_2%*d7J!McP!;QS{w4wsY#Ggbz3ZHPWe(}s%bt`i#!%G>3 zJ=q6#X+p6nX&b^S6(*@z8cHEBxs!I3xfKYLb|L;z!ANZ~)E*-ze#)+MO?OVQY2GNT zpmvRv#dp!g@Z&{iZ*&{Jo%@J`ZOgqhDr=JjZZ4B}>T2x^bwaaLyy)2ki~De2xpB+4 zD35Zr$09xp4mDKWp~qc-JIlZiBV|X$JMMMbKV-8Zgo5pG%s#5y4tVY}qljO_co+M6u!1a{!s`k4`uT^#gDJ5>A=Q>mbXJQ zC8#l2bJaG|yV~LyWpsT(g1!{`a8|eo`%$9nx}$)^Wb1#&M>%1w43a*f>2_72?WVS`#-qw4x z$~7$~&^NL&A4gL7TuiQbZy*~GC<4$~nj*!TTGY+@+1rO>E_Mg0B_sA;M< z1}9sBFAQm&^(=C_Ngq0g7xe}Gk=ijAzUd+ZbR{kG5Uqbltd;zrrS1EC$F4G&1B7}# zwJ_6&da3j-J#{oP`wJ}8E~B&TZGO(jMjLW%?E{Q~m|2XJ5|b%lrh24O(U~O7Qf)Qb z{4#Pw;XC?HKuNN3&7KUie@-~h;ETSf0wvMe{j5dOm2gr4dpi+z>)x9<8Uo@@L_kD% zqkhnKTg<8rbRi6h>+pQhzC1bizNDCWxLz*rz`7poO>RGO%j`_1B zgI2GL&C>4iIb7J+nQd`A8qO4YH)s(;W_Bv@X>B=B&tn`LLjBtR%IqoliJ`L!VhYE0 zVQ+WK&VRD~M|bWAmppovA4GkunoZenq_Xc@+Ow>Dou}-sX|pQ^pyfM5_R>(M(4TJx zK&vl{8tch7%EWUCn-X%^6_^~@REAGbZ^Jppxg42$sQezYIK6(RRvZu=N@WJg*>Y*P zql!<|-eM%4K_&d#+DcYdD%DaogjZmT6Th&-2s>P^`VAP}YJ^``z{U>7o_XjCog$!U zVeEf&dt8T9tGD%I+;ORpQ2rW-vLSl1{zI|7u@+Zy;HN>b@xj5M^S4s^WvefYW@w{3 z;HrXyAw=FV1-psdzIoz3LMOyecJ_Oy;KPxAOoz(QJd?0Omx$l@yntV{K5UGLN+;1a zPGwt3jk*@b8AHtfJHoteNIcTHJ@#0!lY1r$me3j|o~f>#Fz2h2@yuENwYgV**&ojw z8l(Sq-w|Ux08L!GYiB&gLG!s@k&wtaC@qMe|(28B&M|lwyH~gK37`% z-V(>)4988y_w+S0x(y ztiIi2e3l_s+_TUqesU(g;jZguhSA@qM!~(`YwlD-`OQva9`Xdo(yxn+#qMO}4)z)v zo`eE)$$(7)0&12euu26uMQ8e9tO^Jk`c-a1F3my|janVSOI%CF%Q5^|mk%cqex%UU z7VdH{@`TO85zlJ@*ss7jZ)bj?CJ>FAIqtSS#5jJpwMd9P#=4>T{OVmwMx_N8zC)(9 z7_Mu(wGfw~e7F}uQOcA2Uh$5Up{|)yDdpu}Nt8;~6H^s+khFdF#Crszi1=E`un_g^ zLYKJ7=sdUef)euPkJwx;G)nA^;wQINTQh`BKd$&tyb^OSr#||xMv-egtCI(A&8<@b zBX*51eau(Gl^5ylY_-n#eox2HD{QUtwUzqm+Ck;HOz_q+J&`^BIhI1zR*S3Xo_Hu) zlx_)*GUc8d4*~W~cE5&;abli)meAV@Gpft30~TQ7Pm#%*DQs>l_Y6El_xcL%Q*$tP zh$@|H3XU?g^^HE^xe)!hp;7AD1fg|4`!jL++ezqBajY|GPbjrPe8ck8Z9l5f^6oX7 zn|wG0H9Do@)H8YxQQjytBo#;C&Ml+{>Gke8TDk7FWAF1Kh9znTczX?W0>Wn`5AN(W z43P6vVG9BfH_x%Y@T+k~Wv#^aP1QJ->Q_Cv{e?rhfrn~%U#U+f7I;-VU8^;6k83T1 zs&Tt=eD1p_qvDq)hu83!8@unc*og7Xu<)oTOAsC|>@eQ7DYDwd_ZvOuU8^n98l$g> zkY8(teH#6~VWj^?^TA zXWyg@_cwU_PDS`4O6z)1d~;r_Ui$4|`?MUOfc25hr1Zq@b)0C9=xROlBzE9{6t{A| zHEPqTLbvTTW3}28xa_taseLh=VLFrz_u?C~8OM5-WrR&?(_HSEkM+PNblXl@+#fPe ze5hqcRqFjs<6&V5BbbBl!ZWi{+v4t-M-86T4$tQZHEf>-c zi78)+uS$L_ghTx376i5g>T?Y>`{)zBW*Kfeukb48QC_UtK$$E}DqqHpibSHGEEO;G zWk_Ik>`DC#+Yyxxgf!27=Hw1+h0O_gvJ97~SA|!--WM3*%EKvj z7c~2XQ|e7jFUB?(>>GRM@oj#JX$X-!=7ny`50H|;N9m4q16%L(?sC<5WQ@FC#nyOE z^*+rtEpps1(kjab{7+VARa*5xXFjmFm1^LXyIfDlIiO>5+$Q-sU$%4mI>YJTXp#&u zsNFM~!b$DdpPRLmZ~8psY3I~awY17+1Vn{2V$+}x&Aq=Sz9_A@`PkUbbDIb9|DDaw zr+j%sOw;~`y{pEv^zCk*rnd{s`~Xt_NBoYmM1goQ}v{9jJ*SaDRUb` zRac|O0G9L0EU)jR2+zrW_+h;%mU^)axp2swyO+iwlT&N|p>w_6v_OxE;6WS>V;HrAArA!}YwYIMkUtFPQT4 zsB8rc$=$eaBb=B8V zBz72Lg?hM>%(mZ|TL+t6FPOyv3FAt!ou~mq&_Ebvl5au-P`rTtROc3Xdgnt%)GnBf z9NExXxs^=}70*I&&_Zk1U0hEs1whzPq}i5A7p}@7&%T=Q!OauJqaYi`;I$C&DI3$N z=5=OU)e+E)O7kgsDHMo<(9EomfvZ4Iy^GLdIfmf%hwY8K-Xl%{vb~o8%2&%jBvAN zR^&$Hvk4g7k<~?!dgz;hr&QfJd?eB9lJR=f{ve=<-ghDkM<1s1s`uDF+83y=( z6&9I4=55jP#vo>$hO=Ku`)MO?{7K}tWtui=82cS}3WTh9Nl1mC1kzS3Oj)mDq$Zx* z7crh|rFvp2nXq%~Nf~qePlyZ>Rz(UDMe4Yqre<09+$LYIl0~Z#l@vYJH=G1_Y{}xs z&{>W~lkG;TQkc!W^+czIQq`@~zf)+rGZp^Qog?0IPK25EmfR%Xc(VPLj-G+N_*L2A zbytRM(lLr<4kYIS6*#Y9Gd3rFk5X1I=osmlIq0PviM`O_MCoyu^R0@K1VM3eCaG@+ zp6?vqJh{71s_RuTn}%6a=ukh>BYQz*Ske9yz&FPL4_7QcBhk}oTxbwBrm&h}?X?pn`JIgM2V)=e2ifdcAugXC zWPS}ONmS-v5KOQbafhIhOT$NQAW5k|f)BnR`bn>s$~-C6S~a+Irk@6Kd?@4A-9<-h z7hwxV%t$EAZD(5Dp)@n2R3ja!Kn~uZM(g*G3u-4U{4n*K%IZaO(pNP`3Oi*p)!4Yb zB<*co@}LfrXZV4O{Xq;e>9k$qq?U{!e;3~p^IFenbD4p1?N9~+bLDCkKSq*etV5mc zrx3O=SNpJgVN8=ri{vorjNpbG>sM~acHw|=yLZ2FpC^VAw_?zx2ot*u$994RyMAQ5 zO54&G#px7U%q@OIRA479&)k@3=wFRkI$2D11V69(i{YbPn252Ui9Q&LXzT<0P$g;Z zZ+%VH!=}9GC>tuQ)2M}Hpx#ZUG;Rk&z4fiSGq6>Qt#}(8Vz@s^jYEew1$%>bj>;}d zne9rFtFl!Is%$kzoVBwQAeUH5JrTo!6IsGB^3I7Sx_p(86xoxgGvwKRhxM4qUNDMG z7Mh7!o?3nQoTh=qnCV`>pu4T7v|BD{ulN+eVFR?g_+RZcTFLqHm6XwDk#5QgXMW{7 zwy4Ld^;)LV;(gNdWbJIIgy4=QjEJ^!6R>_SPX&93(k}K;keu`Od^x3}cahkZZd}#_ zRjL4G*xA?Obg3hWZ)w*x~g_?YWS7<4Qc)>dxAj zOapAJv;8}&qRUgjRMd8!@;_#-%eF|K=06Y* zxkmF$lVAA}PZ?3QN9v+?_PQ(^k8_pu4OZ?log(|SzamMq-WlK z6np0i;A|+`S8vB*TVIvaZzbBTyj!ziB3oo`m{^_2E#Z~ ztHd$9B+?J+SsOOtlq{nsP7I=fZsZp?^@96IF@N~WB`?JomW&Qv~!N* zL4)%tL8Fxn(YBjeCA8V##i**qVim0vtyU@ z{f3eBYjw4i))%7Dhln2e&eBOgR)IRQNuadOUh@$?{Hne@ zh4i7p$-Cyr-A9V8z8q00-o z3AKYwPK9{N`#I0-W7Q?jO;f{z(B9O#aAR-)Z67G!OS3o>V6SxN-Q=roMP+y@67e^; zpowA4|XuKAVFST*BCIdKcJZ2uN6NEmqMJE8+$Td>HeKY`L76zN}v;p znOw?QOSvC5`tf;rUuM3P@kSrgdJ6@Vh)6K|QroXkuCekWA;J2@B-Q3FTQGvx)ziIY z@a(Jf6n?9-th)XkV>zqs+$7E`sCLZsG?D=1I&p9r zwi2EXu5Yin?Y3(#o-%q~-GL&s^5-~jI?;7-}1qW5BVEZ@*O5`llA*sE0PiCA$^>m={)C+ zWvMciw>`^*6Rq>N1$@%1Hr2}#qjO&NY_OGucsmTnD=y^>t5x7afJ-Q*UP?o+eDol@49UZrL$UhBzL z?5a|aIDeT^ot~cqKmm&|_ghAixIC>-!Y&1jAC}fVyC^h3coAx#P@_N@nbgG404$CJ zU=SeL;HmC0B{)?C8|sTQGwlh_f-fh#<*^@d=TO#_X zm74?*c=$PsEkZHx#qo+z-079rd$RWE(zS)lR+PrfxR7A}b#`kb*ZcTq#sq7l+tEbb znD8lEdP*CldYe53Rxiw>>9<)bJ8?m~YX)trje#dyBV85+{Tc1Ybhm#Q?E@eS^W`G? z3v}9e=Kvb}LWmzT3!Nf{l#?on-)eD*4VkCHZk-h2HEPfmEPO-&E_b^ulzo z+eQ1pcFzn6Fa9=6cuYtt!lQQWv!N}r|4N?q+sHWfn$;P2IeV>6b*{F#^kdz|(r}~a zOUoYP=ZHq}Y<{DWse4u!FsswFTk~mcMWVd!^49FlMi`Mas3y_vp7<#<;Zq|@)N+zR z2%dCjf46!x3M)FV>>M6Y$S?I-WRw5l$D$JAAMBOA< zRvI#{gjO-Gz19+1o%MiLr-DYB)Os?F%hmcVJ=rZdbX^rK$zqp`hnfnCw0aSN0-6Mv zGQ0o-y6+Jao&?ju#@V#-(xp@~zMHU?lDQm*_B;><)$LuhBvF$@tlsza(Qu<}1#2ge z^Lbb7AS7zR>*U7x;jQjIvuvesRRVH+P6{fp>S2&HtJ|;pm%IloA7L4QL9g|-dMB$& zvlx1pI(31LhLvTJs;87@qy6z9aDOt{zN_Uy>cv3j2g z#0^FEG8^5jRoo))0^mEX6Qtvc$QrY`i_SE}??lGBwwtZ~jn4i}UQr7lA@b{SDq(S% zxNe`XZ%Mck*~oju0~L!t)+Iu1O{!MsWQTK62unpBUx5$|1Vi1ZQCyM_v7WlX%sZH3H~z$Sd9jA6R*!*@Fei?5XLOk|3lZiIHR+f2h8MjLd_E98Xm5H-WvA(7t&?{jV2MO&LWmI#zi0E_Uz9ax$@G3h z+>Ra>H>A8fx%C)w^Qrk?WV6M!_wbmgvRwgM`OQN3b@-=Em zydS|h8w%Otwo?gP#jU7~7!N8qEr^d z!8HE~)jOPXIz3(QrTlYsRN^=LRcF}mA-mI?(Zvw^QkMjz}mxbb!IFK7&c@eC_6h*aG zB_v$-4g`+mEl^tg(r?*k$bvZmv8ZQ)3ns)TFz#R1)5T2N$d~Vg6zu>ZjKp5NP}0@r zgS8=|BhlNS6%qea*LqLZ`7ny3m0xj;?fg|@XPvBcVj(wCO~b(+(k4_`;+{~IoMbCC z02#ByJ*v*x^D)0Sh|*4J0fG`*muXK+d8Q?)|6+Uim~G_-Pn@C4Ul8fJA(qQ)o>xFrLF zj?q8)u&?%fBy7b5$>^rW70|zpzVs`h&-*$K*}Koci^vO*DH-Ekl#_SN18TlUt)el1PJu>h_P$B+6Y2Ap6 z9C%vd6S0FrP}t>;EK3>Q_{p^1PWH!Hy2@g_VDJWlaceBLWn27%S>Nv)p&O?S6yn?{ zGZ!5ifH5F;E?Jw&ULL`4e6O3X|6^AoIv%w!=~YY1A1y~8rx3eJVp@qmX_03+=kli@ zl~p6};12$_}`vH$NbRWP3@JBfZA^@p)ngvr1p5{E-4-#B^`osE@UvV@=Kmf$6V;jSth8m zkWLwx!QGUS7W}|MfO?4BE_PD2byV5Y!KcbduP6;Oq8T>xfttjt<6265BisX?;lfu+*^zapd_VL+57W zVOv|N;iJD?;M9rq0j%Z^eQp{8W2r|l9UEKnysmoek$iT{3yIAjv_XoYkl2ha(=MgU zv{O{;Edn&Si67smiU@J+i{DoJnrhRP$%RsP4__a#I$RNcnyF`QPR*VhPBQIMfed>- zhoA$fU+|QoY$5jnmu#Hwm7|z+TFY_W5^8yJjD6 zoQ8Pgr55!if1<%_JJKAc5ezyZoat3(tFbiDgY!BjQc)Yabm)=y*FO^m;&Wol^G5|gE=qVH8Bm0St6PiKgkp&5cnJHqJ zt<@O4Q{Vh9G(O8sywu?zZE!s=SG#BjyXbw!2LW`G7$V?zVT8Jbi~Bm;cr3p0nGz42F5s7U#l&y{)S>X}Z;k1%o8oi0oA#8^G_V0+uxWnVGUUIZ{>G+C^ z?#F>BOjcdjFtQ9^aSc0#gXz|f;+@V02bIvQzSw}AJIdA5o3JnbAbXODnHqk{(xP$o zK}2+~ay|}U5&Lt`vhr;8jh~B&K_y+GFI8i5WJ`kh<{^6_?A-RZl|no3$sf6gb2(qd@dT@ zDBCnKcSn_>1r~Jq~&!1Rg&A*M+KrdjV?W&$dDAVEz?K=NQYD zTc{UxDzkGM{}($$&C&Dv*IPm}klGo}R{zF}9j{g}V=S*`v#&|r>Gis6=PhTmTeI8Q z3Wpv!mE+=(L-v9OSJUZa$UJ%Gx$oyb{O;dP0xti1BVMN=p_Z8l z!r)mH`Wv8`ekjJ3MMi{d{EYgf`2Xdp&ui5IF z)9O;OR~w#)t`za(a4nBExm%xbOjt3gebV*a?t|e-kI1>Z{r)kMr1_3Z=6>1FX|8Zj z*hY<03Hd4)Sp)D>fZHrCd3L+4I?^7Qg2c*g@+usJ6b9Q+a+D{#sVHuuGYiMRFS%{>L^VgUN@gXjB;(P0C%4rvaGyU_JxqL*L z;HX5+X2bG<-eD)~{fiv6ZWYBjIUh&uGjP0DZ9}$yM08y=L&*28@ut-18Pjgtqf+(v zOXaVIzHaatyU%f@i&Wd!F{hHg{6kFg5Q8iMX5s4bLj)s1uw9q|pntB5%tp1}YptpK>xMbD4S z@<8>y@L(#U0$Mv?hD|0YBLEUrt2TCKdWRN0oLliCR~;pXk zMaWllJ@fzi{ArO{ZhXG;g{$N8pui&&?9z1dk_KxHfe%@$0bWJl`Du&2sNcZH>tzMg ztflvpI3^A3S91)Tf}*y_OPwVQD075oqXpo&FzmT93c+L0{A_8}T$J*G6Hyn~J+jD9 zu#Fs)W#}j9z<*-U!&Z@tUeD9uN)VPri;=Hlp|xY7mM1q7`o>qwpI4IORcCJZkLh8F~LU7ip+f16{zI)C~5F zpE14ynL70LG`ZW*z6ThZZ^%{-dM=ioMpK|(y~tzZ;L%U8a)VeBJ%Ql zkje?j4kW5<1BXN>+smj@ia|ON&-IT)meCi1%zgi+T`t$}>uF5llxJgeIpG$twKmU` ziG7o)?O^J4Ju-2nUK?x*9@bGSU7o*sEb);i?0-S5t-SCG#ndCc&wXY|G7UyzhY`CT zjvb&>Ku?j(w|gEqn;`3>bu}69()WLB`gR7-o9uKLW7&YbExH5Re>*2RqQd~}GD2{6RGNnpN4Q{(8d zV7|~45=V$guT(G#HCXoH5v2g^Sve)#t{zSvN>DrEoqG9WG#V?q%lh?u9(yU)#PFA} zCgOq#elRa3_~TRXl0tb}kXD?A!)fv4on*WuLoi!RZau|J4fgj>W#Tfy3t-CIqc=rU z2G6%q3)pnWVKddBLyzZ_h|2DdUlbZcHyEtn&Omt-(cyh-@ZeM60;5+yU|*mZ=z>tD z(CSTEjWvkPeg&dDUP|{{2yi|LRzs+sT0&$Au5u3A&d!pm!WkG_rH9fj4<>k*>uL9n zO7}wLiJ!#9mDGa=j$Sq zdP8-3IP9ZyLAPF{!K?oDO3hBo!!E;995n$FP5@FJMiG5! z-dt=#EFJM0;GX+@0^+N`^?5Zubi^eOKG`Ov+4(&ksLb7MZ=Qi&^*i|g=HCgwijqT@9J;OUo7zEQY;kxf{JdJ3R%=rb!QX~Y{*7B7OUNyCi3D5@&!1T5|10#in z8X+TkzmP<*Nt10dWT{k07!0l9Oy)=uaKL42EhRRxPko5mdhcZWv()4a+4FI~;<%Ob z?bQRpeFb=#m?Gq%a0HmIYB87+O)>4^&AvmNZ{_DoozFRU0;z$9HeM(-Cp%~NU4Q?n zBx5=r{Su>Wor5;em$mPR9Z7AL_iwq5j>~1#w?VWuS(tABj2@{IrYm>n9oHbolU|c? zaXO;soBQ^(KNrp=^FfjX8TJq5n2)& z4&pxhLD`2-(!kCngbw?7eq||}#!KG+x{Pqz%=rxWiC>x(UElfm4WIL9ZgkU#Q}JtG zC=qG_KrN9nqmwQLrgmOqWt035bq40hw4zx)_qW!0N&VK7_24f)M%Dv}NR+$h;On#Q z=kfXepkIClJtDy3<^*yET+>Y`569-kH-)_U%5(feT!wean7cBeEaeW;SuC(~w174m zxqBj7nNK`gR#W7DTSxZ z(wOMTbw=p(8{gfYvkU*<(G|kT9 z)2J~VsNjSmbN|pWZ|y~gq4Gv>XHb4s)X*#S`)we5im1?la?}1aYO(qX7U6t0RYTubKp`ml!va82@16L0YQn)Pf&h1Y#2VALax8 zMN9?<_0qasbAa3pHL1t<&BvC(WIlEb#(bFYg8A6OLIC@1!B8T~?2hDHee3PRWvgN9Z;Hvm@eg8h z2sywQXw9#aF%69X?o9^yK0aru`*l2$d?5)!08u3{b#zFH0ONB{2)g=&py&r6H^R@y zK~rX3v?R6FQ4o(!h#Cxpf4oFu3r3dGJtyo}h_eRJ>+s%x12AMzccy6|>{{E1qQ zs!7V6fEa2RBx@2titvT<332HII6Zis!P2M`JB%O6C6z;h=PN9X!a7eLoRq@2YofU- z4FPU|rJ_}ri%ljKRR>}s5G7|4V|-g1$^1hnlkYxYPsL38LOKI1Qt&=2;b+n_gCFU9 zEsd^$oHED6Rrt4ME^uXck4G$`o#!@0853ue<_DH~hg6_85TjFFH&bP6shd)3_bZBI>Z$mO$VW_z=>Veph`2C2=jh}_^EmSkQO{4?j6GO(`+A$OUnkJezmPJ+1Q(;WKdSYAkVYap3mBUU$Fg2HZNihrEJ$ zv~_g-9US!sqIXBUBsB+`1IcJIypiw|?gKMoA4cg{Jvab?W;p&xMFEFWV_+u)T#rN^ z`y1Ej+$X%h-3HEOrmo#rpLlw&o7$)K&wE{R2M>k@=~}y=3MU+l!^00I zY)bWNd~*V&q2}3N1Wm59X6L%kq>6O5`eW(TPtpRmG7{Jq@~7AWSz+erPb?$0G6j&& z1&k>$x=~jpR;gUA>sdBZ|Cs}tAH|T=-BC)$6n19#4A=!mDQu!eRvJGy8Tk3wKF~(w z?%qC--zGJuL!;1cU{bws8!!in?sTGTeticUZkCR)|3T|j8fqL~6ux)vGuQ1iSS%`# zJk^U?(E_Q&q4q&<+r=~o%Cmb#@0Zb3Wj)^X&gvvw&s4fWmm3Au6Kwy@1iOXWHZqQc zJrxOFiirPJk@6xB{`ETDDnFuMUVU@4)>8nTZClY6}34uV*>y0{&t>?oRseO!* zH$P=oQk=Uhqc^mrv?{bJa|#oww&kh;4~7@`(Z4NBc&y3L=-3Sk&ta&GNpB41X2Pc| znU-Wiz4BbhzYagSSeKU&um5k0MAsCW1zLrCVLUt2IF*eI0e39K!sJ>jmV2)2=((BE ztQoezI1_qyztEwMJ}Rs?IFw>j7jr2*_gqOU)u7&T#-Lm$*E=oLj(5c)h08ec_J^Y# zBLInU9vv$b?c8(cO|@fUoKd`!Nlif;5$n8V*1x=5L&g%z*K z?V1fzflIc{tHJQK^7F=4?3AuMViUpV?+@1(Sw`sS*119|u+kN_{H3h(LyO^xy8e8t zm=+moi%W&eZ4kYI55kkP8gY=uMiLf@q}A7VR_3{}jx(+fnuO*(@wPOahD8%8& za{@0Q)@?f1oo&5QT4}Q{u5-`2vemm!NI3nod0IHZb^eY!o!c6`u?a;21&)#xOPN!o znTOG~vWVX+Z9*3OozfOVDO#I{0z<4`pv=SI)w>^Iusc{5v|870J-_T4`BM%(&~ z_djtcJ!_vgg&ULr`R@-0)0y{ia7MgRqhUL4i-XhgS4v}#4}IhFJ1;sEvMFn8fb)y3 z&yurPpM>5JG0{i{!bohwN4g+9k1zOq*lAQCf|i>GnOQW*Rgoc0h3uU?M20iEv)tL# z>xl;2Qg*e8F*+V>o?=S#B`ictBX!!MHoypOa>Tf<1)de=AXdJ#1)pV;e_B%LAh7g zMpNo}wD~(JHPgq?JsSTf4d3_lWSH7%W_Fz!Kx=mzSfr1xA!bp(2JBBJ@ZkMeNPM*c zoOO}?3lssKF0n4lM))t|e4_iG=@kxF-GRnz6Bfab37&B*@{BJT%?X(=0$0is;X=thU%N78 zD>YwOz?;a^t2Ey}EF?)7&l>F2*el+C60tB@PMRWqiI#S8a?U+mT*ci?r`|H7y>yNp z#hoq29x;!EFfp|=fa|)>ZP%8E?-*1j&wcJzCnPkh?T51GROQR=+Zx-qU28Q{$%c)e z2}+;`vhMBE{fs33Tw2Su_c&zxNm1(E;aZ4bNMD97q{ zB+eY1RV9AP1K2M9tcHswWtf^6_j*rDiTm!0Y>CCFOMg`#+9P)dA7p>b_Dmi;&E{EZ z9$XqM?au{o*k-_BQw?U`GV-?@~QFIph9{635w6nC(x~FLM6< zI`N$&?r*&1;tHN=6W#k=m)~f{-eE@5*D*Hv^ZWu`GCTN9p50^<*`ApwnQ$!#-rN-_ zD(q{w-0!Kr+{4?Xt|o5EA4-%Pk+3Md5Eyb@qEn7)dVWaqc}w-rtWHf4)*{u=KvE4X zQV_ya^rx8%44WpJ)*~%P#p(+NBg*3xt;Q1jR(Zb{{=+V%?~Yf_BFH3fK}9rUulZd~ z?p8iO&zR{;o*7+dAKS!H9aM*l|q&>|wYPz}MYD+_-n@a|sC$}^>Yp2%` zgZ5M*n)HHEbCrKIGAf^7mKNH};~Mfwjd3jQdUSIQ>dUFQ(}A?H2j#7rv!PzGCltSs zE#m5QgGeu<5I$b|?S;67(S^2z`PZf8$p3Sm*4$q#fB43KMd7-}smz|{O0CZYyXt9# ziUvfa1z2ZV7nd5zIObixiLnj7U#Pu0uAV$k_@duqjnOC-#eO!$lv4PEKGBotzBr_k z8xmEr)9dJ>=sbV6?T2nl4QuwiV$l6=pH5KRy-(~BU(eo``ZtPGiNIYrTPt`WOZgqA z!t4&hH(wdejgB#2ibT41fOdBTvd1_HQ~-@^2+9k|Is0;Y^+R@oMcLRlmiE|sFMxe; zljZ=4?=QV;*p~Pj7wj)J4y;eC)qb5W*|TpXdeI;1a-d|z)6$12VWxyx2{d0-c*Jzd z-MS)Oc_R4mN}R0cI4)7mY%}cUxR6xIO8A#pb`q>%kdi#BgkY+*4Dgs3*Ur`A@q|Bo z0DivxrkY^VP!~a7{lmCBwBr;MM)xDc*Dg841 z$uApIgFK;U@K|J)B9F|+Lywfh?|1>SyN>ufSC6+5e}~+!4a=-yO%0-w2zb)dUY~pY z(d+AJ_tBilcx2Vzp36DW!fK+)J>Dqn6TY;inzs3}FTCzs{mT&HaYwxeDk@a3bw4D` zaMYtIfNnYdf|*3#qBSc}t+E2y2_H3MMk2oJ6Mee$5wefQcfC}CbRysZMOWtj`&N+* z-4U;h$nEwH>vj#TH85+20`Ex@k+HO6+JELC@BOiDdP5fY7-G7pPd`(VOibCUr^K&= zDagu!Gpbzlu3!W;D|4n8LMs^4KEtcJ41>-qbKcO2!DGnc4e8d+(;|QtA5Qae@?aXj zM~_#e76?)~*v#+l%97CUU7Tibmg5pOp4qz@VY|L~y}S4@vEk{tW0ilvBReC9qnL*0 z1aw4TuzNnO~7j77V8%3+PViz3axW-;Y)(ji+Fus47IrAVRG-gYtiQg zqU5Dl!xMH*@*3$5xXGP^JPb9NrTpo^Ee%w+CO7g7+ig}#+UcJ&5%(J z0a56k+CgY_m4I#CAs|IXeVX_S<=L_ z5@LV7#{Gf!-j1KiHaq0f?cLf=F@v6^D*_8H<{kM+8az-(39ryh{19vnp$xlTP2(ZX z)|Eu3Xq5jPZmA1I-pgtCOVjzt)wFhKKQ`ja$@T9D&w6dM#yzapVKl!I2t2_KIBp)! z{uBumq(=r69cy@jdB8p$>2Q=MC|zq(Q(Y*3VD#h%ApMTmf$)cv{C@qaN@8;K8^YyB z@TD*CfP#Ce6`RbzmnALHrNHHnBkg)nx6>o_{eh?XzfW!qjdo{&S1jj8@#y{5d0E^T z>$A1ix=pdLRA2oLco9f_NjiRNI*=Mtp!zxTlC=`a$~Rj=G16nw&jaVzXB%qkN8A?D ze14z8P=~-hsCB6584xY&y3NT-HiQHCuYSbz59-A97^fr-cA!&}&+nHRYR`?ht%xg1 zjK#x%mm#?za$kE#HR@nqvTz)&sRDx-=!oVjyS>FtLV{;47#M>Iky&71Y)GoHfO$Au znDr4DhC2-$vZByDxPr?y#OP25_{NZw>L^El08EfBpY`LoGfT_bUkGP*UPrBL*SOAO zM%mIA>H;&b1bxwmd(aZ%085dfmstXpSvpzqFpUwkdt z?!Y>Y_M^t0bjxJ}i#DCwM6oyMO|f`W5VjY+Z;RdsV+UJB?;R=>U(5P(K%za`y`chZ zRB!aSlZgkJfP`+)J1MM)Oo&7T|DRfBF0tt0Fme~?ma8n$!D1w&QJl3>q^B0RW z@l!I)@qsCE4zl*Y)mxvbvMUJZ1;Gyem8^NRa_d*~ElHcL%6Y#g%C!0027_ud&Gcgp zqnvC=qAv|_#iP=id#od-pG+R#JBfg-NYu%tTF>v9+`SBfXxD?X{evH^)G80#2SST! zO$}`f$VfDu&QC<0mzt8z9%Zl3I?qzsEh&xfN8-{Pnelff)0%EgJOk1N{6jAh@NgV& zCOjOZ28X$Xz69U{YRr2zoKd5-wI(AgzR$dNdXd$Yioif;8$%)0GKZ&g_`Mq|5G$B3 zq`))W{CL|@BAqKp0}WJ}HybTf^q?Q1-7~fVO6*0%mfPQ$9|!E@TJtwre5z zZ>^5>Hs@^(RF~M1-}VtiZQo7?QfJ_Vb>!aZZcxPxR9ws0buC_EhcQmebc%o6s~13yp@Ia6K5?8Oww2 z$0RNAO#2eqMs1HIdkeq4vO|gNPFy1EzR!WnCz+M(u)k0LL{DGTl~7wk@&3_+Rg*xg zGZc`=B%#Q zDDB+X&~9*&$oxMR1Bin*3H;?oP?gZ5jj5LY1ifT(#|8Rx9=d^ffPLWmJ&Wm!nuzC( zZ?)dZ{av^9?Qc6$fXGjpF^?XTE}NIwZ!>vL?&8)@i@vX>nJPuRUff(0)wT!x_g}Xy zr!&pg%x>3+qQ)S7ZKcK@tlRLYG_^z1wth>fDf+EQuc>R*_J-(dVJW%QXuY=5*m)QZ zqM_5X+e>fGddHl*ru4{kdTBNyiz~SvRz5zsH2fib&=$8S{W19tJPUA|#%ezZ){qzm z4MVP9S=PcWqfV`M$E#YjNg(8j<_L>Xxqxc)&rsE2`nJG#4lo_@t^49Wo9a*Kc|~JC z0PDUp34ZxvI32c5=ya;|DDz$C1a$ms(2)Oa@|XPPALZAE=U%@E#til6Hbn}1>MhM26s9i& zllWFIRSxKZ>R2)%jiG#mGlnYf-D-3%)U!tXb5trR%%uRAg>8}Lh8;cm*`z~rQluRS-uMU zThai+1F+I8oVFcn)qWRLYSa!XxjB)gTR86^n8X~hVxucr;W7SFt9ENp0GU9m_Vo~0 z161twMDJ=Eo zKG&6GVa>Vv-^h$U_>j6?;bw7XhtB$acB5~>rGj?Dw|R~4`94eQG#uRh;Rq#Z-f7ut zr2P9~QyR<`TI_`y|5BfhU5uPzN28s(Z@VoC*PSb~DB=m1YivLLpX<>_&@QABmGUO4 zy2cO^?b1XqRec|~yKifkoa+X~w)R2LpL4v zT_w`~K6xvXd%>Tc1{#W#O`2G_S^0;-kCD*A9W2rhjZuumLxo8f;v&!3d(^EE5}0g0EY=t14vC z#7yjXz{L5K*z=7t|4WH6i({zO@Uq3Cr^3_UZ2oKC2D6Fes<3AEEV_ubtBBuW#{QCN zW|e7^hqeXUw5q!!^BVpAUC%MX3`-gohQ|KF7Imej!X{v0&}FNz+w=gzGx0QqvPbtI z@}vNKB|a`{Wv@a7*?N*_e^CP5q%mo3Nk2<~Ty^KT=b< zHKx`9dPx7FI^%+Wg!ciHHqrAMK{;)26}z%>QMw)dF}wq)TU^TxMrs?Qv$*7Zoo zWzkDG#o&1Yfim?=Evd}Sy;|Hto)ziEI_x4+nK-|Lj1|0Px00b>Y2;z!{IV^PzljQW zE7&qC429>6tMY;$FhMXaNCLqxP6CwS9zP9@y&2 z42D{VzPmr?_ihzaY}!Ou%&jV>Vq&fn7s8q3kpq=NGRV7h4G9M{e^3w!yQg=+MNDFP z=vGVipP0Oh>DNQcD4*)eXd>@rUZMlK$>Sn*WJJRR1+s9$F}=KXO$>9>QZkKR`#HXW1 z%wwQGxKCS&NLYVuqW5IGR&Z6Y;lM!mXyIW~_s}N*SOlvB)^%*{96u8CyX6eEXEb0d zZUvf6$h{3TeCKlUoQ<^m3pTrUYJA@DIQ6#py_)vS0jt{Rino$$@Xcl; zNJU`TtD;$b7QT`8504r4i^+?2WXu1Hd}c}OAh1<+7Jvc?{sYV zM)dC-hSc{%S1K{h(W4;dI zg(CjOG>nDRvo8D`+#-7H1JE+pZOgC$G)YPqFqjKb5Sf9~*f0=>?fX-B{5vdZj!MId zj$~AlE85@jW?jH~=BPPZRQqy3cbZElhwH*~sY_E$C6xW+h@_fVTOFfp-{nqk#Z+Nu5#^S65Do5cPX zy6-+@%9Gx+WL?!!2Iq&;aO=43-`^yfO2S^CtPp!AXBjl*p4WU&YVmbQj9t*TUJ5vV? zS+=jA28ulUU#&ybuRecmxYD2bwr$I|#?OuS`Fq6{6G*NP>FOH2Dr;RSLKh@mhi)p3zY!}|_y>vW#ERW|3u8%euA zP+$q_dYw=C5r00#@r5kncH$ZEJ|ncG6Nki9Eok4564zMrWx*fZypbq4)EE&=Phak2 z=OkT~l#~l9HPR0X*l7h7^!(%;dm#q{RYQN;M7;^jv4f*BIyxRg5ECb zj?!0ewj-qGd%4688I9R>coq$dKCf0BC|21Y^cvm$%|tuYUv{iz4Wb(=!62qY%3qbl zG#%snm(UaK@ef@->@L{4otNB03~@`6>01E=Y}RNEb(n=_zkh(Ofdm%AUs3*+SQHiU zJv>Q7QP0N$6~6mOpu&roJjSr2&nJ%MZe;~XvPf8;`x2!_22OFBNoq`#sLe|eOM`8; z{F*fOs0QFqm?Oe(FYG~)GE#pMOcTJD;N@s;g>gU%Rq#eSLhSp9^sZ$*G=$W(XLa)% z#?Y|NHJ^!&gZ}Jq41x+I7$sS2 z#Eb!E2Py}#J*4PW_hPJE5)OjRAUThzctcm+3%S;}@A<~R#&#J+;ynL!*Y5Uint44E zyxnwPP%hqV zc}G#_C7}wz-*}@$s*HkNlnW6IgJUG+e})7u(xPbs8gALZ3H0Ux_r?lqGIZE36N#Z5 zZ=HnaMffr{{a79M)aZ=d8*#o5HAT^dL&4hmomwH@;X8r^Of`1o&8p~#LUxF5Ga9(~Gd7EF zZx*K@zSbo*TM&EeG}wI$!*ZBR1sh1@zaHy`)Q-mdfmTfoL%8UE7Jr7tdvp%zJC&%q zGAa+O3<X|au7dx!Sz2<6nkBgmqkb5F3JLa>hL_}zVLxHUEwl|sI6AonI(B>CK@ z5~^B^%c$XIUa#!&C(+))sGr*EY>p#4j>#X2Oon5!z~QX7?It_UKAJ5daRR;lC(r{R zGL+pNi|?R}94j6KAC~e)kF1=(P5bMjE;M)8cbud zhjw`H@KqgJ?8I7Jh^-n>Rv2*b?NI4R&YG?VZ}wls-X3Q19ZC#-8hKnaQm?PFDZiIe ztnLZc(juYgo;=0kkj3L>VBL^dLKg7}e3bEzRd+|H2`^gmSQWj*xSV(Ph_v2E7(M6( zhI3y3e2vNT`6hi1?yRwTUS=TC4>BD#Df^cYZS>sslM4@MQC2ihV-1yXGuNF>X%`1E zJNO9}iKjMlm25$yrEr^Uk*p!lI^kZ8-aU*6J@;k!k22!QRsnk2e(e*Jl$DN>!33n~ zVOJjzV4zT(*p-D`4f^PkcRUn}^I6z{b)MD=#_s+WOQ;mK!2EmH%qQ0{Wed&@^8P4g zcD{dEv@}K3b%D`$w#`*3L-$+H#wx8*XCB-Ch&|Anf2zOu=p|>l%{!fS``!L$f#mn& z_jQ|F=L<#9wkZ@0eQMx$4rg`juNRSq8CP}}TV@*Ela)KSDfPPtlD$xJt|gY+DVs57 zL<$Y5CR76%unEDngt^9vFxPgfk*h)epwD*vkJxbh(#-Z9wezED%WY0PWI?n$gN?i$ z2TV2Z$YM`%tS((Y>=kzXDjXPZfg!@|@u!G3SJTmXj`QM8v!mjMw@y6w7iZeuLz`WG zZ>}Ho1aL_*>+;i>;2eM=bO^01FO>Ykx;yM(Sn(Rw6GW?0b*> zXt}JpwGx$p3NTn#D(69T`@P;NcfO2uaUd3x)mG|-hoh+|TZ&t)Ig#WZQdDEmT5XxO z2&zUPC9WHXPZJSnH#>8BEgo4YW4L8XpKy4VkT>kCM~_8B=diKAHFnqUH6ApP^ep^h z?Gn0$@tktL!P9qIyqDDNJOZBE-gsu*a4LINzdoO$c-)4X&#U9mBgP;L`A3}!2orCx zp1YN-cenV-V5URx{|-3j1Xj!M3VVC*V>MXA!OK$jAb!i)7V~!IU+$sS_p2;YTGPQ6 z%fXpvJZZkbSsk+-+p)oaGtO2|4#L1b!>!mR1w&cHI@--5M|V0|5zoeSMsW$@MWzu{ z<*c3pO_OtIJAdi%vGPplL@&+uT(JG&4q5OLXB2F)VjS763P!vrKC$|}9DtA>!<_a$< z?I!?yzI`CI)ArfHT}N}G8%vPXs4eWggff_Zz(SLJN-WPzVjJT+V7SupZj?-`(?R4Z|)4oA#v7NW!a=8<>!TTzb)jsfIIsQ1F;!(ae;3S z4EbK1-l_l5`A=_BVf3NS$A6-CMr(Kc=ro|wB75Xc-N4-)nK!<29tHPVSKT8*T1IKT z{BYmoSQUm>jGm{Ar2)C&MJB3lGu#;KS{qp+WZrto^~R~iH9Br}&7(<0*1QaSd#e;P zoBO>Pi+L3vBRYe`cNT%Kpnu*I?`75K*aMWgw;_w^7~Pi9W^itGXWN06b$<;z>;_AP zU-LQjl=S5wf78v~5mlSv8I$ww$Y@%P&5_l+o!WI~=ckdm@u#)B{s}g+H8(|#Ti-qS z!Dv>4GgVjNr-znr8?6`Rs8n%?9c7mJT3VeEopmX=#JY1@=SMVZaQoH>u}#QxSqwiI z$P@c~zAV(cU$+i02rr{=tigW3#rODW!#B>NXgWVvm@51HwtVGBT*6MMNbEKv zi!M=)Z=E;R1`EPO4lYQK_Ul}c@gMzOTp{k3>9@{Xp> z=^<}iOSej8w)iZb3aqmhrrOs~{q_*OcCTLq8PD|pIWKQmjIKNBO$i2Pw)^$Y0fsdi zv%=tO!nA~F=E8vgnwHi#TWfCJ5wAR9>dBo`8&VhAuBWq~6q*H#Xb>-k8ca4JJvx*< z5`0)2Nk?0!pBx!Zoy#D0rGKRJJS45KdFI;1oegO{QxtI|tljUmzO_8=pV=Pl=Lu3pKRW=S!)e%v6uWG%~xU`AWT z=JR;6Bc2qz%3!IZ|G|L602rExpNJ>7 zbZB3ty&V;rO2>}x%(U-k@$Se9=4hpKna**DCl476wsUEASDioN`|xw_BWf)pMC!xW z3>BH}tvO62g>5LCVn6i$u-*2*x(qY}B?iu``c7h}702cSIWU&4aw52XAuvpt#~?1Y zQ5q_&v~AC_MIIC;M6=k>Lci0|oOjIi6 zfuX+@iQ$kwBSR6_#xp{>2QB7HV^GfFUK$-{7w7dZ;dxMcOpE4hap=ArFs8$KsN@uP z%R%)7UbD;u8Bw}N?%vyB_%W^G{pPQ}67hhcSckP4+A`d8l|YqP7dtLFrXz1X)aPWV zz`L4%)7sZQnexClQ!}H8cLifM|2v)FsP8=vhTy)QX^Ske z{UB@kP5g)6k-{5}wPaCKfrkMs?tg@+d=$ooPN*?+cgbxOSl5oZRAkB+GZr>=;@tVj zXxaEzM+PpNvLY&z|CaIgxkv#=8IOhEa~-0k+#L}`?c$ChCieru=cz-yNwG!OxMOhn z?K>!IkZ*S#bbTNT7MUg-o6HaNyxdusOY6xz#(FhE_6UCzk-hrPYC3av_c&8iyWIU8 z;5BD729rNoSDImtGgy6H$?XPL_9?!4tjXY)iMseuJgR3_fP%q2>juAPIKK|P9pc?r z@@*Z{+w#wLG<_P$rq-I7OQsE<@VWj;W@oRlXMv_hR)5_%*n3(Rw>?f}{drSG%m8of z)7vHFnG!tM(5~wEoRNzDX3w9ai%!v^+7cM!d90AhXOrNx&#Clz9&0}`8onVK7x*I) zDfBp-&y{OiChj^3Z*6;Pp!q9@I9aIj-uf_&3VmIG0T$F4&@2W;rV4k*G+S4y{gimv zaZddDM-6o`7@W+tu%Tp=yn14V>hPZws3#@y{rdHtpkfbLr+R z_mHIk+bm@=qVwC>!Y9SM%aEM^FgMHg;n>cv#>+;X9fUY3$pw6IJpVVSry-oY$#_`T z&>Q43QUZkc20m^H8B+m%G~GyvD-<1@tfmoG?|LShZSoI9(LR69(CPn?)PTr?YLjn` zlqPxKW9hS6q1hHxqadPN=UEh(L#wMBi*D*`bmj(%-&+UZE|7PT4HKl)8bkCC6;|h( z!uCIh(R0+biNv&VZ-4RlZ-)J=T3%3F(b=s=QN<>WrT+1AJH%K?LI`?zDw$qp1bZ-B5m*htujG=JT(cG!C5cS4-#o)Et=qUS@on5-O0&;J@ z{RZ0A^h{RHLSf?~07=^qMXKzJ=ubQFbxDnNYz&>lE)n}XehmB6Jch~+zsR8HO@q#8 zH2QY2zAAyrM!X-dt5w`i#k2bbO$k2))jV$f4mL*F_bPxf&#|Kl+K>a~^D(7M#r z&d&|tFCWSZ(!*pFp;r@Gok-@w8xlgNB+SJ>jTIJefX`bY$;x?OWV+Qk+$263TuQf)GF~bxkVWY*KG__bB7P2%S#OZ> z5Ke+&SE^;TvehpLX+(28XYz~;{U)-&8W?T6y~@%#U~J~kN3_Wmyl=1GZh?9GuSR_Z zU)rQqA-#TD2a`FHQ9*KNh@+aP(x5Lz{(VB8y#qayE0{)iyg0;e`zv)tZFQ$suqb~D z(vk7)-`tl0cD;P07RC^cn+6jZOY!)>6`_mGk~G=US|P=eLrpfsGd*)`)Dm6%NxjJo zy7N>aQ`2>)$1~71YgY-kNu?Hk%eLuQ6o{ZWGiV*n{9>Rz=zDmL!3p4gp4B}e^U$Zw zaR7`7dC{pAOuNrB2LtNw9O#``Vd=(0;#GE5Hl{&#UQI166CNkEXz1lhWVnRn9tbyK z5uR1{XSF3lmaU)?CD!A6Ci5%$cbnPIyV&@%3a+q+RUj#aE%wg=;Z9LUft^#qYnWso zS-}c{nFb8zwV?1ZAIYn*IA@^xH~8$*(m-5zoQd-c^iN5NPBL*n8$(P_3!2D^|A??8d*df6{R)lJX$L~pnjWoZk));zvU)Dc=UC`5C&Vicw0+CfxLT9j z=7pA03s(By52_uT|A;=7`{MGp|?6HldXH1tHZ@Ku4+tRfAidtB*gctFg3ut0oGMu|FLg^5qzu z&tve)BISto!zWFaPssztW*@epx44ApJ|bhY`*hsh4HeeFiwv9d7qHuhzGmK!bhFL@ z;#PH=xl`NZSL%9CdSywVCA!3qj*b?RBaib1p`=bOqL4?c!b-0!S`}2Hd+{Rzb0U$n z@f{~H7ZT^0Q$`AS8@<;_)DB!l28Zm;J*)9}_QD2)opFrFI?2hFT_JV`TEu;?vidf% z4rL$<_$vOb);6P>O;hWvdNRH&SKNy^CFQuns+Ln}B za;}Nz5TtKH?r$3$-3W$~f>1dx#neu=u80stKm*A}pcy#OhhM*~MTL3&j7Bs*$b+2q z>EYuoFJeF>f4tWGjb;=RJm$8cYBivK-sO;ccjjc@0y80BLv_*SQ0lEUNJ_UGyBMMM< zWw<>}HaU|Xp{;PpyQWwT8ED7`q9cExKGL<&g5a}GR)B6sl)ed3fH7Y>b@E{F4e_hA z$k;}$A5C4|6C1UaXf67qVhUKxFdpFNV*BDmJSP(SoeKD^N)dnl|K|>MmU9PH?bI%{ zy_cSKTh_fPQ1>-^6Ir~C;U$)iH2Iibs$p|`?hklBUcE`r^>29v&7Ah=kz%*^0!Uho zp@1tGV?jOgLytfYVs2W@Pt6;d8(gnppLA%9nagB)aTG|i z^mNYKXug^k})d!TVaS}2?es`vDUgL zI$wy7;gBvCm&_-<+^$2PU9QGP8J}}SA1fZ=uMZ>W_ak&B+Y&LX59t@q8vNOY0FLjKPP3{#9Q_bQbxw~UyH1i4tI(wtt5Bm)`^_iFm zcbestkxqKcaPr^czmh4NyDQWF14yDLfh4+!iuE1DUi`z*@2crJ!xe+l5DYNNGIvK% zoP69eoa^7aBfF zRBh5HqcgEoV@rILE%83)UoZCzOKbDXZh?xdzqr~n-0u0y;pBJF@q?H1#iK1VtiO5B9>1@aZ@s*M;LWjw_Uba6@&kk?k`NAA_6ORqY-`|^^!@9k4 zXSp(X;5DA-PDk=Oef`}Ir)(l>QQvwxIEwn(Y~CW)9Y(V~_r*dpI(FGF(Hqny#8{e} z-0mLqd;UuE5R3e;I|I$1Okv}kBSAN`AhILU^SSuC?t90HQYppsckj685wqqMahp;8 z(uaXYo-?LLILHeB)I1HfgY`L|Zx_cKUA}+t8laI}AkV=%IRsfT6Iq$mr$<`XS_@}b zwY5xiXroqa&VdD|rQxwOLb)s70vwv0A(Uzh#AKZ*L6nd0e@83cx&&OTA@?V3t<9Ea z*T%RDw)Oe@<84EsQ#AlaPe#^rqs9_{-AR@&*2!G)q8hc&_MfP}gHB(92bN{0G;#NA zUTcyLD0S52Y}p6s>h8|OzW-NFCzgMbHhY^5nw{SzeQ8ko{A2!R{#+-PYU0-NI`O;P z^G)73G36(7nQ1?|v7Kk+s(2tb`fyvtXbO(FMvw3>?Q}ijIhEtckYy#F z5^u9A`y*6NqDXlE!Y?)XM_eO4*nD5O#$QwNmqMcfFkU=3&#^;>py)NyL$Q^}*wy2Q z$+(FBG3**KITw$895&||D)_NMHk|)i*L3>xm8tDv*&2(Z-K_^{!B>=~=dUC#w(U`+ z*b_|nUcCJ_1Jep^Ku-4p#o&Ic$nah%9Z}!ms9PsFnfNoSx-{y*S{R_>NNpsif_v2W z-eg#N46q*0zesuJ{NkK*i;9eIlNNo8|Bs5TBI{JFrC=B#uQ8)y&UR+vACTz}X*}C-HXJiQA-OAi0j>`RqPy9@lW(#H> z3a(A1ADM{4bH9SDbi$eN12pig8&lDb+O@DQiJZfV(Gl(yq6179kGJG9_(Om`ggSzK zcfLS@XR==7FgeT3Qn22}3X}Zq6hoI7qz;iEXzL^DkRSwyX}yqRnbSJ|JIKaWEAdw$Dd>#)nj0FKwds?8{SZ!VQ_Cot1}c6?>W7fpQ6 zdCQjB-`p<_pTgYj4+Jak(h(b+|G{Fp#mU@f9SZJXFdq2eg-M~*Zn&(L1aleZBe~M? z^BpTJGimp}3fu8Wp56AB=L$#IHYJrXqiqwiEb*-DpDp*dU89l|cxa?23-*p!Zl9ig zq{#k5e0MkpWS))3w4U{BM&#nhci3_MgpI zd%ySny}uvY0Pb?4o7+rskHps;3ut8iisIJa(xV_HWUcxYkvrbV>qhQ;PF$$cshQS0 zFWNs-D_UJedv~do=EMiGz2~%&A$?Z}%?|WZj5!;{0@`_j@vWUQ`-~i?{j4Py#?ZAc zesC}WAu>=Xshkd$c)Abq?W5<+H6dBx{Y@o7(zEN!P6&Om=w!dYHo`i?e&M*!cM(U` z)n19a&6rCq`wQG6M*QA8Q1gSf{Po659DP(M@V4mg70CYh(s3fI^#{Qj?7S2~zZqoA z!;wQ(Y?RDVm7Lc9InZBIr9S0!IUk`4cWfa+-43-S*7Z6P@@IMMExBHJtmO0cRETUPEKk*uN+velin6)BDK=U z>*fU0n^odK?ckrm8lV#G&b4lTRvn%ca+WQ$Dyc%H-OI76a?T;$cikTWq6}>mh%&O_ zYrjLr#a7UKWe^S_hjgSCB}sj*juaH^WUTcLYMd|=X&bQX|7J}C%F-0*t7FT!_LClYuZrU`nldI4&yDe1TD|`lU&nX_8#$P68b2s2>W_! zv1vSsz$n}0V=wNxDycu_PTJ2cR@ky;m zDOH??pJh#Sts=!eWd!_J=WfpuH z!N19sQlaARh~A;%oC+(fEHx&OxMwGDy?B;!mdnLqt2aTP{oqKr&yYy z)o;5DD%;X>_B-ywn6cutIwckD0(5JO>D*kRTPkj`5B8@zduPd}uIK|C9kC_A<&*jH z?>z{cwhenwAhZXmH&qzJd(i)3Yd>G#EMqg=Pq`NeQpYlWk4vg5{?+vwCp8A9`y6Ag zu`p}$L$2HKea8)wmiqie9d(PV=8YQ;c6ysyb2w!sa5Fy*}b)IRUL>ZYMj)ird`jq%e z3jAO?!0+C;rnvPl(55c^Nl*!w#M4G@w-&V(NjMWzqXX_qBsiGsm+u|BgEftmpt}77 zi18udy@LT%wn69g{J~M4M(yjtA?3le^D0iV=k(&ed~jrCa0Y;pI3;aNR`DvzfurS* z0=)-`nN)TUpoO>|4LgnL{p76XPC##^%k`T#C9HABd~FJKQ@C#3$PWx#y3HElj2`Rx+gaDbD(F zS#Ngl1;IW0AHH{-)*d}wdhm$$2UVi3_m8}zEQgOnd-6}qctrd_=2Hi zq9L2uGm>{C>*gndZP+kXdg84Nbdff487C^8baF>EzcMgnka=uyC8L)ee~uXzNdDb3 zjJ6&!0renATpil#VA?OfXNGdgma{|@)~XkOodPlSlpiPbFUiIf25FjATk^LuemosW z-( zx>~O&kUD)o43VAW8&X=%2I9=)`8kzig0Zq&10vIiFaI7Hr&|Rd63sM%$--HKKq_Xy zkPHpxGmT@gdNqP>~bLRlxZUL3Q1@=&cTu!{Lu z{bv}PA8kr|Pr03Obj%G_R|rV&PB$kstG+1H_rXS=7A)00!Cw-;r^|S=FP%%)=&t$2 zO}%+zF&7oEdM>DJQQ9YM)`Xu_va1HBlZ{F%k45QlFK`i)d2-_RKr&B~rA-TD!RaPd z#1al+Wa{3N+R3F7cW?X9;3#8;qP7q30M|67+RR!(ZdGB`R{f3jR;8C)wN6)G`|H6q zu*L0Vj+}f&NACizPrab5jYo{(M6Ljt464G8!%*NW+TPzhjEnb1&6Cbl zO7f{cwT5_=M!&SRb0L+!SlaZm!4Kdb9W$paW|<0vJk9MiDGiN?xh#7rC66g3n*))N0)fLUsaf=)OjLZ8)Xo1Cm7e&p}Ln- zqe-6-{i*doE{uW?mOTE=OQKSucU*oqUQ+tv2n(sqi6SHxMyq;$#CE-ruhRToFRt;= zrPKc*z8|AqA$BCT3mZ6NfTEjJ-)S?5V#92r`e?IEvf zIx$VUP13!dYujhB9!YO>WARANf#=_5B>9XSy8AbS?-=^ z8XNVvD76SUFN1KAGbbxeo+|gL%)+cqGGAuD`{wk~FXj zg7|z@hC2zFGStArMglWhLh?+~aigiZi(BV)iz=$6EZUrntiIANP`R_T(NFlEaX?Xg zkwW%G;MKt>N}%Oqj6SFb#PiO(K>YwDIhYqm_0(g}N_&sXaO8txI@;6wcSep~{u9fq z&QVY^^|;5R2d9xY2EUPRT$Txi8sn>jgHX^eS@J@h1OV(%P8MtNA4(kd%T}W2p>HQ~ zu2y@?I}f)9L0T2TeO{Dlzg6XYp*ZClIqm2WGR%JU8Z}L^Gs0EYX zr-9A9qh}p8M)uT#z{@07t9k2;;5qL-zB;*?Lo+}F<>?$JD1HJblA$y6XwTCiV+bZdcYBK#W9)Bv9nMW^nio&LR+ zS>|`O+jXp~1^_-%lka{9jzx95=R18;VX-If6A9{&1oNviX)z5?ALIy;IkO9cK? z)2TFjZZ6JjJI8%i>Q`>Wf(8Y+E z&cL9<=Q(^b*Adrzi+ht1>ckDQ@$-&;(eLNImFj%vqS7rr%Bp-8R3~f1$F;89wKpZ( zD-46akl9PkugQe;C~4UMEYV(?P@fc>Tsnu~;PMlyla4yi0b0TlU>`cFAYCXwG1KG_h0!c&9=n=gugFB;( zdW?G~U6>IW$Tsa3K{+<5^=n=lc+GHw&?*pp8k`kz|4xjFJa$mEZm;oW8h7M{1r`KI z6I3c;i`bD_&F#IPl+qh3cc&`wxL9gNp3%{G<02qu)xS@-cVwFfcI)?706}R}NH;Du zh|ea^xd}4j zMpaS?(HB=wh>|34@t<_s?kB%>X2(n8tCei^C=l8#>i!(j41y0Jag=}8gfAo0GJOHH z?OkVEaEZwNCH8jdd;1jo;J1*vp-+^!u_X7uFj%}bv>voBPn$Y4{(Hr1 zfpqBj<#PKijXW6k(rTu$DpE|N+u0$A372BW4l^E4L~5h=iU1v4g2I~z&}iU~|2Y+l zAW0CC06>8gVarO^`_d@?Wy^F~PH><`SPPWhvD>N$#&ROo92M;M%!+P-# z2=*U?u{WmL$mRs&TXoJ&F3%R@V2#QgtMaT0vb0nsY#NqqIufyCtue?Dvt`h2{nL6g+I~Y&emM9_W4imPOXH+ z@r(sIeOh3!=^M;;)9rT8B!AlPdTJJ*8Mrl#UdB-sbkS?3`+$)Uf8!yx`DD0{{{OFA zb$Hz-hSsgI4PT0X?E3g-tX%z^6L=3xx2*)#E<=3N$YMuyMULDznZE@iNIZksF@n$h z|7=zz*-`0R+WR?e_mYu-Xk1;0xr==i6PXe3?;4KBRP9yq1jJe64*x}v>{m!sA_^s| z5bLjj4I%S5Y}eDa#G&!ta|y`69nc-(0XGb--b?RdemD4|5;=@hqw8|AZHo#km$Bci zqGJqn=C##X1a!r3JKCV5^^r#uBvhWE zEvr<)H>O;h)hisQKJ~%AR|ubEW`v!ie$AIcL$Ht_C{)SC?!5jme%ik>*eiHbvW&aS@|7WUkaGH>G9?8C3j2QMY zxa0Gb5Wm(%BLS?X8+MktZ+}%1NN#q##Jr<*4Ckn(R86hv@itKjoGwGB6Wr0ZUa%>M zwG6;m5DvG6=pIS>JG9gDjXpFtc>i8eADSDVvR6@9>N@5B?rk&X#%k?7h+koD1YX3L zWoJ|>ch?j~Eb*sBrGI33PlW`={fesKQ|9=S7|z3D+&DT7{0MQ7BVcD<+^hsA)ZP*iH64{pxgqm}i@-nC8QN?cLSh;4mq zG=K5ugPc7&Vr*QPd%{(4kkp8v1F-kN7h@>byIR+$tP5;VShF9ozvyxO3o$9j+=x}H z>S?e_Rh!_fAM5hV%^#hQon!qqhg#m>Aih;@ur5SKu;i+^jNk3ey^VTApAASAX?-@; z$dIg;Wc9LhAta6I2eD;d@L7x@d^2o6h@JmG_8Um7?%=}vjTk5YAN$Q$ZZ|wb z3`S|E7}{^n$DY787;7rrr;u#Orx^RRZb>@FZ_9oQ8BS}E%JAc>TnPiR}WSWdVl30W&sqer>$8eH>7FNKq8pqN3OkB5; z-ax>5bYOt#KAJ_l4-8h*V?9|J#{97c*ZOj3vh@OgOvq0myq$zYW@*UIZ;?9f+u=N4 z)eaU8g?xo?fSG{nD2P`>&T}J!wuD`Uv|0w<^Oaaj&uHSs2d2I6Y4jo>wucu#16PK& zC6Vw7?p4vt71hC5;s=1INgO@t-4Q<78{}!Yk4=2d=MbttR6VQM9f?JA$_(1+`Z} z#*k!7!4HQR#=|*6FP~N!1l5VuyO^(1fR3)26O&gkh;#nn$ce4f+NQ;}x&}zRN!sX~ zJ5TPS?dQd%w*DHOV@bsOTb+bD^>s7$2Q7L;3Clo47{DfQh+!piAn zB(86b&c8{lqwAFA$A=j_E6pV`WH~~0oBtZC^bg7UwJ0dpHnOfg>*+2eC_ZAl$h!VU z9GPnx&K0Uvfd;#@FIm@(-v{JodGqAP5yqMlbD}=#MARaGS*4>aUe}}T6p<3l{el%! zxH6D2Bad7hIDq6JMr)cgLU? z%(2{+sUHRM*D3j0x^Rc*vo!;w`aYvJXMFjwe@=FFg(Bl~*Ol47Rqj3Oe>LpnZzuaN zYDP&tcs~FLwUm2t$E0@x$%nc2G-r^)YI*R&9iH+=fglEN?(FD2NkOg(i45hAI#=hU zx*B_SvM|X98`6T6!DPf2^u_B+u2smOM-`+0NJUN28~>n`79BlnZuS{hYEW*h>2Hqb ze&i!I^(ZCN=$MFn@W!GYu2aXuK2q*J+8HS1B4A2fE=OAunFw;v&+znd>R1?Bz3!Bd zqd%=vJPBi~Iyv^pFmm>dgdw#rX2lWkW4sQCK;cgvjb0*p#1HV$zUIN!2Z|K<`^#F7@7zHA2V3NUA^J6_Sjp$CQr>;mH;Vg;F(-Jp z$ZZ|*&7-R0&C&n)ZB;V8P=E5V&4CY@w*~Q@u+>t^59PlwCZ-Cf5KbDb-%-Ha(n~fL z@M&6kFxH&K)4xUQ^AHXeFAS6G+FOeZN94h22G{eZ*CX-}mh1&R4ALi`?k7IVzt2Bw zU2f*6PFPQfGi`ewoqzcKmeluoUHJSXbJ=2byKw%AOc^^QQ`?qQIqRBjo_V(3KE7Vk zAgGj`0vx=iJkA>nI-&eZE|z6wE~z`PRVmt}udsFYIjr?Q^`~pL0oM|GX^4G;zCmam z(?tcag>DHkEvU@@zzieuM?d@b8A&EEFihb`9Ck&hDVUa+ky?9vd2l^vUd+EZzC~dR z{n@J}+v$wYv=1m!W9gbWyj5K1w zj@LhSPlY0Z13YG=PYK=X@Y8E2V9|+O8+bTfII1m?`veER#`Z z1WNZTBgxM)WkvKQ^#mb1dox5T6l&YQ#wcxXZ0IbQ@W}RuH$mSjxdPYIm>t*z8-3ov zp}l#U=s0;5_T(dCcuUM#!8(W{MkE&^Zv5LrkEGNfhN`+#9VaARG!$-^Ol&z39Ivoe z@S|?9d7Z-OOKjcm+wc85N7pVtjC^zyy_m`j`3Ph^KRWY-YQCOkuzC?GB`4F7fu}Gg zg1@69kjLG!T`^v`Vhn6|S`*mxMEj?xUHmP6H&->bIm`6%p1~R=pJwW?mLBfMbDwGZ zie<9z%`b|_eULZQnyW;;bC%hEiSL#%KQl62l*LycNY~Sa^ob&2pQwh!E>0fzS66Z)9q&_N84pb$bfSAH^^TD z)hkjeT+;ybjJHhFaME4+Om~dIUt+3>T$W52BDaV4?GIN~|B7=+{tGA^xEHb5`$w9= zGA`M$iD`*#hKP;4QtNzD%+;(4xUaY6`=d2K33<{a-)F{@uLpCnwejtH#-iYv1;q}$ z-idJHf>T4kLKp7Dg+x!Oq|*(*T>T{x6fUPLEMM!tJ_n?#g36a2k!562p|c3i$|S}_ z&dT#h$R%xlO!e&oD{8Ym?v5Oco3qe=Ni@=^)f4>8yZ3*R66HJheg90P*Fh6B6WS@G zs^5s&efB=MfPuO2_`JCnR}YkUoQ}6Rsm0+?IWEw4+Z~ldO*JS~Dm}_{S*kl-rE;t- z)@CAL#((08o1KZQeR{86A85j75psSXf}f$N{gR~5r?>5}cBCK*`Xf1rg#7R;>qtb- zeWM~>|EpVPQcQ;Y>R^o_EJ6v^sBzy-nOv;5b8@)IXcmwbuX5sHjWOJ(De(S zU$JlHmJz2j{S6#kogGh+ZORz(Ie+HTy@}XM8llA_jvL~1-CQDWCT@-EvfjTb?c3FI_b3kcr*kh^T_Af6yYp6ts&8E3|z88#N{kb1L3$2#IQ+3aG3Babu+1)NXF!+ z2cIJcv0)1lw8Rr?mNAMa)nJWzn-KA^u=Ffj_>H1e4%|B|e9kfYNIQft%`0T^SFzsL zlCiR#`iyW6MTK}y330xb3gmX_HwA`t;n^A>;bp)ZkiznT2npDlqN~-6%$8h{9!&m5 z_MI~juYa{%+~nNlmAB?-oHxfzM9FM$Ciyi=^YvHDxl7BOBW3BIt1b->j*vwg=;+qr zSqLKRBKy;ir$(m@L_%U3dtZgo`%y#eAi7JZ0I*M-291)83;4Dy_wGehjnl}(JInJWPsRNO@a7=C- z4?<8Ucoa$rWf$+h&VyoH{02g_I;ufJ@3ur=Tm5vo5N9uy>CbRaf+)r%^}1?Ru)Rs_ z=e^&#yMrjzNLB4`qz7LTr1sPCU`%4oJ0}e;B0R}bNB&Gfx@TvCY@Y(%u{%62C1%2T zCzq`n%Dw%>m1;riYE(GB)V8N&Hf!xG1uczo*Aj2pl@bMQ9XU)_pPy;q*C>NAsK(jK zk3Xx+Wxi^EDfyvKevBUGhItvRXBdy zwGjjsy)74ogKP4}Bp@Aqaso9oq~9H?PedQ(m0_R&7pnd#J}($utz&&BXxHls>o06N za~GS`VBRT(wCgpVdG{v5=yRD)s4-Kn!ans+cY|f-!*r@tc9)7b-L?$*p-^vsUi`}a zxtzJiG3Gxp69J-x*pbY0K$|&K7bE9Ih!+M@Kba|4*Kc4cds7L_)1F-r4N64*_kZkF z^GSU&_9~;;kxcfgqCh_E8uluqZFQN^SL5^bXjdy?RXS&KkE!ZMH)ZZv_{K@;di}T^ zw8eJ$=Ep?NA}8@b2yf@c;hzW5+gJW93k-9~Y2$)TdSPaY6fJgdYEDY~e z%5B-IV(T?!(V8~+%3S+;HS;6(xVQMYL7DFP-C>Rh?B#2#LkDZpKhFpe&Oi>AhQQAl zwchfpg!snJkP@oSx65n6KCZGim=~|!8hcIqQEhoJR^!gpnYXiDnqS>6(ge)J-jEZS~!8hY)FU-u(pbCj^ z-?fg{U4Vvxz(s&zji1Lxhxf>l$M1c2!1;p40wN~Lt1ItddImR5_nmK}MBx~tk z{uO)(%o8$ijlu>xRL5?#EX}PJ1j}HI3F1M#Z@Y(5A>8$1Fwr!XP8xM(hhtdlM?Z@r zKg);(da&!;fUWD@3Z>@neSICr)$L3B#T)x3Gw;q--N;zo-K@V;)ILs4<@TJiyzKjX zeye+9r|ZTTccIC1#5GRon5`Lgi>>MVrmVF-BQnH)NBk{vj>A4gYV4mD$OI8Kglp_o zmJMT^fu}ed1_|c`-w_wsy|AFxn`{$;9tHU4zkosbM{&( zr@Izg4(X?#e^1sIjdA)r#M2fV>8S2&uA_|V2rI_f*VZjg{Q31~_+8oI3S$Psw^ZO6 z_p{I(HF4HuMB_HD4iVu=xbW!lUvHSydsy2tmTG$1TypV8ET3MxG-Pd``g99)>BIdp zXRk$GtrJ|eRM$#H_dmOnjbFWC6w)wz&uA}b?|1KVcUJb>)wh(7T-e_Pg3TMTh|-bR zl_Rdz-RQvo4*lOa6@qz01aKPp#o8bpMy`b4M>;+sl)Fc~Dioff(sQEHbEr`40odqp zTjtI-PYmL)6ERy29cR#$X{oo{6s~Ao{f{6hY#r0a2U2c%OQ>0R2Leln7y|0EYAq^i zmYPr4qMzz5q$+H{1w+tly$7WT&r%JibvoDl=%GgcYQCSPNIS`WhS?HfzjVOApfkxe zTw#!;YQHl|vV!9dPoRcNkTNMZ*~92jj_UMM$Syv()yk3d@7IYC&r` z&6=Mf(U5<*{F3mjPHi2PLDfcIyOEU8nkkmJ2D;?C6s_8dt46_iAKA5Tq2l8*?;J`| zuM@9+B3!=06g$2b~f>2DmbQT z8dbeDZclB2W|>wivrm($Ee8|W_i2j{Du_0E8crq;qK%go%~!=lK`x%VPhUcU@OWd!SSAvtQ;bEHyhiiB*o0vmv0_Io9Cj8u;tUoOw zbA4ghDBQp10^={{`W72U9eCZGm~f1rF^FpH%UKqxD%fJ)1!5@ryXBnA>+tv$&E4j~ zI>)}76bPp`tsdB^Ak|ujx6vvp{SOOAapF$ZDe+Q-KUTBC{Nj2Ar4toV(y=2S)fArG z`wGC4Sc9-tV?*u2IWV}wYb~@b9aGKnRw;8#%eyyS{3{qPy;y%L%3C{F4-of|RoEOB# z_8P5}X;)ZxYSaLY8b)Is9w>&*1_q7nX(Yx~1^iLtz+}31e6_w3tnU~6jp{p{HmcKg zrR6j?t3~QES`?jrKPn%R8gz<|(TPHyL~B{fA$%kx16C1NyJ>W#pMlW4-_r>P&*Tk?MOz(2;@9AKa7D9 z9;Uu;R%rX!ov9AUV(}o$wI+k8Rdn~kqU8EuO)9|Rww1P9lcCx>2T?F=JNqfTTw(0@ zC*wEiAKE9$#xM4+V2;>h>NXwMIsM6Ek09cYz8fxx=bf%f-Llv`P}My-lVVY(0TTV< z;imDDN8H2@bA);OV7do!dFHRwJ9R3{8JhRi`@A_u$10BZFH*X;_7(5&^%wN!!UWS) z>!mT~F*~jd9oreGD<7C=%YuU+sKvHt z4JT6d@0}Cd25161g)uccQ5{j1dicGJvE)=rxQ~e44A*hMZeq`$skf9tL_N?%xdwGx zf40gQ?;9*A3L1ULx~JB-EsEEKsS&B4+=srkQ|x%gz$@NgJy6VQ=2Z)WS%pF5 zcY+Io%k(2SD>97mfE_oV8a+V15{6*14FTo-XHaUr%{L<;_ zZMR+-Kjp#Uvt&QWyczO_YcZ{@)w%2=ozsR zP=JSVl#lu(w5G6^05I*TMJ!uw-Jd_MN!&FCBu8KZ!;W#zSKoE_69x9lEqxiB=e&_G zN!}K!Xy13^x|761O3LSa2Bzj}-+CkOaZEDyp2>SWIYuh8yVUw1I+$!8#s?gef|+J{ z5_uz-*y_G!dk`&jP&?mMWijG$C7l`d>hOnk6_46Qr$2|izfeHV??H-2=Ul^W%r~BU zg9*wxkL?-NVAgt%^JD9OLYb*;kzAi^XfH8zXYd*RLd|!}wQ2`zQ(I2+Jp0eP{ZYc` zK-c!Q@Qx|hv|7szI1SoS^Y~JRa@ICk3Z1SJ0w-hYwt01*^)^ptbKE=^k*V!Lc^ve7x3+aP6H^ zzWVI9AZS-baSp``%Np%1Glk=}U;El>G+^=*4%s&r8z+|<11}i2G0r6630uv?eQm|Y z-m`>!8^6ic!`P~L+pmw=^p1N`2Pm;^s87YS^NQA*(Cpb-Dq+(&qNSzV? z^+KFjrWp81U0NyOm84?4$%O5Ag*vz{3u0D%5~H;uK=I5cDhdB*->7VCsnWnJxA1Fr zr&fx;MS`-T3J+SEu~bM=iD&EItJgBbrty6WU)_Bk#czO$?e%$KRh^O}>ik_9!FgO{P@=3A>k6Ta2@WOw2Xca2o&x>lxcGU8w5KPN(r*Mvz2pdON zSQHV*6?Dy@NI(D|YS$Hn#sbP_UK14u6mRv?+#-+}ZcP#6xUk zZGQ8Lj#ZWB0?glcdJ)dkf|KOC6W*Mfw*Pi}^==pD`=h&W8fW%3!U6VP_DJo#qoc%} z$(Y7RY}?^U0usV9mgs$&a}X$HGlV@?ciicHo~?9R-nU8*NDgGYBS&%$rxe7@hS&RS)D!hxrkU9sh;JJj7^Be}Jw2KC((5euqhf^tpqQwrcS)Qe*?2*tv_Iw6 zJ)D2xwoJ#??{LKRokhv{9cWYM z5VjoiPqMj@*Kc8^W!b{HDCh>qS*Bg2?}+yz@7c@ZL8|6=mZCg&D=YJ-d5{}}TXjKD zvj`#?;AZs(<>C&W7Hb)bb+A$W&VvTvIl=*eHk|sD%m)c3V^nA|<`)Zb>eyv(fDG zLPQKqhf+*OK|(&VS0!bv)0^j-XX>}~L?j`gl@u(}?D2b#i8c2mbM*H0%|)6_{E-vM zI=p-B=X^&DJ}kW#71;uV4}F*z@QV~*&q7CZgzy>vo{s;I^Wg?Hm|`r_gK2Rn@XzCS zU(rFjJL056K_|2Aj3lp(PSb7Fd15{iyKy+LpUw{Ckey=tWxC=9U{PUC~(*y1n*ubX3sDd&EWcef(gCJb*=B(p~4L(0%Co4Uex+Ml;vLY zChLPV4d2~dvPUl}Ej`W7K>usKU%a>w@jhsM{kMLAowI8(5r%MbjN!?#p(i@`So z;Otf+9w1NA04%N%B%dnm>F2#$Z4Y8KKT#Ko_XY+wPxdYDzDw&+e!NrpqeX>!bnql( zwGHQb#EBLbH3+FplhcEc*Ot=?HNYn3 zsjfWSKF9ZoiU_O;|Ifouu)phu(^}~2H6d&hfhRPI0PbjG$p0UlJU&<-q!K9d z8`Q?+p$V+q4_`kilGm&`(Ks;9G+vrUmQq;D_SC23%=Azv)6wtqfc%Cz_eXDK2a&Fb zf}Vv9!DFPAy}P^sB-p5uijzKR$=1v*0T1Qi#G4;8CXme@(m8F1w3aFE$>`H5##X2g zV0KS)Bg;X`C`0&2 zJZG?UWL9$PP$gMGS!VpX)AL@xRDEv(e%c8b-11n&KhsCh`7e+&2Q&f-juCBU1o%=x zHLR5UnorfTj!c6$%jAlq(tIP#rMky%=Sgdo-$}6z)0|BwouZYwAwJ#g%CFY;`-zX1 z#RUt$@hpcuc=9w=R%ni^vpjB}rSVbr?4^MLbw8+vj^VtI*9$Cl%vefYIUt_Ml#Oqu zwu}$O&7mn+FlGYgR5pG{IR;2^&=P98C&lF2yx}imPZGu1jy9KW{zW!LpK?Y#E_DW1 zjCuRXlF#NQ=_g(g8%w&twz@uA<8GO3I5AT;zE12jZz5<_^4D;V4Qp^mCmUVS|c z@ior&*Ix9!z&ouY94d@lp?M6Qkj=>oGl%O9X z*ib(dCF?2l!?y$kT*{^F9Pv@K)^>Eyecn;c9ek#04qD(WyM0=`JmL@ATK}O~a|(An z`@}nK{Y}qjj(HO#n$Mc23d=Lg3QSvei-P4rW}W+rr)c}7XSSZ{$miPLUG|SNYbF_E z^I9T#hbl_>EIDR`wOnCWLVXdb1WT@x8q$@E0a^bSx$qSF;%M{Yl6X_S?O4@mxKmE| z&DkrclFupG*6T2_?+>}gNUc(6UKVAVOM`i>yOC&C zUKseLh?=-kZud^`DafaAvCm&H%BvN+LsGh=v!royEH&;Bm9C>MJ~`|=@pQ50id?uR z_DrR=e|DiL?Vg+}i)r3l2X&GRPim{H&U#2MYU!Pj_b@Wz zQbey;j^pih4O@EL+nN!CnQq!-g!&vl(>t;-N-LQ0pT|rIv#Te{4 z4TZlL2bm{wnw^s2PgdEYNA34N=CrgWT4Z0`znx&~Z*az+Y_TP78s8=SWc$@-B8NevtY-lCKDl zQ;hjfTDr=YYMy9Zn{KR$F;CRJH0${zID)U=n`W#9S?QsPQB_yp?XGxxU!dy;QcT=1NRc7SLdUY9}_|GA&(i0Q%<;HE9rbBUa z6Cfz0LjYDXxg@{WmR`iRpDGE>*N6&~*eR${UCMIXXP?VK8(m>rT{n56Nq z;X5Ha!or@>V|~#uXKUv9mSMFl{Oib!A7I%NpTEW<-F#ytU2!7-7q-Rw_;W>n%$1xN|bZ&ma01Ar2BU24o&g z=~k56s`QojgV zY=crl?mfhvjrDk85R6tP7Ub&(r6rVn5|{MIXh|q+Bi~H5MjL(@+*Asj%O1t@{@c2cW|ICN;?BifTy&Q|Fhn+mpY&ClaZ0r!n3mj8oy=VI zrugLg+B$1jk6`o+G-RTnWHx@Lm;udAMuyF%pwx&i^~YaK(YzomzACmn-8%e^{m_Wa zz9aayqtk zA-P(u;G5>h9X=Yk2`FW4YB0r|%ycYDJJ&Wl^YHL;SR~0(WB*(32}&x*yZ)d<3qa~R zS0mifQQzqH<7JX>xpzr0NA}Jg_7|ZYJ7ZF}e$U?mkHrZ!)Df0CcyM5I)jAT}46V^{ z9tJ##=I7ySe4wS3w$mR4j$NQ;+8RH&EY_gZ@A~RC*{ypewF*zJF{&Ua_cI;G3m}9J zcs((XFxbPK;&6#mjC6|f9K*0wZt89BnlIuhZQ#wPh6tmmIVUY0$);~bUXqs;Nu1v` z;d_7h4#`JJ+0gu$?i&DOxj41sSc0j_w)%t1xa?@761h_4oM-Xto-|DatXl`t_iQh z;#sw!d(%o(Y)tpZm?sz)r<^zzS%O>N5S$oQc~?bAd&wc)+g-vIul%0Blc2WTZ3q79 z+mZe49>ED1aCbka*jsz*m$n*T`)3hxmXyE-rQz1vpsJeuQ<_KcX&FO;*@hSAw?0Q| zPEdIbLIi$tT?qo3KrXePBC*V(DB?y|DEjHbo^R)^l!=hj(4l#dU}?&;2NXH5F{igh=V z;P@Q!J+^g&lH%%LS>dPi*BSzAiwy(Njw;dzt^!H#-+o@mI~`?{y7~78n_Y3iRWg!I zTqP?f&rrBxU;%C%D5qStcbHz8g@?%{OqZBg&& z!?6xKw7r)5v9!_k|NQ`Lq^!`-gvijB>w@`r#!p ztQ2_jGlQ=G(YHaahl*_m+C%%okXdbTp^J zf4%Q-?)^@C2PV~q|8`&Uy$ieb?_Hod*613zLn_jUce}Fnem`Z~j*#`;9+VGxUHet) zeWap@Q&|L27vXg|PA=V(gbSeIy*-U6u|(EaxaIL6%h|zya!~oWo_C5@fmh%oK`h)p zA4JF3lld_U=v+v%ZC_$4+ZMR)!IDJ`GZW1Y!K zIaVO7t5@kMIl9-ezy50!B6hopVI~nTf3Yq?n!AV;l ztPd(=!BlYFTDnPuK8qT&7-#KzuBtlhj{v*KJ$(v#y<;#-R6s2@4NN}k9ky#ru~_^ zeootyy27%QSkzuE4GcW28~%~yME_z?h*DLL@e`jrf4|jfQB%svGY}gJ;TXYPNzV6F zZN4c-@?a!Y?6>N)+Jz*9DNYDKzcbVt)f_Odl6Q-DZRhuNsk1hF2 z%m9KJkqO-vfRnE=<~f|d*n5sTWbE{{FjuAwgg^M$+YpNtU)g$hk*9V%ZGVt(tFjZc z9$R8+R|eYpn_uCN>Ru@RfhK}8s)xCP4D<`ZR(^hdq0{mDYgA$k@v=dv1KtEYp`zK> ztD-|OmGPb#?gXftF?Eh8N1Vu<>F1Q2Coq5uRm3Q(%9xAlA&$PNx|hKLd|7N@5$I5h zbH+={Vp?J8|0A5wJUP7-@u3;1NP{>e3yvGVQPE;27)$&Yoae66zS0D?!#^0c_&Udf zERt1j)!lNIB+Izpokghc*q}h6l*?1{y|OTv+}z_#52iVo9ollv*;K}8xWkN7LEnE& zj>`eSB~D8TC;~7# z7A@@_?I{3f5@wGh)p%WD(mC_ov_A*YE`u-6R7e+Pw=STUh5Ei=6yc4HT$U6S(Y7%o zqun~Ygg8s!^+8Ar$sP-`KDp#*g=`P{f#iR1X?%loM0~ITv|=HRtrO(nDIx za=$wPHS0MBK5mmWDlk`~w~wv-GsI~yw@|B3YM(-U)6+1wV!Pp1jE$-yG`Cy~5^cU6 zDcrbf*1SB^cqpqnxS$SO%pwld5vo-FtM;>ORdBT45x1M)4Vr7qhZ)5cRKuw@@z$N_ zZl(DGrdH<@n=7mlKd)uWt{_C4z zC}5%5{#2Z45dT!HXm^Z=F1CSssJPQjPE&xfAw4$5I}s7PRGi;h#Zv3 zOzC*Ai-d8p1!F>ZjEJ&q;5A^j6`}Zk@^{@TY7{7)ZEbPpH-hQj6nA{xKoz?JK=7H| z$39?n7&~YA3}n_*%+dN>R-%W zMv2lyecE5ei^6c08r)!5cfR}}Dg7NwxO6v#{f&~LSQEg!S_FEmGqu~l+rJYD0+wn4 z7srU!EWW-&agmkL4C-Vp1I;tt{S7`m=%in333HWr63%80k}YD-XjWcFD-nDJr(a=*Tk9Wd7CxRPM~~mEx};W6gb&=opduV-oWubCS;6C`Da`eG*Rc z(Z?0h{UF$cnq`OyYoRGD12TbvSRAgk>Kq}BVKpF7#RRG3!b?u%MXs# zxZR$wJznQicyfBUau&2TJkbz#pD@b zUy$H9o$BX98uiMLut%rDq8}M{rs%$l`SRHG1oDGB|USuB3uK zPbW@it8+fNYnM80+gbB32f*eADL5(fi!U{Ydkk~CsFd5^SCj%nAr-f%N3!NiJG9%h zr@bzz(|Xg37S=i%7Rv@4Y))jQ|f(DSw@ez6q@(a5aYF($_ks;M;gEdmbHXhoRTb`E>WIH=QPPvZi%1gju!EDOG%Pc>PtvHW7o29vFn=Ts3{x)*g$DS0r< zbQ0SLl`jwG0@51DX`S-lHkbcpzfn!BD4F}T#*$rBr=vQ?YP?iaxrcV77+eXa8&pT~ zVXvf$o||BT_*KLkWS{xw)aVy+e=-I!m?J+S_16t`im@P{a6}CWv|+BZ^yj&8zG#CdB|81c#u6h{^dAag5_qf-`wj8%gda~VymgfB zwMFwRu@l9UrkWN;5F+%u5ktPqHLO_9{b=mnF8&RmDDRe0^aZu~GINbhMoGMODgVuZ z{xZ%FfYjWyV1I+YO8;d;<5%wE&FdPW^;m9f!222$h|vk!VvYR_Ks7~D*PlRv9 zCFYBc#mC`81rk_sqnt4qtMm=4sb%#3rT1c5L0Zkyo=EW(cmKmG+zR{PO>-)$c&{Fa zQehu3ShC1xl(a9h$_)lP=$%^Bs6i)dFao^38*ubGB`I1Oe2R;?DiDH~f5dBUsR^@3 zg+HlP-0IlX7z;Kr+`9|HYT^*bm9-JeU%u8g$E1u*za$MjO(JOugewkGF+V#~AU_mq zkQVY1Y(b*5zXy*7`_qS&GQR#Z|MXU+%-XXgqG@FYhC0l_h_NsYMebStW_jyvg>+mu zmHw@>0t5qM7rcry?8`_4MS?=k{fz)G)A8z|f#IH552_4|#K%by2Yq=Low?Gol;AkS zKjoT_0w=I#cJY*MmsD)GoSisRBeu+j?KJKBJD9YSK2RQ!3pGwKDU1rHTw6G=d6TfR z+?0vp;t)m*?fE-`&X^k!Y2NXzn^DcQIvB4X(;gZa{f7w@=0+pm$fgCOF*o!-EuzJ% zD38(K(b4`i$NG0inBwbodsLlLkJJ{|`q@y)RHm9Sh+yri?_jQZ)7%5i8(G4B572E3 z0}Y)XYMGJ>q#m}!t)osrZy@oMLb^Q3^p{MLi;7U<{IOXBjWL{sLwj44Wchm2a4J7F z_{=+-ebc>yqro`Jw^Jl+3CDI=9Ixvx1fD=JCBW2jZ8^fC4KWH8076me*vktTYqw(g`(LFgs}qyOfz`GN4xGg`ql?X0q7H zQd0-dG1EM+^k{O}$eBdQ5lz zV7pEeG#U6!+#gFvgcg>nQEC7`*g$G#H@9t_kPrxSY3Q@eDRhK8vaSY;IYJxpz#Fo^ zhh{=}-GsTjmAPLiic7I>imL*_!ya$9Ctgr9n4|SFy)!au=Y+C6St<>y)L}9;R~3Ao z`)c2l!t5ho1Xl?qmv_EeWlPuqT!=(yu{bMfpljqaCDN<=r!GBNpI7BU?suOvHT+zn zz}6kCKzEvUJovUa&*~*nIA=6RL69%1n>1FV5wDlgn&@uuU;YNdr$;E3|s$s_Kw*L9i znL>3h`9J=KgR3TCMxgZ75{vsOV^Md+LYs6im0zIdYpIX8yBi*9lcqTDWuv%m78||i zD$}uTct@lAT)n@vgzMlYA-sJQtlZ6S29JHXLS?V5rWnN(TAYdG8$L6I7E`Xo1qDm8LaWHtMe@Bw z4HZ#Kfl=(j`hLA>-aqs0e`+et-EL6*90aXJT}YWnU8a)xH?^7Ne7~{syyQ9BN7QQv z3m~=i6ZK`~8Y?u8r%x&>B$(bTm5DLABHfb!ykwa354n{)D0a&aQSPWHN-hgPPgBI+ z2(L?szf@LOA0cvlkH5V>Fx_W!?&Y(vH9TXO!#juSpU2MV-+KlNbbnH7vUAt|G{v?9 z2SkhljA=fpTM6!+wj25gU*xB*y}~s#HY$qIQ|=2UL9q%diJ07!cw#Atf^Un4b?BbSNr zzo{jt-r6|!QMNa!RjgOHN(17pJyFDYnk=qXS(nH$dUz%Zz1CB(XJqkg>oXDQ7)>d& zNSctWa!vj;!BhnR@(0vF?g@W#vB{HMOSs1cy}Q_Djs)W}m4OW=U-0}5{IP2=JYeG3 zRUTj>2*>VLjrA_6N!+k=Dq2TFt?q-qyPw+4io*v2-oFlFHpXH~=4(=zY+v!u(=I>% zCo+#;Wzk}AZ$Wo&^g&sNRmN-Q$TM}y6U*B26N%ClwkG@PKY^I>oGaz`#W}|~Z~q!h zu=3&&&$%X4kK8Lvu6=iY+7sctdb&(mV^gM{(h-_BwC2Y@7PoNQK?a@_h}6T{8TIxA zZX1NcFtM9}p+amc_v3nTdj>5&VbK?vC)3J6!nWC>R@wAS+b6h;2O5mwwH&su1XljM z$OBYFaH*A7$HWEEDH{{2q8L@juMbTQPPozPG@~m}K%L|0MZV=M$SnPyjDxJ0U4p__ zwm^N)F>*(Z4u9hf6vXmEagG%J2W_+Myq8EmZ{mm~-W1q&Qin9h>GhpQt7k8tbkjwh zwGUU+)M63$<(r50EO|oqi?2d}Z$Vqp46?M;R&U=}9tdpqpDlf3;z)6$aE`rOZ{L|= zm}e`fYlmqq_!$@+|CZu5`^1)Q!*jchvzV zpGublrkTqo%!qsFpp0>-7HJ7N9@oSgo z;gb5+HhlHZSlh~l5xE-_1*tmE5N=>yjrrSYgie&_PD4XODQzNt^Az_GtRyg`B-?Vy zzzAo3>U3*DT85Sc0AdFnmVVK1nNv{ zIgxzFFewNw0GE{p@76U_E5@5$0~afGNV39l{e63=)T}CLyP#9%zN09u z1z6j7nuqeBXE&%N7|?<4au7L&W#%=j$zGXH&qTT>a-RL3ils_Qy3572Ew{?IfAp_} zn$mz{qcfyq`uNl;bGb?u?Gi1$7j# z=RjMiK4ys)vU`PlfMbQ8*hsf&RNrtHHR#JHVH`9;7-ZU~wO#1FojVeDLQUu{9l)Pn=)HZZpb+&ya=wTxh9U`MF3>UE6$IY6jSV_ z=+5LnR;h)jLJ(jQ9&yO|MQu3#J+$WvVon&Jq9L-Z(?I49QRM#avPb8Imb!D@sxuI-d?oPrR{f&k zXlHJ7c8vE_8E7N>VW6cf3ha;z1Hc1k;`0snW4UlIKZ-mURgh@?#l_mQd@JO^UFkq- z?-Z%xj#fyQoyDb=d8e-lhvRIyar_89mLps)(5(cBa z!r635-qa05EvJQ}PfN)DdaWLaSk0zuF##`eRd8ypQ!0NVi3$ne~;DC<=&|?MgzhsUUQ{}5AMkdYOY=o4tRER`M09Z|4-CrD z(>!CXCs0TFU+md>rZ3hgL9Fp;Ymq0`dQ-ZW!sJ-Z&ckq=?nm1GDtF$44?yrKzmbjs z77&1QKh*~2mvHSYs;5hY_z7WaO3T}Oml<>kG8Px(6MOo!n9!pOTi>L92QX2F6Z@Ndd2FA>{Kh8%7jr=mA19#({!s`Icau3$Usa$ zhTAw}5};S^_mt~k)7Y3P3TKoebkOgs@}-8~==Myo=a&3X_& z$B6mvz-{g;T>~xlbGdyN0tv!UHfrIkahPzLIEvWNm(PanuAI-V&_>LfK^80zWtoSa zvCAWr?8fOYSk)%7aTOgSBgw@ZR+$4r z#l=HxkXOo<4m3C(Wgfy&EZCqqnZ2N}=g8d=vvr_DsxcS~&RZJw`aaynhyAYRKH+~CTq zO9KevPxF;iJ>wz|yd=dcQCyP$nZDxEL=I;_rqRY*uhp*Niw=_0%qnw(Jwi&d+*LPw zh&@C{o{)+E9u7s=@ zwg{tKsx0!u#)s^4Tv9$dxe;=WP2SUe`v-zKmK#sKHR*$>LoP=AV;p96-9wlkc4AvU z8@9MM@h8M4p(M-hr@14?CKnz#5E#-*90I@9OygIr^@vs8E2G@$p$W;t!=`SQjy%fV zebr_ZFRyIiwvV;B*5Ep;zO=vUpgNUQx zllEh~Y#kwN5SL;JDE%n9hSDthcoxen)stv6n`I6-<-s?F`Y=c8zR(j@RJgy3c~kj* z6z!HdEuxeMBXi#-5&NF9SNzFKkcQmO?^8OaIA{DAj(ria#NXLTx)2h+XdMD`^&6M@Q7>iE`AUu=PT2wUqje%Rop= zb`HD*)U?T|MHq5JC4TI8<=(ZOd~YOmS#N;qQfLvzL(VZ;i42`|d+jqRpSI)#+HD?f z!}O;wy#x=_bLSvRhCX7hp4CGwBHc?IjTsw{M&lly)JCAuIEe`N8E+gKFXR8@x}FGOx$1oJ17O?>VsOyrGCJyTCctc#})SrsYg! zFd~t0`BhVewFY5Lnel~5XO~==S{`Td#9N)}V2br8qV%!W)V3r`os1>H9sysPj5(C| zFpaP>@AZ1!&~0jbZ)&D&ICSW5lhQbG7XmH(aBseCh|K09^yZ&+0DD$YHLn{< z+q;OJV!bXGf?THM`#f`XZ z)|dv^?@0fuP}$s@J-bX-gHwR*8Uo{RFs}L6{BcCG%w4zhAy+Ei0@u_5UplCKQiu;5 zw+vOh^G@IOsAyaQ#^Oa83z9yZm_c-cN9}$tR4DsBMegH~6NeI-)uG}1+*HnYj@o44 zr{D5KplBQD5_hV&O6KrUrFh#7@mc1oPL9^Jg!UaRG5j;-%FtjG5~YV^e9GJY{=J%q z5cA$ku>2ZpY>efmDyfqbPR2RS$hnaWaa;G(DrBC!XmTcv3M+BVR$ZvNg`R=TpCWJ~TT~yEXACzv!1RM}m>z zAeP&*le9_jhV0c~J|0bVVe9&*NmVJC_&6o%CRS#8YJp|A~pas!l-;3T(njuV0vO(O1|W z!^Z81nfBaGjf)by&l$MIhiTq)Z>Z}HmP@g6laItqO(ai@v3}c^quv;Ouo%}+gs&ty zyp7CTY%M^=1KJrVc*OO)@XFmPhVleNeQ0HZV##;q+ZY?uzhZ};B}#(v|Q zGq{8??$VW#%);tR&AUK=tzxct|J>nj(`GR3S6O;TjH}-d<`(f%p0|)0;C7!~9UC0b znLy-bDhr;F9+JoT^igSFsjGCMAz{{~#tvQIYiDD9RT&elSF!(H8f*Mdq+S)O-WzP^-xeap z{p|&8st~DW+LvbfkD(1{T^<#+&4@k=?v1PoDcd$JmTvljh*+}))XzohX7?o!|NEWbdYK7 zlZ4E!E9$a?LG)n|We2Op9Shy*)+6@Am;K|}iL5ozl>66d`+|{#x?r|tGNu5-H5b$` z!~42)sayimV3f%-ihnFQ^dfVyeSEh&0(6OGcg1BYQ)y@nLyAqNwI=pwHUjB;=m}xE zFU^}48ePSmU-Kvk%yZKfo-6F2tzzjqTRJe;ADEbJ(aEN2M7d?UZfmk5OI4;j8~va< zOHv*j%y*;-kAxo0xIFD)%lX%kzt_w62)T!hCnnQJM5Mn;7FVLUy(kcnpNV;6T~Gj$ zjn$yv^NQ{8$HZ#n()&Go+ld-lx=^hMMdT&&nn9~6^UkmBkT0!>$B<}1v7#Lmsxh_o%73K~HdEd!i7}_4g$iXZuPs+T$&E^DVzD7FLF5jz5*J=ggrm zpT_f&HNTUvo_@!^x?Z6~LH+=(eEi1*>qUtdZPk~6rrYfCtbKbAEv^2^01+~{mowa0 z^ht2g0$xaKti;X8W1{(1CZ#NXfT4_`V)} z)5Qb0iSL@6$!)=h#5>Lr;7ibp8yVZ69$GPNqRxG#73(S~qAw=_HeSX6V7Ese%Tueg z8m;g*3`vnq+Sa?@Acy|CgEG3eaQ%WgxBN&1214sa8;IFR_6y&reli5J-yx!OCFQEXwQc{i`{ z0NqCBmSxVLc0`dv3vsFya6!6eC*drROC*$>8Qry|(jq9ORg6=EgCtYnA(MPC-5+R2 z!OR1>+_mCOiKrZA&5;M5S3MA3OM7Lkl%nOCw)~+)j=#V&mYd-z)zxplQUBXWnIV=A|)?NZoaKNcmmuT?px&#=x! zkMFLq7PH6i3Ck~gM_UQ+|k!bOc??hBJeCy{CQl#7x zNay-<3rvSrE5yTkQTp9iT*CdfDbw1xzBrvp`5b`Bcp=d?Og!U~-l;by3H{P}``M^= z;lgTJInXndUWbw8Uzve_MaVN;Nl5tM=79Y-N`fVhGN*^s+3G|UIZLnIv^F;}!o>6+|<%pZf-2i*u>I$Q;#0_TRnXeQY|6@1dyte zLN}omv&tyXms^PkY6`J#agXG@o>-BpTre}DMI&Zh2*l-&gs2|5y0pGQhwxqJfUage zl?tI1$ZSF;xKSbPwFc5V2<{@E~1~u5upI*vDiospMM^O9BF66ii zbZl^3BhvYQFl@hyR0Pw93 zZuWnwk!!2ZhpMz~S2_DbX3xP6=mKPiRJ<>nE@Xrr-W&oNjuEcd4uq7DB2-X|_M{d8 zom-?ZId+r>15a45**jO4vA!&eIGnl32>lP+$X`BVi3%c^tXf?)64w*vaKWAm$Kne{ zMChuC;^ijyd!LABSl1fvhn)%C25H_ERu!%@urW+;(S>XY^MGVu~Ee9)-}8EXOEjCXpwbhIGNXNI!0uy9+4rr`y;`3dVg zWO^|)lf$;8?;7%6usl6hcwNgZ_6Bzac3nR_>`oa{&TiljJ8jN8`}f07JMVnnq|nU2 z-1DU6&eO^7j?3^TxZEGu92?6%2}m=ll1qSUexlWEN&p(XB%zSW)zi)HiDvFgOo$WH zf`ee2I23<>&I6&V_0cH#x%Bz!`)f6Csb$-!w!iey7-EUib>R0d5j$QE4Kt;9k4Uwe zP@)l047bO0;a;o|TOLZs@)hH(I^qT2G_}Q%e94p(%Doh^w#+=AiS@+0hpXojgR1tK z``s!!&M3~<-dp@-a0OTrd&ZJw+rGSmA-kCoy&N(8cm8jdiY1ntufaRspOyQvuf7aD zr!6Fl!CEp`uZ{+Li&hxRG_Wii0zmJt0UzOr66S-{CEHdgo}liSubZzEX)NV2!b4$x;Uqasj zh+rV|6G~tz`ZB2ePX?v2DMU60TWByID?9RV>CW<79x#S<|tF z@4-|iV>8RlpDOxoQy~rJPvGGS-vT1(sX~oEuIeoLtB4pSF9EmbfgSRmhMuF0Gm`6K zeP#Dq#S!Uqz))%4rtc+Q^p`Tu4$KC>&HB$8K&PL}Nd|m&5`XvG4k@AMMJ3~8#YRQt z3wM9AQzR$dIgqG0nn=$EIh+^|NX2w`hV75JdrqvL5J2y_l{p^c)|9U zToto94Zv9j(wv;wky4el_b0HqOHc|l>Q&Jq4OQt)@<9;`It09a79eL5hvUsPKl=uu zdF)MKMudii4-CUYIfb?a`{p{1*gl~#k=&yRPyW})H5k~MzM861dlK2U+FFgiamA-L zNT7J6jw4Tc=Qy|Yh$~dR&|(;CQZx>AR;K!=39~;sZKKPi@`jnl zcw6ir-F2S8Xy6k}X^&pz+JR_%4H}*yyQ&eJZSq1jn~Q++M?|DR?BV12VM)?y1qJ; zqWA?%{t&ESZktKGTe6lh^Zh+@Wke7c)L6|fGiq{yS(3Tap!~oD(qZ8FPm74Vxg+NO zq@%b) zy~8ZNS5?9&s|-z)>mKs_OG~G`VU)R_qsj$A5MN_3?d<9&2~VULaY2q(lRvxrzTxRt zXkhI%D*K@C_5SRyPZQa!JLpa8t|z9AG25oI$r*d|cwbs*DDw>Ol|VXtO#fJe7?39L z_3GwW-qc%R(lmq1%=V&q9OWYa1U@vymO^eWD7&D@TV^3w;(BDAZ8?4l#|D`Z1uwPT ziB%x8&JSnS#7AX!8l)W~Icrx2rfe^gYxTT}y2@!kH~;oB?s~vOlv3AEkj|`A2kwLh zfg+n@&+p%TDG8lT0A=2Iv&-Y~-C?oK4!V7UXA?V;H}NOIk>=U7kj4C_m_2Pe#&K~S z@5pP!aj2a<6gyuW00nRg;k^0}Ys(*5)@_@9YT){Zb7gYb| z(`Q`fE*ltueHIh#%xwbBxa&=iZ^rqj=nOu3btpaKa=#}oua>!* z*BS@Q^{71$mxS#{O?pHcS~UMbweU!cYxWI(oKVBehq^mbN&tiI+x@pB*l9F?oB2Q3AcY;%^3?Wr_pfL!5<2F)$U;km5 z5DpPPbMRq#ag`!@mb?o^XXx`SJ z^%_%P;>Y5$PCD7#w1w0RYRz}%q!@%DNMym659n|D3A9@^(Q;1C+V|i(R^K@EWeKifBEE))OLJf4X13Os=!ASq7#hmM$j2d# zkjr=jBf0+dMzc6P*#AYw@9po&$pCglo65yH;so?IV`kZo6VCI7$!lrhpwIVSd|t9Z zbt4bSE1^z3$<3yT13T)vGW4uBSx}={rVZHVxg&c0?=}U8vHk8;Gp3&|Y!F{5Ot8dG zvJ_3mBa*p?!hN9dnuX7^{DpWW0YRLOnG&o=^Sj%&XXeWHpXS@;>Qg8161xgQahAGg z_zn#*L5D(NZ}eCeU=3Ah0&_%5i?bT)_{PoUExj{^4sp*m zaU;5BX3b6erC9XK3YlfT$7!U|w)u+UvDOI>uySm0-v`6zq#uifU|3~sXt-^Z*yRF| zHN$6r9C!|kSVx39@j?btr3?3#8&9j!{uO-8`23k@H$&v65b2x<*D|Y~Cgzs;E}Q%= zcP1|u=P+mMn_@<6p~b!1^h{tldP7VLdq)B$C~(F8lk2w}VGw^+v!B_nQ&ez)sPojS zh*^`xG{Y89bQaiHhT<63gH*4ckvD7LwCU<(Fz zE_z~x`L+gU?nwJlj(XM|Yy1qMr;FUd^Q>9&p${X6qBv(+?X%JlVLENtb^g2pl9dv#4+Y-0&G#8)dz8GrQz5;JNZ!5f$ScSF}We zWU8F6#f8%Ar||G1^1+cluGh0v&qtVQ6f zL%&|;b8NkxhuBve6`gN!O);+Y0tS5eM552TI5dJA#8pB@k+eBcJ2Pu$p-Z1`eU+#K z)<{U$GTXeBpXl2fOfg=3^@mmm_*TEwz0v&jq&pZ+Jk4ydIot}z4*zi12edF{8Iy-` zhZQz^O9F_=pED2qRGh2An1(sC;g@Jkr=Y8i3|7_%46muaIgqG`;t^; z7LwVa3_YKjAmUHcAA2I5t(2Mu?V@P+e zdwspntNcJdXev2CuPej&tjWyzcimY)1}B?}Pf%nqZWFiZD0I}{AP!EpOzpz}-8j@V z3N}ct$xo4&%B$tF&^o!oCdPy*ft%Z{OI^E-)H{?k#a9#<=aP0DGMjDZ>)NTVR|p3d zs@Lbs#_SI1^?0&7-;X8b_tw0$cgm6zS``=USV$RrgL}%BoS+&!zTGRSR zwnZ;}%_=KP&t8Ebm;br$GBPhGw9vMPJU4_Dx99=%17G1+_JmOUAfrNr3~~Y!Um!l! zyFl-lXtaaA(j*?AN9F`xf@1s0X+QU_3g_{CdKibk49_Z+Vo;|y0fT-(=nCV_9;wkS z^|$YK?PdTlVO!~A1zDP`dlk-@#D{Kk_84IOa#?#n@Oy@`3n4|6ZRP&oXCrS!q8aLl z6$bryMhh^OT9_WHF-Kmr-y4omyv$&>Eek-d)*;VNvW`*Q=Y%i3@-QBVIx6DC3QJLf z_1`W|>}e1;bC(<4-YsoC8fkYRz0Do$40Q%mkUei-WWH9Q%zNzX!*>&mu`%XXFPSey z?=|RAp}NpRqfpiLpyx+h4$*kr);Q0X#1N6Gbfvi@o7vWQvw2-H;8&=hoa%|maQR}vrTAUzU2Csg&X!r+Kd zRkB=RslpI-l@>Q)!1lC@?BGJ`GY=ZbBf8rk zyLzgfrSrCbFw%#Q#?6QBHh;o&mn9t!nmFpV45ACa&)TD3k{&LUt5kW(N3S*_WFz(V zyJbtY*0XlLF@zqEwaLC^t3)1lzDIaa#e&0GFZ-YSF|DF>wslq1M14e)K^PbMhm9qY zc~{Omm2nNeZ*~ON^n()WxNbx5N8GF;~_~)0tIWz-huiC!n5RR)!UBu&~ zpS1K&Y4doLEJ|KPmf7_nb;4$&8hoEK`ZqXZwtw$cz8_V&NRCOuy(!p< zt0VtJ%`Y_qN?D~4)mR+xp9?j1*$%Aiu0_nqD>M0X)O4^ozGS;ADtEEB8;=FkjVD#n zK0xu3tHl+(t9ZCcTEPL8Kw^lEmlF6@lz{og1XD}YR#7jmz;YmS%u-YDS0+^)e=~*O zIXt8`lAW!l2VLI3HP>ZuL`_Ll^kQ&S-Oocm0%@0`X?9!wV?^AMH%syUyeqGek{q=2yAbU|)FejI_r5}xV;t5C<-p?d&~rAW zc>J??Sj`rOSfVBVIC_m+3lB-L0JMfCBc0>?A~YhygV-nt42_u)}Q z>>h2r5;P!6j8$Q>`2TaTRvIj;#H4{SXORvgY2*`zA{OO>wr@`sxks}NlLNob8l7=D8# zx*{`w01m-aWEd41Cyd}Vs_vl?K#e`{z?)e2h+X!Whg|`O429btk>eSK-cSD9X7QSG z4aK)WCF>(@^^}!uDsFrI5~11#7WDUgNh7NE`hD{;;pnTKOHKpngK2#wI$Pp2Mh}S2 zS|ZEgaG$2TK5kMQMW0_P&fMj2 z)UJQ~`DMRvcawM9Hl7vc0`Bu~leo~`7~Qfd#xaMQOMjNpZ6YWlM>R=Sx`ei+eD80J z{#?$V3h|}G_)}(7#K9==ZAS!O?DC^WCjTE?mnGl)>?)8V%~=9EEgIeqa;ZvCda>#Y z$`Lx}&&{j~c)fy$`c-ja{uAIQ&c&FJ|Cgr!UFIhq@nd6K6(` znvc&;!e=GZ>7%m3KToft{y|odx)XmIcyf)tC%lHrp)h7 zV5D0yj2+QP1-DGt%P{hRUf7G305h|15JNjFOaVt1y*)UF6F+>^(inGnERb>S(+Pij z>iF)TK(eZ&MNCq!!yHeThZbB$30CCI0~4Z@v$RSF<03rEeeU(`R5RNkpY->*5oi71 zlfNek{XMH09oxu+UXH=f`-Rl?W9F1TjfKy<2PQ#3n#@-a~pw4oa^T5chd)Ya`gc~11p||oA zt(9MY-eyPe=*t+T2tIYw7v&1Yqu|Do!F5BWN2+M8@v{5Sf_tebm5*h6*RY@I4pPQ$ z;;Q8l zSSY_u2P%Zw>?47G5Z~COQ?&%O1pU5y*C+EH7FL^RZw--jTX4T!M(>>o;G*Dm{$;Rh ziH&&g{WA9Gc%%H*0$w~n0p4(K8NCvNRrL0WWe!^u(e%jK3M~Guhyh-AV17t08WcZ^ z*$?#}d1^Aaw456$rAmLZnkF5KnI0Nfu5D$7aaJ>8XZhg%DYqono6Kfb84wX+Lx}oG zq_jr`+WS!5*%r1?v?;S}fp)gP$2+cB0@KE>-r=Hw+*@k?DU`;OgSgbT;X*Pm4YAx9 zA!N2rB8yZa*5iF`?>%A7y@)wk zi0|=I8g*4M4fM;quKE>ETy~7HZHXExTdIh2K%iCLwb`q=vZ?B3(f6)+m=5GMOYnHh%H||C z`*E0O4F0g?SUN0KH?#K4xUWlxC7~>)c7D6eTBlM#0xL(|0F3>}%gZe(u`<#%^)s!z1 zp2fWg*P0xoKMVT}vi8N2kgD@sEV<~I9!ug-BZc*H0s0D*x}fOdnK%C|6!nUNc%jHLSk@<&xn7GNz9QR=Z z+=^AWtxm%4Pxh{6kCBId`jGeSEiv zK3zN-IZVrZ>u%-3V4C!Z^@I|ie{UwD02KZg`8+coZlOvzXgT0t2u}ERi7VFn8X=u` zX6`Y=$e(@&46pI!rV{fo#p;*t_$|(-!3A<9#u=+RInwMH;EXl?)xh#cdJ1Xv{((P| z`&pGkAAw8Alm|-Q?DL&p{BMq)`m+M=tWZ!FAdN`2o^7Lg_}m#k8&ItRmsZSS+IE%LL7QkE7~Wu4K}_^Y!Zah)JrQLjDTVjr=I ztGJN{c*pBn^KzPK*EWcQmZXG+spP^~>uhfgUW8cw#1J9>_K8nAAYntK+w5I7!|qW= zCwh=8^iXNEBg)Z-5<|m{qv7w|QlJ z6zh|bP3X{9LWlJ|PkNUUAfVZN|61DCAKT>yfbAF)Ah9sO64J>no<%rW>A%8=Q!KaS zaUt7^$~)$q*!@?{A;Q^0fy)Qa@uF)cR=Q%ZVcj>i)|KP|7WN?ifp9(r-M%gvi1rhsk6FYUWkbfnF%53_^ogG)6^}7IIOd#nunbiX%Zk)%pc{-&tikjUkZOd z`ixu$j~aMD>3k@Yi6wwE3|3Gw&XAEI6ai1;|2f6RbTX3s69M;2sRF*U+HChU;-nN1 zOZZO-(ww}21eG95X{kcm=-tY`Hvi8S7)_gD1GFX+ba>y}F zxYm1P^k;G$FUMJLVVky3wax@@R@-cynuHFNW1d!^0U}1K92|pmQcn~=5lY7!=_^j1s;t_wm*8^<2DyShv>%kVcoMZnx=4Je)buMh|Tb z{_mwqYaYA-? z%bE-_h2xT$9&aK|P*R8Xvj0_!IMG%UMbyg)=bLTdl{+>1pP9G@xi%&@00k_Q&I+P7 z&iWWxKc=}|)sC7Ep0D3T%fP%|cPo?ECfL#AZ1Y(VM>r5*03odxM_m#{mdo*4w1&FFi_R#LtBg zS`E3py4q5*un#xq7~S&AunyFLUa%gEyfz`BEuV`e$LRt01$#=Fdmy+!V8eQQ^w^=R zw3D<(j?$mF5!pxh4fa$S# zyoB`4E@_^VV~rW0ayR<{mL~H$DvoK3MjO!2XtZMn=~>9Wr{Z8vXgDcJP%8%q7ae}a-jzb#l08XuNq zS9&6^8=?q!oqsF-35HvW3C>qJ_ksfuP#rRbQDVgeQ#HoPwBUvo-@W+COcADtu z*_RztLMyRiy2nOE5i$ob@`kWok0Lv!mUAlSFtzF?zo-nq{8;AIlF(2%{ard~HWrIk zT(-_t=rNi?^Hgh_$5Eh1#!D`R%Y|0n;C3NoLpUD=j#f~YY? z={s{jc6m;5MWX3L?Q8-OYtFZc*gL#!hN{8@7^Ba#ndHT3vLc1IlPGfEfb5X=-U~pS z@Q9JmF?2LM*>emzR7IzkZL5uwnN=cXx}|C@L+VxBhh@+)1Ft96Y?ueDYxEvDcb30~ zU5D9M?oI@ag)-$9KPmJ#VYs=UxHb4U>)Ya1n784V$?7srDQc{s_5;sn`1RFtfx58_ zTRAu+lx*zv`Fuy|^T|RQ9IGUii8cbmuaa~VI7IL+=@F=ExGzZA?OroOzo5_Sravyn z>YI(>y6)a^EI?L1T@F0p^8)zgLYfQC!THUs5kZ#1-QSHGA*;ZC!O3!8_{7`aT^<@| z#7}TbiZh$dXHZxq!KE~id#Q}XH&K7ZU)R;G*==CK4y|Fn+OvC4Fu8Tdm?UP$i)hnD zFwmqoiMoi~!AjW~f@?4WtgDNRLzdSTomvO^XR1a-UMb_iYjJY~vucK>2 zXweCs(J8vuI~5ztOa?bC0ho#FeuY!^4iAl>KN!?XrSR{+h^Xo{!kxb4r85UuMUFEs zln0h5VW?@(le~i^o|>0wly0w;3{eBNVRAbJbeQaxAJ{7UW#Et=!85w=e`2;5RP#U! zCYa0~Q(car!IaL8#Na4EH2{06{g`eff#L`s*_DpUYMU;S`p}?wzN~27U6^8>ZJl~7 zG%^@hk9$P)PzG|w{JkWNG2iY;a7#Ts;8~UhU^eh(9-hd#jAzqBuePaR09UIlA3uX@ zLM|a=JetDKDxxx_O3Pfa5zG$L4wHxS4>N*n4AX}3n4AQ>i1YL$LIr4DVC_iDXX!jy zZK^#!R{jKzYCrWZIStFg-1F8+Ahj#7K-%xjAhNJzKHw|Q3^vNDTD;gjVYtds!517p zMXR>Y;+<5ahVD+pp59g%t^v2oJYjMzY+ApU-ibBdQgrXTr)Glj-n4$7p=}>;MqUdp ztZB2mSu=)4F*Z7a0SsEsKOc{WWDa*kM=9v7c|}wjEDUuQS7-8gHgg=WG>OwXaS_zJ zBaGhoE*xzRB&g_QY(VjfS2-ICxywIG_5LiqgNj1JS3^GVp*&*>&Vg{Ag*mzQJj?ZA z)QeUVF^geQK2{aZ{fjh zpQU$dqhvF%vMK}f+YiV!yU}0B{e5}A*Ich4lb$)elmB@r$PokUwrjT(0IL&|KTEpM zC9SRf(<0tB??CN8TS#J0ZJCpfIN)_?Pg~uO1;>R|sKb9CdZ>&KbFym?OlXa_PtC7A zXYdl!49(H|m+Utq#LQG`;3VI{vy$_^@JyCkNkx9;PHwv#{MkUdearu)>t+ePV~oKIu4h?HEOLblMYZPkDacu{!1Ym`r^6!7|bTwCn`0MLbJQgGn#0hCCo6@ zXPROOdeJe{{Ls8+&v&3SNCrG9StS7qcGC=J&^(Xvz*WjYFgh0#zKs{gQRU2otjUw( zow-55GES3=@OiTAf9(7@1m%_e?jvSjnyuX4k!Za6`>w!49}HFO%_7`ylvv>f&=c=l zzhR6l)~`ZMZ)37*Kp+$!&QRc9Bmr3s7^GN13zZhzxB&b(DisOzbHcP#}<{8aZy zRs~|i^B}i#d0od7gg9n5$CcRu^<0g`nixvAo)zUIXnlY?ArXEYiSX3n|VCC0k(mlDX|Cl7w`dqmvSgQ$y*k=V&UZ4h;!qwTbe3 zCj0UN6~z6hT|u8RzdOl!Z?*McRQUNI-kyOqD(3((a%!0V8J1?Aib~c1M6>oZ%-cTG zKEClQ89tU)RnZlOG-`}5(5?MSb6^I&?)WTQD&f%gp1U)IXv9#!iI)>YAX6|iE#x$> z)BS~kwGm|}K{_mbZe|mKnS##mc{wG7PYSJVQ;i2q0JQ?xImDRZ_z9eA3&K=E3v}v- z7HZWPmF#$yHae#~V_0}XTVg8#^Iqz=z7lOu5KHo)r-aTcF_-8D4djZB#k^$h&#HIE zIH%quozXAZR0}^cBz*Ys*TE{Dqt2URCT-F$FSEMhoCko@lWl87Ty~6ng!&_HhMua*?!GDl^J6|Rh6rk8_fO{FeH+<$ zs}luA%H{4Em$AVkd0eZRyW|ENa$&FJPlfQ8Lyn(1y84phtA6k`VRhK=tx;LyB5K1q z@#q$L?~+Y3t;dvU_6ZkyM|2vUtaFdixyLjKj`yQ?oe_H&Bwj;!L?E*FV`u^8-9`&E-Q-8eXGEl=uX?LzIsN50b>ArHQxYbhHu4kQ|H!0~vb(*a_dUy@GiSJeS+V5O!W_u^Sq;zxJaX&a<-EO_Yy4@iP`_AlXNHh2JZbT z5Wqn|bGJvlr!|`VHv=>HD|tqq&S-fM{c6kLOd;Po8HTIRhK_EzDA%6br^v~9lInsK zmnnxwtdj)&353LbB+3JsvIco{e`r>pj|Aeln}xQ#YR{V(*pMdFk?)Tp`ZRe*Ex#RwCc8)k!UYj>Y z7fpq&kmI9NY!gzi6t9Cs_s3Y2U;2tLCs_!mP(W>>vNp-@k+rmfIbHZbnRC-U^8<`R zC6zM+Fyy!eLF7n2_%hR%bd zq)>LXrKku);8-8woD2RxtZNOMo}RcJ_3s)oJ<&0vBskbu4QsqVkVD8eJz*29HFrV7@`$oOBH<H5e%=;AM(laQQRp_`RFE&zWN!-G2YI z&S1uRW~83^>URxh^CMgjLsHi|nA9p{FmM>xk98aFn1*md4mrdIva zJ;f;1%IjXNpvptBH{M54sc55N$-Hl`HR*&@<{uEf@1UAb>28Vh>NoTd==aSslVzfT z&_-y<^ijn99$HJ-t`U`^vA~jhb51s}BDT#gyzIiN^#iImkMEBMHsUw73dP5{9qtJ? zLXQ^IL^;400v!sK)2NYo~-_-kWC%j5HPPGMgP_tjWH!>Bj;g1z0?bcbpLG zD3Uv;>*bsR*a`V_W41*>nccxSSJ0%~VL69F-QX&NO=;f&uoh-&vQNb(n3!PYRGpFH5Z^m-zx_kcXTAR zO^!HLx2YbF4D%K^4t*8YFDF2%>m+M*O8tcu9ppXTCgPx(PBT&(KCe6!Zzish#fgmT zTJS_L&bXClOf`q?Uk*BrnbrL?p;>EYRUjpoF+es@Kd`P|Eu^Fqq|w3}(6(FuY-}II zo@QK0)@y3_Gy0!X!3M4tVueghRbao$ajBfk$a|zO2HQ>%NY>SiV|;mVu&S=h>YSyw%>b!!jubd!N!4%2kT6Yvb7gyBpgM=?PAL+KMo zyjUA2s7*NPoe!^am@)^>=~V9r<*iz}E^Nn0Xa=;(y!i60Gbnb$^}RnZo%4jHDBpO* zZU63!+Yxb{756S+gWeIwTV~s;E;A1uWyLAy9pxd!NCUWGUFNse`apN!-;^g{_E9Mp zgi-JV8(8H|ta!`FagSk{4)djv%{ zDxzvvm0Q^;&{hOfyZoS|?1B+pqqTVeb5O)?k>5#DXViwYnzmQ3Nmt$*6lL7g}Uq7elry9b6ZbX(%OpHSYiiV$j)KeKo z#khk9Y&PEU&?mhg(_#nWR*evE8zX){c9F=SkYydEz|NIkCSC zt|@M!UQJ4Hd8kR9VogP`AUuZSoaAbowBavvUAtCzgQkQe{yXY7=Y)jLi-?Q`%r9jg*ElrP13l%6wQxK3lEqCRZf`}YKDBubrq$sl735X~Nq!kbp=#*zY zV1cG}g$G&blwDK~?F2>SvPluJrIg9!o}9n;r20Jjy#D`nljdZ;`JSKS{dvDXD%A&y z`?E`im1@Og&yiAh<@AG_nNsT=>iw@8!@(n^o?T#tFqCR!eDUa9j$9$dB_Rul60>p;9XBuzr&0dc5H78f-&UCJ$FlJp_%vBp|TYDzn!kPdYI2n zY$G=C<-&qq7Qd>Zm?(}SGNL+LXj9ZK7+q{%WwDpo%yR5zLf>M2GEp{_DWfnz=&7VG zQsWd>oToD|Kua8lq1HV%7xVT09i&>nRd7EgmX^aQpnaLBMkUBoYw=KLqj zx0i%Qs(D#k#)y>%E&HZPWVsWQr9vK6!5kwk@VWU!kIQ{iu@U){F*6kFUaDv{aJsIBlDyUfuT-SN#I zhKHUZynQYA=dlR~2448iv>0efvvhR#HF^Da8pA4J>h{oTHo>Q6YQ8(6`o*BQg%Z7& za)c+~|BzzTCMnkjyR`$uAe-M`9$sM|$tqlZbL}ebQ5XDU-&->|i~=UhAu~(^hU^#a zBN0}s?3s}vunQUDB?A`6+$=RKJ>5TeG}Em>`u7jNE1-x$x>mz_Z0G>8J& zmYh#0`!eRy>t8_B09oBU%oW=hvS6Ha21)Z5>$^y@*`)O?4HKzGT3Xd|cMI}=FwS7Z z<(FE4;RRX}=E;9NMQ^zkbrPUF$n|`T*p1XjZ*BsXi;9cM{1oZN zWu=jB&4y%hsM+v!DNJjh=XnFjfRIqLUg{b`xs~x3!&j+Nd&!%udpSO0+ag>M-6J0= ziOo|Y8%^Y8|A?=HQ#`1|bfzbJNN?+oV33^ljCFEqB%2S(-ZKP;a}ZY~S6GQltlrwz zM4l=jvcAl|09|Yfmcr;fj9-*b26nD=Hb{N8>Gskt14&AziTNmTFNOM9056Y|Wx6Et zpefZhUt^!i`?oftdgJ;cRD{?}u9b8zn+YATQkP^jahLQc0-VHqUdaNt;a@PPm&{vs z8}^GA2{EHpFMelrwk2*Arn;MtaFw^ZI!6*y-T_T=B;Ec-PIPid&rRTAqrPzy2-u+= z>y&vagJ-n%1*W};V(C=H;P^WgiH{OJ2O$8=CkVd%dyLHF>6*$(e+G-P&hTSs1Pa>5<^w^8X ze(+2oR9tPqTOKXp_asoF?hN4=Of92~u2KUShW;D&)RePXEpl&_ zrk=5bR47?Y(2K>9O4rBs4=DjX@fl(R#Wule?PeZTU30O(JrB#1y@uh`OVl4ASquKKS!llF{@qnmd1H^zPIyjAU5XXcaBit%<_dVy}g)KLmeDv90kU8@D+vl3M!@FlMy9 z1a(%2M)v1jeZGA)BAfTbrR>M1R|<@G8`Qr)^|d(4MkW!+>%gms*4y77d`imyNwL-L zh^-ckvV9uY#Yw8MqffQoozmO>ob}NhjpF?!iLS3Bi-_LZvd+^ewdHCubL;p1X}}w9 zY`qYv`{3kvN%pri^ncv=6Qs`TL<)*AJ-XqCyF}dVd{ww&IfpbHBulyuw2Z~*ABfJw z!8JF#Bd7Fy#-{`AuUGhiU~N8|OlEM+S!Ei~cdNN3$qlY(HrZ8>Fj-~|^w}0raNG`V zHupxo+D5p~GpVHbJUht4kpUHxgnXYQhm>#Jz2^4)<83TM`W}C+L*^o+s&#lXfAwb~ z(V;SW9CywJZ>B#m5GT8Ix9x={i3S{a^3aHqO z8Lb%>VPX-pM*%=^bs%&O@hT#Hms#)A0;#`4ye&QV@VFbT;=^^3B~y!p*BI||Q~Yv4 zHQ)D&hHzCa)ffS$|7_iThze(G0J*oC{Y|$Dip-&&IWQx~0Yiu} zgFcrOU#yj4uH^hIdEYrs!XbhG4HYATpvB4uSMQ=b|OAkOK zj6!DsCk|FGc)YE~y}8)c-+zkJ0&!V#RL z_|m(ZHE=(eh^4#`xTHoZi0J*c5NJ^gZCWj$0q?2VyKP!Rw|BQ1p>V}2V4Kkf_{Nf5 z9WyJ_l?9Ou@?HDcB!wK~{w{1x!a>b4mB;$P3o=IgznuKfyb-t_4Y@kryIqrIE2*fN*PFb29AV zqv7uMzO0N*w`oXor9MvL1M0v8oj$qr-R7lGS1IL;+L&C#$nNfc z(Xlew#yG8>6L#_1<8P?X{OPxwxuZC+3P`;-Tw?LO1Q%3#WM9K`Tl9q9>tv-nV$%Gn zJ3RdXE4njWU$;r0bT-i?JN$gtn#>4lL+#161eqe)u2IhZn}a_Y2foryZPEQbE-uy~ zSNAD&QIjpf2Rl(hLGB%48?-QaQ{!s!uw_AJQ?RoajA2D%8$gdn3K^CH(0g#D9Zzvx`|EUw%s z%3X)`dN_L4PqX~=rhN$WivQIYY@S6L7X#F}Aqg>8vvb!~$=oQ2sDBM-!1@S`;I@RP zMDiP$Esn>oKAt=q#!Nik z*zUh|$hX!$YuM#b8a%;%MFSOM0pa}9uj$B1kfXC-J#iW-X&tO+C&JIWaxL(;^5PN)V2MQYW*Cd2UlE{)BeQ$Telz`+^a|90PlZ`&ekXlIYEkWLtw7TOOC{*#$|1(3G52cJxG)KmF$5s@Z+fs0YzCA|F*8 zOA)HOu29Sz^^d&pWbQtWShk6R@$0-6n(Jvyvdt7Y&*tn3=Ry6PNKeFtGeB?oIh=sT zqzduysTGlIdrFgcC9^%pn#I?2xHXMKhxyYWj$_|e3 zsP5(PtH@bMT!wlyB@?=rn56})3vIqMxyfUd@6ox&+I+D%57z%ynIw>Dr-0rt`;Hrji4RO#DwZ;)fN9jAHjsC%cI8%z$Kf z*1szyNz7Rjr=Z4ozqEJb{K&?&C5#+O6XY+=Km`sI@_Z8yP5$Rpdf+8<>owtsqu6!o zyyH?0t>EM)0YuchK?)PEf5yA*DzFRF$~6p_Vm9Bp{A`1m?w}=|n+4gXG?rc%d@98> z97RxHhcaqilgq)%zc%bo<2}=xHKaO2`bbWA>K|XC<%YN}QXX+%N4sh>(I&}8{0&Dd zEtMioWv=;}{PXPHuX{78Mjc>y&c}i5NOmO8=A6zSU3X_Q4W_Hr6!a*CSAXUmJdxe% z4IUX(ebqVGaZi3Wix$4WVwRtS;tE$>SaxkA)6IIGdIJ5hM}&~xuXbNJ+w}AWYiF(F z`&97A*i)32rQJJtWTM)jHwPDIk3|E8j`=ci40NY7a^Ek3OJC@S0fR8poJ#w+NS2y= zOp_yYLNn($&w@~{oYGVa@_u_Y#GdTx$`4rQbck_AmFNbTREkz6Jd~Tw5+$6>i9M8cmE=b3UcBaX`a0#<{c3Jka78DkfWQ7sIPWGdkkor)xe3H$~jE>GpA4 z*Ud4L%!XNiF^|_%#I=>fO=At(Ey36!{1~shx9inF3wQ0&Da|%XLsrc^2Fsw$~EMo_IX7*@-Hz3qtQSt(q% zQSxOaAvHu-RDUzSt$S931p%U*?d)fUGZ9%h-N=+{DK+Z7}$f*J(;m z68-c;8Gjq!t=7Fwv&~x{oBouzMPula}e6t&U$yTpTg?g$ba#c1e3! zhfdJoB8d|fx%ap(kKP^``lFSZIy><>CJxTnm%0sB{0B^XcVO9Z>2T4B$Txx#JhvI~m{08@S=Q=htpFE-Qjag=$I}3%Gm4=<0wTj2Y zNo|33_t;1`OPS)KlB5QL6>533A5Pbtn2UZ`u+9$4KOG1C-_4h_z7&|G_3=YA zunk3CMUj$7s*w>koxPblWRJzUH#rX{Lb*Y|G4(sxGKm4co#3+6G>l%Q+HukAk+Bh z412e}pZSNldgtBupEG4c7um}Y$0@xy?mR{trpI$i|uZ$ z>TX%ppOp<-rLaiLY@Jb>XQxm8ghI8rDuV+3+Z+9RjzRzSDA#FGRj(awF%&XYn%{dH z9kJ|NHQ8MKIbsFpwqnNo$~qsvQD9Eb+3mPHcZ?2fOs*J2H+n3p*P*&CuOjzAFzbGx zY&VC~rtum3_=wU{ya@6Ul3CyB{RSz|F}Uc~Xk0sXL2~)UnP-LF3a{hRqZnbo@SHBU z))Bu-$Nxjpj$m)Gs$Ul_W7aV@GAh6nxy~dLXT`<@$r>i;4 zcM076OZZDPx2u-O`NL!&m9GJa67!Y;`1z63YTxY6z_taGwmoaUnK> z`YqZ98K2BE>=_!5Yt63AGw#XhVP%6e*0~4H;#}gaM%Z}Cy?c7=aL)nPo+)N^VNUU= zWI~H1wqD|$be*o*30v;}jK$eM$6^{EZVpF>VEX zUL0LJHqhNZTWb@c7V(?#1VKFW7x5yQA#U%-2KH*~OU*+z`bkFk=Sx-)Q(H;(K%0`B z)&tiz89U~oBT=d|AnBLpeZHCGy~3{>$(Hk6;PHt{$bM|rf?Vqo=HX@bGEs?*wgtRf zpZW)B$o6hd`ogbwi1gtt)jQq@?KX7z5&8QJa}XqvE3?=PPZr;w@FohU+~fzmP_MH0 z*I)_q*=4+AZLG7g$-RN9khe5s{;Que7f2GK)4GnnD312Uf9wV6+H~v-9O-Lz@{aPdLre$S?FnS#GTdD^vGT(#r8WnH*~DyfDQ^y||0bJL6n0gHGGzU}rFI8Z z;%16yvu<~f3?O^u%wl(YvTOs%;r#agkvA*k(-8>-MP{~X3ItK*yIz}N>rK2C^(jsd zleC-S_CynXiK*c^QY51EK06-nJ4wA2p5m3ZxT5QUS7##CF>sabH&2W@onKJAf`tHy zX?fGw`k3>*iGu9Na>dpqkJ!+y**z4_A9@p0A2|T_dZSh$?SqxkJ|A4y3@mseDr$03 z4&zN&%4QJs7rq-x)(UE2;eg@k5);#o^!-iVB!0vA2DE=Ev_BM{VqD$qd8S79Q%vUM zQs+=MSNLdQjy03rLS{2(v_%uB>VaP}kO2SwV*iGRCISYyzwAVKs%(CtP^0AM$+N!| z?wER|C4~DJy@7;expsmEZQA`uo9>`ZvML$~8x+8$<4-$CZuz7tYCy$F@uyOa&0QJ1 zl5{^%OpG-5HwRM0WMb+y$DUUx+XcrarubKV@zeJ>A#+X+O5PSspc?#-Ko@xFVi(U% zCn7LF6d}rgiXqUL6W0m|s<~fTCL5acY;zCdk(pe}X>($<6C}Ul{r}S*jeQQEfSwZ4 z)zp)CFI1Fl7wdvI;7H0wQy-Z+pDE;rHN#CzWItn$);V;QqCG)!I?mFf@R6VjX7QFv z_d(%=?t)w#8%WsZ>LSVlszCG3`W$6-u?hGuPEI@eP0!#$&n0Whh7#dE_O+}jr`Wz2 zd)I;J+!)-!WnZPkMgJT$iN7q#p7&4PRG=pIh~FChu6dNv|ATeqdx^|94bE?c7Vx5} zl(qrR^IKgXD}2xh-pLI+8{d4$oSG_L=(3U+J;8(+IE?{&?_!s>T#j&D@P%ZJ7Joql zC^_Z{&pXyCTKO}NyqWCJIz_0LamI?56^)WC+n@UObq{i-y@WucE|eF@yyj=S$sFtj;&7ns41)HzI!$qYl99gygu7)J3cD`Y+|He+)sRfGxvy*M+dllYb+>B^fbvi7K z+s(m6kEJzzx5KVRh)b>5qR{_NH^=+l&EyCz>vv(g$jHb4S z`v{@0GzuP~osN;lDup3nt|UiR6g2pE%X;fPxx4shXvIx~^EcB$EB%`s(F?Th0c3`EL)Ug-ZuL`{>gU^wzKi^s0|`#MH?oT|Mc{i*lET*A?aU8Vn#EbgAJ_Jbe^Tzz#Nm~f^ZNWWcy0EZ4Tsf;xOT6=Oz9f zi44;)pG}GvMFH?#*4Y_*o~R1$x%spxZfBUH1|hq`13S)fK6e6mtyX4OOUBeGtSPpO z-rYH|+VPq{^)V&xa#_ub$f1LY2AhE#6TAdfH)FmCXZMvFnFz^C(j$w$Se%IJl{8c? zTb#=wr@0%cxv5q;|mK|qiHWKR%?a4-W_%nz*J>?85E%GcjE&xniL22+>;Bc>$ z1u2%MG}~z}M}TO5?0ph3YRN7eT)cEFf(QLosl{R}x@LkPfqR$=8$t46 z)##d);6P&HWXM(v%lKH2whTu<3gI&Inp;z(lodn34%iMR!a&tRtC+)y2?Of;y)D}P zB7?+WGK>iZv4|49#fk|k>YWByIPV!BdI6^uX>~HBb)$Z|uacD-hn}p?4QteI=l@iV*`qqTd z*cH}d@?}a9>0wW&8{E_3Nb}egHzsCr!Nm@%?AQXUhItSS_EPM&iiM#`OfYt!=Bv0C`cVSZK7?W?2q`p@AR-WFQYA}FE9V*l}iG=Gsh2e$Z)SOR= zcuIrG;M}ozA%z%xpGh}O zMg7~VBYnPammhWX*WwE$j@$;0b=+23wbB>*m!eoQ=u`gaPKK}wF?xV)zkETbPEjrn z*WeLRKLY+zX|tHt^(`HwDW4CFt=D`B+UiJ=rq=C4Au@8$AB@S4()3HCZsgFm)j`&pnw zE7y7EV*!nm(p}}zxqG_W4ubBul^g#@1YFf20*;~;O#^#F_v2SoI$23iLC0Tr{w3Omk`-Tq#g>ZPO+Md;az5aQp zu0;!Ta$Kj6QeW7XX49QIz1d+m41Ikwf-P0g*!IU_4MVd6tfiQu5X~7I0}Q4Z18ZjG zL|~IP_mp5+sG1!sCDCP7+Ggko4*TP^#Zs~s2rdUB>$5tX_GR!$O2vP*@k4Bsz1GfFtinW<&|1Z=G}3nZX)p zX+Xc0YA7?5ae@gUz*RJWgBvugUCg}CF7{6bIRe^syv}2-I~?xw4&-VvwrCh6YEBkqAO!~mLz8Y_T(|UfEJ?)!8Ok7%cj$|(7Y&*^K zJT`~o&-r(SVZn`)a;+uCpThBP|EiIV3}mRnLmH;H3eVeBncQo|kWQ5`mPZ+!JdJ3{ zWSln@W=cd@1TP2d)!Iq*kYr239B(4c3`xRhqw z7{fc3HG)~Vk-y(2+z%Gb#)+6E42G_Tb_0v z;4e69xTqPED18Bx+mP{av-0?122vHIC8(#Pd5kG&QYUbQjD~D zX^dKFOOYRR$^BO?oy!QHcR#l^kO0}|p3JiF<21g9=ZDkIk?st0qrO478QUW4)CaE| z;)&%dx~}u@-E33I$lfH7HoJxjhZ@D?+L{~GKS1E~8%0+CL1_8-<~eaL?68)g(e@k}Pe$POk3 z9A5RwpN;N#?>oMk6(~+ePf<6^n#&0pah^q zPc#$PI=fW1b>z;>g&DRTk{|wh2bR6#x>$4)%tiu8*svre)Xjgqgfi#+qWkPvjkNg- za2TgQWMA=miVsehHM85crE*8QFXoYAPv>h?!?7Gg5%;c+s8ZXm5{El?S0vlJ+lU>; z`$^?3r;8*!-?O-N{~55X6-1e5G6><$a@LPcF3&-k?|9h1Pj9wji|7U#ueRVZ6bC;r zqkzNJa>M@@&ebZ^&)8A0qfeWBZpbsS@O@EfIRZQVe`-5}L|2n#-}g@SdK2cqW`cRjt?4-5Ph0_~P+z`~#u?WD!R~w7&M= z{IeB;a&Z>d4^;4tJuRPRUS=N)zowJxLB?pAp27Da`aVa?v!oIr5`IwB7p{t8#bdR^ z{z-Io*X#OHlSh8X(?T+y9gOM0T||{Me7el{oWa1%(tQo;UoqgB?EOO6T*`XBR9i0Q z;mQsF&W*uDSF5;|QL;?kCyq^E=G%YH*`7{LnW~Bu@C)L4j}YE%vZmU05zmK%O5;Oz z3#TDg0g`@{DL2I7l$AmQ9e7w^8J@!!NmvFWwsnfs#*tMS6(V_Wyv37>%*wS>x%R)( zRz)A}#Rt0Lbw-n@oNXPiv5*+JQ8sZ=IP=?p5*xV?15*V#YuZ-n6)1#EN$Qn9W~p8I z{yzPZ`BQGD8Us%`pUUS7n~0Uq*p?9s(kv)=kMb~pmv>}7#)#A>ts>kR9zh++vQz5! zDUa|mP5RF9)VGw`0R!Omce`2Gj2ctGf1xVX$a8@*(RH(maHo52oDfq=FBk5pYp2Qm z>QWTykb8qq&1yC83(D5(B5&GI(%VCNG2ExL6?k~m6G(I8?^)~NjN`fsRHbI6-ssYt^`=LugzqYE_=YjT5AZq+TMR_x+9h!?!(B2E?ny!`Cngsjzmkj#YRFNS04{qu z&>wYKN516vtNI*bDS6AfV@bx5LJBvq6u>#Jx58w^Q@d{?U7>J<*#Gp#|K^kaJ4+ZZI5@S&>L zD8;9~Sv`ipJncpluh-?x0VcK5eTCItWEQ#}p8z&WQMLYklZcXDhj{k<5$$%yNbd=L zK8H!zSJd71ne0^TpLxc*j^C~xyAT<7QSPfZNQ@}*K)u%M=)wxS!mEF>XL2=~v<^&U z@g`kyl@G2G!5btGC zm$U!a%Ku|&n8+oYZ!BH%e2Z6U6tkV#)2QpA45(_X&#zWmmZ2@{I&7|^Qd?k?lPeZT zJOOu#?MdotCI_(;&p+)$Cl(JoZ;$o*63!c)BSEtc;iN-L*0gewZGb2S|)5m~f>K6bWYG z7*nZ!NK3!9N^#wr>U#0UGm2~O6af>olmfvfoT)16)S$jOWP=4rNu8+c=3_(8KvhSH0Y*5UzXYu)NtwXlK zr-EPit&NQd<-0rkXIYqJ?4_MU^H9=6J9Kj2j;5B6f9MbSGv@2#8+-*h?YXugv6M`5 z3!;5fesS<1>AdZan^f!21e53L(yps@l*RSx8SxI-|EHTv%{pQ#<$lWZw^WM@CO=-| zZt!Kqe9E24>d6&}?zLU~s_H9(N;tASX-Br>ATpOkmTDapDX|ay&Ht=MwsNy3(hGq? zqZlv7oa^H5tH`tWv@0!Akn>OcSF04GAq$End@LgmoaZ1+B-Zonk70Evqk;{GBtCss zFuQms;SF}~PXW3!UPT4^QHnZu%3rA*AOe;mgXfyD%$lGKOo@!x&J=Q|j?DLbq%a%m z8r9SuKHlwl&om|MOf@C=e>{tLWWttk+KL=8M;;2lVnfdK?|$r#8O@-UA7hiZ_l^h zb4(JhZysPz|41j~WpI5`iPw0Kvf_ijbZ=npefuWUkInn_q>6T^J9{sxt!^H&1d6y=V^zEOufr)=~@TN=Vghf2YV;_W&WS|lyv zOV;~Dv&#yM=pb9O^MXNO<=-z*n?BE)V<1dEe`aE9&G51nn;$S|b z{>&9=qrvRjrUI%OZHVBZc;ihPBwIu z{<~}CbBxz?jQ8=q;nx+LBMT_|Yo=iTKpvn)r%ZCs4;KZUJP>OV4)Lf&=w7bnw<9sV z&Fq*QkW;RzqR0TSvnRM^Rhl!5Jrh7<##L2{EX@~z1S^!L@Mea)afyAC#0W7_-D#PG z)%Bg$R?hnt#(2iGg{w_kVTt)bC%1=cc)e5jXx#T3Rp-Aj7B zLCJd2b+vtpwc(ysnr9xzgIhcmt<%TDyB*13-O9R4+Qh zmhCnr%d*>FD~u8;xKDB&zmNw}@JX=_WP z;fSui(my&E4re{g@jTX#Rb1?GRN!Ni5-Tz4a}-IqDoVDAP=e>MUG?V^m7`fWEU2V5 z98pBu@KEk4c+oV$|Ge1Go%RX)fth$s<4&$+6nWKe=cW_8<=Fqm;o9&uq#8{13|n$+ zG=PreLT|*;?+N$dY7KxN?j<}3m!Rsh7q&+UJywE3)i7wFndHE-sRQc!mvTEy#FO5( z&x#L@Xx9Etk?W~is@4@6TH%nhAbO7!TdMjpN3B++t;KQbL*YoNaISJ!56d?_EdR9u z!a?}oyT)jo;FH0ab5b3_c1-^Tvu(5G(A7n?;~Gs)SW|G%oJ#>Oe_xQf4>o6ch8nNW zvBn!R!7{5469;HogC%J?VN6z=Wb2F;cvB?g0cUG{o}G-=dJAH@7$Oc;e4$ z8GY?=Vm?1Y-v5jcF9!DfM5ZyjLlu-$wM%PE@t!Jjn?Vj9=~Z3K=E-&k$*m~8uz1js z1aiYArJ?*bYaQu6622#p?t?Csr?{-t06ZKqb)B9Twzoa3~mgL+FN7D$M zUhSBhCyUG&qXlzpb5KK)hz|LS1QRPYl^j{k5$>vFt~HyOblAPi)yLesqRn|bygbWv zdgn_&wLgdSx@CF0m(#G|miH(d(f4RK zpiy>jWeXU&ulEt(g_AXM-`S^p$1~3tlD?&kZ*SuxOQz9e+@6^KiJ^uFwo_;Ifj*|8 z!N#3;_>0fPPWb4;}jMJk-RZDY26aR>#E;5WC#6{*{8<@!Cd+Xx%c+FglgA zB0R`=CIz{E1uZiOoP@Dm%Ssw2eMKN!rT1qVPe;jBWT-arwl61Mp11098wZ7ZNX~Bv zs6iiF^+v~hjN)i9Glbr0KTZ{SvxrCPJ)agTMAA@FwG*-mK@e2@WG7+vJ2H!g-|HUhX zLXyujam71RFB984R|2q>B%R#vh@aC}q@$btsODB_4;)uhW&4CX;8V~M-Xpp)@I!^} z2;bAmrt|Z)_GPVzax%hFhg>ffm<~dS39>z{z>5h_sB82>({h8bJ|x=@m9B-pjS5R; zvaJjaTPE%8_fH?qzf-1CRa4rsm zP73%g>2^f1Xg7n<#Y3gnJLWtyHaz0Xitt2i#{*(lJ}a%0)zNiw8aOTR4aLP#djoQ4 znmTrYzlRezhu+bYY6+!77!>t#mSB2hc4QpNYD^A2(uH2Lz*ZWF{VrPG^o*@JcN8s$ zJJJkpv*^9o4H)tWQ7?A0=}GlwMfASh{swAG#!0xHy8NiV8JOL^qRac1YuK|^kf!3I zpk+#L_))qFax3y5@W4&S0MOh!G9O}&sLtq%ctmTxi;n9T=<}m<9JJ#2#{HCxcN8o& zC66d93mUb@0e&Q3Pn^xl0ZsPA_Swhh+Sh3KelqQcyI#WS{f-g)gR4VN26`#Lr^)*- zh;b(-ZPKFLH0x5Z!Yy-mL5ZIhc90vdoDEiJ5O}BD*&?=K##66>mMG(4-Q+=i;4@~t zH_#L6<0)Qe27#le#5aj8KFs#ZvppujBhvH96!N^D2s|s6S80qJNydl}71&F~At)Z-2(t1lap`Z2>@Hu1qj`Q`P)@>b>A2>} z(rVZaHGf`n<}v!p*p{h;YXc`;b2bwwH_vBT@_j8dU`lkMZwd{F{DfMC*+JQoNRR5g zm+Dq^c>h&~>#mM;htdDZJof5%iE-B5&wT4ChTK_jTWNj^5dlgzZ6N5s)<^sO^vP(P zvH+Sn5-!n8Y&*7DeE-(@v?BBEwv7&sGze!+!em6yRgkg2LNL7}-B{u_A}sfhF$Sp& zLN4778(yY@bc0you8hb}CeEQmx`C6P$WG{_KV zB?t)u>5M7>V4#6kJhd5H*nCFLAI0C@jBJz6X@>pWpOfMvRjX4UFyNw-u-#Fcad-}L zO>s4E;T%Oc2~bBY+tGy*3T*CbgVnCG>EN#6J%55Xt@@FSA$-fM+-Fvhz4_Mnf93Pc zp&bhx6jG+**K{sbHB(9xo7MP+Zy0a>8?R%Cz|PUDcJzDxj}LB8UT38F7OiEI@{Pz( zlhX|OqC(uDjTD-S?$TfUN|RH0;RhbuSL#9krz~}rqhE`RFa_j#*X$POQpP3Muhz2m z35NW9n=6hqdtE=2?rYu$1?&})*pBQ78#9U~&$F`rUkT8&ovmmZE?v{mvCl^BMOk=t ze!ikrhdiKT)T(RZpgY(!3aoxLnE8j8UkZn|_`>qHQ8Bm2c?2$!x96P?4EJ4m4F>5O zhxfgC>-dJk>H%lW0Pj4>uSN~c){PSeR5)XW)j72yxk|$oa-iluz!0025aTSjr6DJ< zUfNIp)Q-jV0q4cPMmR>5;rdr07zsr_H5VAPRh%6TYzYLGIC%#uv}mMGCf@zP^w6P< zUY-bgSLY9dyg9(adQ=sE5bg^j0i6SvfRGe8!P@%ABUB^E4@AWrw@BmNa=Lf`#$L*O zLx%c4yS<#F|AB6&9e4d|YXDlJd=MS5jqL*<=s`#=nVc%a{SrLzIy(LA0**KQ4}1 z_mWjj(#3z}g*N{uPN+^}0A_|xI5=ku4ytY1kM&<%!r8T2%T$bIHj2ZlFBH&m>TaBh zj+q8rjnaDz&S*1Rd9-rqEsk!ciIsHiKg`9El@`wsP*iH8eyMcE)=6^5v6G(DU_R?$NJc~mbeLhgUr5G=su9jjIQe8to^pzB=K zhAO41-7+wv`!-B&&cKN_dPpRry;*p#@Q0>%R~M8mjgbgl#?&$u^aC7z!~FlY7T+{G zha1IUsNEleC>|oTDx=uie!Tgvuj83bd~N`Cy)kjbRPwJ_BT_zK{A8(b4EZYCaUiW7 z@jnOiZgNoW4%eW_*FT*3(rQRE2jAgaAfa`v#iJX+nkg zrNC@}8}^Jw^7PbXa@un?4_VdE)*@S}v9*5CsJ#_H8|V(5dc+FA-zP1~^%#?l7!&3= z&#IoVvQ3=OZWY>T*;>x(ImLS*1>vkJ;N-qKF*MaG%*TkVVYrXj$9{~+U$s=jP_JCI z_))xjYN7k2z3*jOQMrpxlJ*4COyIA=X&_?c2=)ViPiNY{Jn?RL8)SG>gJJ}E1pU8G z+9&>}E&sbO7y7$?*|9ITV{4|jp3wQ5=lX)HBcn}0X`Yfw7HNC(4YSMlMp*eoP8G-o^g;NP$7mJ_~ zHb(!UQ1^12WtsW>`F(d#Y3*t$`G!M(1SXwvU6ttxcY7OxP|TJUO7i8&(pr7HW33jw z2$3{dc)bdwG?+M8sy%+Ew>}Pn3>2_M>{LsfD^3fmgj@96tdn=%^(l=8{Tsn`&J3i- z|B5fzN)GJR5aGe%5^%c?0eM>JaPLA|y9MgnI?~{EQsgDZEVgmN+35q!g;r00E+`+6 zxR-V}5uKv^Qs|3un2Z0n4K4mbCnZ8s;jxIrVu|y$pIPc%UTQDm!xtIibJPA$ z8}`#sICQUIE3Z{08x2|k&uWGO*gnL_nZ-bThIM9ADetKhex-^1(aZnADfx%KcR1ZX zhXPT)lW{glf1%($j1K@r1gc)f`E}wtJ(pv?cIcG;9U`28c=H@8hYwu{&)iN}r%i(y zSZ=*Id7J%CRejL%T#}J#y5pzZM0kE=0Ll{`8w`GV6;)0tuKlRCv19A0LLjE0DWJ@e zxb)wbY;@SiQ61g|NRyceof}s!w1&Dp^h-@Zs7phrB6Jpt=;=tOj>)dpO(}@(&0Nhpy!7 zbRRAm*f?((5(OhJ21bmRiZ)kEYXh;(pQUxWM`QEGNU+h_{O>>?xBFK2E~V{HKq*pe z654Xdo=^1BZ-1XS^Ts>0y41RZPM25_cKm-ICm|LU+Tn(Ep3C^OpFM9+aIAdM6rWc( z2w3{jfA|NdtE0Lf)Baj+6XU>9Xu{M+z5)atJ|}TRzYTuXOjB*>F;_p6x456o zgtLN2|8r-ppbGH0sUl$#_RO&MQXh~iM=x^|1KEwubh-Lk$|4S<64CO?Nv;g5K$vNTbx`y-(XKGxG9cGvag1#+wcWj9I1ws@f~rzL1-6?i9_i@>j$djp#C)F)qyWANGzLtv>!db3sU*rmz6!9ZoOU=3br zgctEk#QC{$;t< z>z?Aw6scBrf4;Z!0a3N7VLD$qiQUWewoin^oJOf@eW7uYo)LAm%NMAOd=Na83R}W8 z(!QPs8(BTIgKcNUN%qiv=rlo!&(V8xBY+s*? zy$Rf}>dmFL2M)cPCNBj7o;FEyW~#xlTu;lWX2S=Q%}iOJ23jM|WWUr8U_IWnFDy?3 z8|#7IxKHI=jzmVE3KQN&O--N&Xn&R6h~6evZ$^-Ztmzk-g^IoFA87aKBd~!rvO00S+oA=*wfv1QJ7uEtqW)^?rHo^0-*C@i*+egnk1=r{A}jwk)#MV~br%)~*KUTJ=GAn`(a z1(UejnO>1dL9aEjJ(7w?6cZ9llE*9eSJOiezxpd)>ZsPADvIHu3} z%%s%Q&%~odxQZ4$sZC#I{!JEp_FgwAjuoZ%8q?dztcu>)dVMB|9u3ie@_ zIRKBD9A62)&TQ5Y2u1lum>*-eXnBedG9$w(n5F|+{4L>Jf@z5P<=hsbvq{m^v(Qu+ zXR2-~S{dlM#U3x-^TwO*wR5iq7RPgZ*;~AQizd0OUVFoyUaqm?F7Lhq2%wI5#_3O_ zdb>CnaJ{Rq<;|DiwOcB*J|*eVdRSu8v2A*_^$g|dVGLZ|z`1pZcCO9w;f3zTt(?K= zo~;NiP&_cYS>k+#d=Kq^Q@DgAF8`+@jW%snI};K1eClOq|huG8s%5T68awx-j+8JbJI zj}@7q`=Z6(mY=gM?zIYgu6?$oHye$meEuEQ2N{Y-Mg~%C>|eseYEAZK2!90PlVb}I zUBSkt(`BL1xSUq2!@6JNg>{oj zUnL4&sSpM+0H$J;EtTrXh~vrh1(*n~npL$Gtm-KJu2Kd+Ig8FW#dH%7#S8K>jIpya zJozKP5_PyNRIA{-OWzh&OLHp9!S?61N%bPki-xVZxc;5sljmiu#3cO{E3Oo~BTDZ3 zs{$F@-vAsVCv9>m&6$8%^!EFIkv4*&r^|AMOE+Aei^5Fdn7-U>3Y?$|&w1r5_$+b~ z<4&`B@+@!nH`OTcrH`%NZZ*kxFd$wS#9q+TaRd!pBwF+48~ohvdH=#X>++JUedM8eA7C^%hv-M?FRUP)(+2SS9PzBUjypsX zb7S=b%u0F|v;i7~`$A2*i7O0r3D1*8dZ0bc2==#6kt)dq35W1aIK9Y}yds0*AuN0Gz>>0ez@1Nh@;!idH%oJz9pWXcnu=gWavx6P$OK=vjbA(}l8=a7u z2*?xkHz1;m;BwL_khP&0M=+D&5rCKUAB5($lCkJboH$XcFM17o54fU6OZ<*fKCt)~ z@N5^$L$OJdJ_|nu>sIgiXRIE(`K4F$u({jV1Bcyd*hEFVBMEZY^j-o^v;F`&)9bD& zFS+G^vj}rgx)nB*0WgSwcbshMB*f^W*Yce{H278YJqRnp6Dsz?IKk<@3-^Y-yC*{L z3GsO8DwX)BP0@eaa6qO#Amz=un5BtQ+(1@Y5A&fiJYt=JGI|uzR8z+v`76 zG+G#B`>i}}ZbR4@vIU}5TI;9+igJz&a1B!&eB5QqN48~Z(PigEJ5iz zDHXyndb&6Z6A;m?_atmHxX|Pn2Pu}kp>}C_h^-H~iVXL(czfEKB#ALcKZ`G~L7&r1 zp^3y&VHTfk@nvDlWHO3E`S^zbG8rL`{OH6odrynAm#t0uaxmHAl%~uPL@U~5{#bvy z@kgyf8)yTuO*4(t#=!zazc4T4QfXULDt#vxQOdh}L5*wf`lHP)55{ha&=$i+L=~+DZ&03enbUiPX~q1* z%0}ukuwg+TNELcEn0O(*%}ce~?JW!Irre^1*mIlZrGRY$%Tu`8)B%uy`F zo&~m+m?}-}qDrlzSxkD$^Z)Al62PXatpB{cmpm#2qzSE-PE=_={9hD|UK|yTN!f08ubV=9r|2r>9so#7b z`jYe|@1Aq-J@@SQ+~;!&tIC4A*#2WZJx4m|!06!mPy1KU2WwzmyJX7YShWqU7bltqKG}1)}Mm+NXyc_DJTvpMG=KLTG3;$3t^wXC(z`w zrNRMs`0=z!one4HtaEdY#XWq^=i0M5Wv_M}tB@O8u_SUH%*p%BX2~_Sz9j1%ds?l^ zpSj8r6k6=g?+uz}+0q>X=9&v%o+SvZHK^-B+_edR<&EE);eN}_Ua5y0>s@79QNQfSNyZ>KYU1A(7qj(VilK0J4gp=uT7hWwMcnSDu{xa<@P7oxGMeuqqw3?g7tJW z_K$8!)Uv%OySc{7Jlu!|st#EzO)pOszzL#6?L>ijel`OC#Xj(Cbb>K-_W_6!u zt6{GrRI5HPu`;5nmHua8-a2?*gRUB?QC~mx{G62b;s^D#aqy#}#CSfWuBnCCYU>VzI;WNL%|b(5U>#_hkmpFn5?e zf_8CP+aO4eHFw2qtP1|8W#|0%sM_mXldDO7BGMhDZ&P+|GX#HVxQabp|Elhb%)*{7 z;9>N1mh~=~j(wcN|AFm(UK~M!iX#vm1?Be1#Gici=|8EQSciD}%te}hS;O^2xz!Zz z-BcwuxOVohdNsCWF|}_GJIx#yE$Z-ef2?;GE%3=a8OV zvrQ{M>2!W?se-b;uh$uAXp4fZ>~byX{HBu5 zAj`U+JxLmr(W)pzX_%NNjn2=8A7k5IaxJdtpA2u>bhk8Kt1&#BQ)c44sqcRpe92{C z+dj9n#r=i?WCrn;(jVm3^K!d_N1-5rU!Z;w*~b%cO+5!yRlIJq#@e=BX&TiPZ|L!M z^*z(NR&MCH;p$TiR5F1BLL1b{LeELGRF^ zCen}EaI$*)#&oE19mNM%)}cDxH`iX#_?=ur~?m|f<6q<8U~V%KjTmrkbb-1GcQlRDUa z$1!8?d7HBOCGF$=YQ5|I8~SUm9>xdTD)k>ZhUVrxQ2 zcvYz3Yv#+Yj&NhBad%j?t0UYHYEzbuC^Cdr9WTb2Y1#zGQEA**+8Y#0`x|Sc#iO8) zzlJLe_ttv*`(MwA)8>lAVtrk-cpr%OZG1Nz-+hkn-bjEQ4h zv3DcRp2JO8SKh7XUCCui(z~<$ZR|uFZ~5CW``Ym0JiLGG^KQL@vSo1?)QwgrlvRG% z)$(*_d1-(7!xW$NIBnp&D}%lp=Kn5<`n7BM*pq03#rHNaWn+JT z|1^9)j(fD3)A#)HvCHtc9`q*%jt%%tC%*K3XJ;vq`YfIe!gv41cX_wIV<;|0&;5-1 zSN+e05!}lytQPl?awQ5KPLMFJ!u@83?ibMg#=-YnSh9&`;{NCngYP#pbU%mg|LD8# z!>fgT2>0jWK8EL*LEAcO(4Y(W3#psJ#RDE+h0Wa7GT?|0`ZWl)EQJ z-$P>t!*3o*{orsv5-`pSuIF1Y=$YpMBQ)eMFqnb+w!!yX*a-Z78Giq#eDM8dhVI{w z`-@HwhTX!38LkZ+J5$O;Zm{$nmn~HG&a@n!)7J9LWOwqB#UZ8ej^IZ} z+?(EIyC41{yFc#AZ>?8f?i_XGIEohe8(2w8Gf&T+DHggTRq#wmf?O(BPe@Qo;xhBI z6_R*GXxL?iBrgB1`AJ3Agb6<<71Bl!5l5O;|^AtN_K?n7J}mzg(H zfk93}K_dSj_JoOQxkR3rgAor=EBrm8Bp{vs^#onr^3RCheu}FCeM%MjB#r4_$A4bc zD|!B@DeYm_<9GL`>RT?dJ6)(dMTga|vy?e1nR`pql`lV6)icf+Ud4A+ayOLx%((uA z_H(Ya2Fd0<%xMhEc9osU7hP`f(Wykvvtc}=Oj7d06DFjUTN6T%wrtNJq-8Fm4B-`h znwVB1%T<&+3(L#OC}}D|w6kne-PO;Y0gh9#7J6`fh4t{fZrh|H+wnwEggFlh{4`md zLK-3s;f0CgX6bW3+El0eocJK|gi!QzDW3a}j$3=p_4~d28gI=$3$$%>*L*HMqJJbx z_~})BoEw7{Ay4Ivn--zvSge&@8l{UD5xjY zbTB{wl5hnRXf}j8N$Y!|=)sKTb<4ka3!lHmbp!A|#Qd$%VaKVKjqK&xvi9~4?U}x} zsn{VmCl$HxPuQTgG`{ct;J38uuD-d>P)l=;IMO?$GkfnJOv6TvXqx%;2CWZ1tKdf@ z5P4;$746NqdtxrA>TFUjeZ+#v#QeAv{>3FNh!aQxWYKmtKzD?gsCh1Q#EcTN)x-L&tf|CHgQ~pst(MBSu8aMF` zmZpE)rJ_-y6ROC%6<<~Z<~^9_xp;pEb9|dlqIP9`am(wx*VN5F^)mnsq!5_z&*f_G^+O#&l| zH7`$(tX=UH!G0Il99#rjqC3-05U2Qh!-BhmH{u_J=wd+^w0~8!7rEI8X-QM}z;)Mz zEi|`Ya_G-2I{5EW96s3ap%owI(}%WLe6WN4B5z2>#XT-@F3`r**`I4eYWfSI7V)Z`Nk z;!ptrsdAK(laG?K@?`KM7N0oWA<@ML3!)FxAR4E6wMbX@-q%|&mn63`@t%({-LD%y zM%eelfIBiaPwT-K63xwi0MvzWsWMq1QH}(=gE;li5a>bkT9K|c<#;68dIJ~9mPgUA zH*~|#xf&z&9oyfs4Zp#zDc#C>mss74t=)On&NploZhXkouNDQm z!}AeJi829rqbC_@8M3BKVzAU1NdzRDFrf4FuVv_J-#eZRm^HYn0CyeWzKvZv-okUe z_gg#ewR)CXJJ+Zj%ea*E-bd~A{L8^pxc5h#W~WwZY@Z!)DC{4*E=Gwa>n}C<1`;hx z6-)>R;YsjD%h~wEe0K&oW&&_Y%Xb%*xym)PDpdd{T3`kabtyF~0N;p z1d=`t`~WQ6|0(_}^_ZIs#j7T!~)o>F#7hbyZ4{hRt7{_jA$^c~n3Q2Mxl94FKv7<=} z48{aZj4~k;H~cf=V-{l3d=2opoMIXe98Tiuc}FLnciziH^&DQs953K-fE0V&=6;9q zu6ffFZ)9f}jhv~8s=^giU+WmHci+~#`Z=#+@2`$=qNxKo3{W@e4U*W*ZedHVm>xXkLl$9_SQS}LhrXE#XJ zDkb&zS>20J*0=Fqt9z0tZ2&3{87C$>Obp}V6%!P>V9N;#PM#!(4k#9AP`ZfvTbm-B zb!Y}G@?|d(a2!j;v7?|Sbv zch_^D@35?TyJyHZ?$gr0bR0`f5}z6326QMQSk&=~kmO4WF5chq^5x|!*#JEj3HZEc zCLVJFSAfU7tqXe1yN8+T&~^P#t%m!pio4!3*O{_F-{qN}vDK?@yQw~s&t8KKRU9om<>4cApWSiO{^p+~JcMOt=L93G|GgiN=`qc((Zjt?3=;$Dg?Q zuK!v0@GvOoYCON2iPSU)THwR^2p>~|;CMho^_-WV{1@Q9i05r+=PiK-u)b5X_@SO< z(wLqY>3r`-bJuujR^KMGCtDiZvqfg^D8TU#y_;3$&TO8U?|ocW{iWI%8V%1Z)-fHYh!mxctEsbF^`XfCM=FWXPj`q+#< z^-R@8gnHWM%;GuU`xyO$4O&5{g~4c%W9l!_{0CleOBzO_g#Ik^_3;$-k@z_2C;mQ4 zYBmFHn}9YtaLk0Wf<1%#mF3-7{i>Iv`gQEZ?6s8RB zB+sK8&=o?^A)$LCNlCy$5M-TSWg@g_?zCiU)Ha{m4V)y<(;mgW=@|QZ-LQ}24K-Zb zo|1ohzlrA>y!T@7-%|7SJGk8jZakJjbE)LGTI$_`-2yz5R*pCCG|@y2+Z^D{U<6{4 zu7Di^`H({jLt0W|i8DjcWz&U)K=t)D`E>7E(!IaLwHi2(?)`>Nyx^*KwlKZ>@7`ZbY?eCQ);UUlc34N{Mbmg=P)m2b z;qU?V1+8mYg5G`Uw(gh2xi^~cV~lM#@3ybsSGy=odEn=>bvqg( zu&H5lZ;(;)Rj^U={s?2pI8TtLM{Jt4rLT2qbyLs7&gg!+=<~d9TXH(C&w#BM5cSae zpz}fA5-*8QYz1#)<5%ECnJ_60d-fj01ukmXMxL|nAQ%}E#B?lAkAB04@gL z0@>Hwv*ujeCU}Cq54*}NL#t+IIfcK3mo*)aI!qY@y#B9~;+u_$euWYe5h|GQ4|{P1 zc+ubePb{|R_=eRCgo)zt_BuPXoACbxPg>}? zDhEU6yXnXM7%_}|wsm*n650&PDl&@tb8c)fLROh4@F<}E6F3q1R< zCtDz9t32+T<>&tyE=myv7BpCkpfW0@AhGDH}296Z)Lq(U0g`wCKFD$<>jY5#+a z1Z@dEnvlyRJ{3Pr1ReRPsYFoTRl-^+Di~yz(pJz$2U14v>l@26YrIiB zvlTDHce)IS=(%`g&gh&Gjws0*?^wxweJQ-lauCI&vxtBD2n7Zb=i>$7nTY|ODKJhS z_XLM1OUP9v2ud+}i+Y1(tF%P_Fb43czrBP*)xqaMBg~B6EFT`X?Q?9DRiCnKkX8R- zEU%Vz?H~#rWDdXxgaJqzDM<{d<3ytn8yWCEI%!>yL>Vv+@1^xxcj$+0fJeOg3E+_@ ztXJ^^*IeM$Cmb(d=uDFlBdp(9ES+Jf8N{m{TaHv8)=H-tno2osQ>3c5=8FrqOzS7{ zj&0&ev{VJ%kt8i7nNN%mZNq4zi>zNTZuou4Yf4L0EV|t{=RZaO7n+A(fX`#XoVQZD>X`bJLgundd42R%Ufc~cA`=p=^~p0FOzA(3a|$luJ))ZgkuV340zGmc+ zdc}WW$+jBbrAXnt8eE7ycFR@T>tJEc_E< z>Nz=7JU~r7!rvQzp$&wRn7<Y37kI1MZT|9 zzze?N1=n0RQkZSF$OBh$?DLN_4Xu*A7u>z!$T8C#Y4+!?qwCFQk(1W2ph9vuxJk{% zG^V@$-^MFiCiT4Q;#iXR16Dr+i<@jc_)kE~khd^yNZ=)b#|MmDzXCFmWL`^jJ=y$3 zLtXoI-i<0a>Jj(yy=@)4xw!u?x6%hFMzAX7387$3Nr_}ql2uI~W%9fd|6(l^<&!L_ zJ5*0|QH85=U@km8mCV7Hd(wC&wbJJR?(nf=4=+Bty;|mZT}DqG|1#ZBC>?n*3D|s8*+?+MTfOQ^f(Oo{D?Tve%;}bJmbE;b)osL&s%?7dYAdG zf4d!g>L)I7%&u$huQpw9Uwk-GX50Fx%5oU{9Ntc|yfRV}`;V*&Yf+54I`^|Q)8V(W zEzgEBu8R+^u*0O7qq%&-&sT%twTmE4JSUNqVbB0g6x{uY0L;n(&N;J?`vFrtTfqyu zG9Mfs@EHTYB?7;Tw(bGGg!5+HnLv_2E;;CL~Pfsq$xPl+%*`RW=lZf;CEM?e{K0@_z-greTVJF}sjA}rf z3-u!B`uMMPuYXQA0iUS?K2?}gScLPvuynfwOLvpZeyoFi!22Q-(=%R*Km`A_Wxdt; zxXQUcUG!H35LKh-4rvi23rJOyyOR)PkY|?oC(!30%c8Y=Il6&lj-aPN=D1gVXp^d& z;K=EF(AvAw+Wj|cr_S23+S>LAoUq^*YU%G)t32*oLWftP%PPB%^gzrFt-)CN%jK19GHdhW zW!4^C-JAT^X1wF-qHD{ot8;6ab>P}oX7%7&ESmXO7qdd}ERaJUYCrgs|3&zdUZ8oB zhdB@*$u{RE>g$@%OuzNV2xiuy(VNqWpk%9m3Op!M*_#-7Z>@ zTUdMO=XWrXXL0=j=pSHh+(UlrU-`DJe{`2S#8DSiS6j0jk)QNj$7x~x)688p;vCnr zRR`TeS{yG`h$e|nHTgn1XcrMAA6p~+6U&l|%goJy`R^iYMwa3Bd5$5|=4eh9mAw>w z76-AyDF&cBL8L3F`=0jwr%f+-v+NfoHCgrw$&MVntjn?2OO9rnJt<69*Bs~4{?+yk zJJ%^hnWDccA_EeYe8!}l$rGUE^K!(s0v=ise6)E*g}V-&eGh&971uR@B@{lv=LSN7 z*%J>hab48`M}udiwLNlyxyC5vw6{TJ79v0C%GulI<)kT*e@ zOzSjLa1KJk!+Q_Pffq!ukf48MYfk2t{Th8v{F5K(i#o}kILCJBY0JJJZ5h_CN!Iph z_A1HInf6lZ^&ZKdnbs@0_M@KmgD*}TkZ5pTh{JdQqxcn!Fu#NJmcsyQ-#~ogc9GEE zbL1yGhl}Q!{AASMQ`Fz#r(EB&?zp%6_Qx|ZHAh3LJTBAh#`}?At3T0TIN%zx&wG?r zi*EH4J(9#j=@zC}4z~^>#2nqgcw-zuo>H_sLw};A?CI!V&S8pQ!}Kn~dl=}Gc=00y zm-SKx6Tb{+#x(BqZf&7lZXuytG|t>SV6j1F4&t*AJpisiXdjZww+>c-mX_=~^h*!= zLwbEZ+WtHGcLIMuPH?1Y;m#;!tU+)5#qfwd#_Enh?x8nw@Ac%aP}CM5TirP)!x>>X z8m_VE>KvD{oQfMY+~*ahRqyl-`Nnnq5xC$kH7y>{wc-5mg(ZY!1H>&6ScW1q3A$U6 z8}4X9Zv))PBG7nU^si6)@#@39GnN5>wP>Off;PXKEUl+7o725 zBt2kiNQHpBEEigWJkjs-fSxc`Z{NA;=|jK1f%ZusyNPi=igDKC^D63pE2_5b4?eh$ z(n5TJW=R+ylAw@;z?+J9($Vn`KNn5Y=jLsCI{G~2?@(UMGk7oYw-ril@%+s#W%jE) zzo%lky`e4G)A|Bh-YpqrPHZ0V34AO^7hgn#0EO@2b*(}ynni1xlipYBE5(f+k{PUw#dGktWs zy@K~{vi7d-+F+^BN^fof+25Eks>0KkzABSq;sU21Fs1}o;9UssfU3Ym0>)fGvq8IR zTGMsWzY%SHgDXH=i;)NPq2s`Awe;p@g1On+v*yY%Pg-E{N`yQfuqc>kSg}G_1$+v2 zBJoOvz^CZk!v&hWT=2->K1bU&T$ge04fKot{*n4M{8jfm;s)b^uK3Q8)$PB|H(x}B z7}N%=RL+%@&sdoUd+yuni{O>k zN+xImGD-+4p!@JileL8xq8gW?RRJHmyS%VmCi8m|DJSc-T+HpocLDPt%`e~vaQK{X z7`87S#qP#u0P4jCzuv+CK@Sv-6hChnp$6YjzVA062`<+d} z&S;#;zT>D`^<~x0INNT~xBw|hX;ljX56ex6g9T1gKw<{r13yuAs;8Pj9mE1$VEWL z*nrfQi1PGU3w6;p(iJ|#^)v8(0b@5$w`YUQwmsMWhP!5w{Z04LyK&eBw=B9p9(Ug7 zuDI$an{8tx*nyN9SO5s?fC5Q+Dg^%#a!&-)?=OjU3-#bBEr)D>V2nNmyqj}%dmdHU zo||ZX^qTwl6n6YuaXID{7hG9y#aoU}ab15n(-~(uJc^BdG1c)b7Y8$N{%7&FN^I~O zhUp9-aV_ZSJqd>gdmT=x+HnQ(qiY05+yn6ht zF%XAJg#|zggP=7CFSs?JCW#in$52>z$o?hZQJjP5^>x6!T?ccecSnh}GsQ6v%*Ot$ z>q_JkHa7K2>&*$)@;JvMWP(>_+FM-p51Acf_z{n#i_}Q_@n;>;4(|vU;IL}RRYx39 z=x!lS;tdFjDa89~qnmaB_7}Jq(Ci7oo}=>wuiR~u{GP@g*K)f{IqZ$fHgR!{lHU!; z-WVNN7?|X6a=Z=lUXvOaa9tx;A#cT|x|Sx&g{5585$GSuSe(>dPyw@O!*Xliro!ru z-u3oBTYqnAy%}z8OZzHHmGZuq{SAgprG1m8`n>ZoO||F5295oj37RDLfapbtW zSV1OHwqU?3N0WW1kSGFTO9Ir31Mp1UuunCI36m-5`RBTPISbFsSZ;>7zcK|4S0 zZ}4Vcin8!XDuH_67-HD4mzD-zcz;6b+6Fx71* zZK2gS&MS8otF+E{aojA*ygi^}63r`42+3Mvw1$)lh}=|gX?&2tDinCMTE8q{6-U9-?8)mfb4Z}Yf{AHIPf-bw!t>)fL3-xw8y22c2x3EUe{3Vq=}a#Rh(c*g2q z6(Jw(KP+%0-Hr0bD}durRd5k|-6XF*<4CghOtniR1N}wUpjIGdQc#(If{@duskQ&- zSA3@HV_Ywwja1c{_6X#(`SRg{DTxj-cRY`%`T|iiquaIUkCTA;0p>X$&nWRs2|mAw z&#K_?()P;S%LXnEq4d)96CEqt<@pUbx-1 zBQg@90wjh|f{PGsC3R#_EShkhYA%uAQG4!>cK|;KFmK1b@qmAqD!gM>eSGz&t&uQ} z$6LFn*l)1eRqW{;aki0DbEC|!otPu2so?xHjy{H`OqfY5*2i;*h_gjcFiW1k=g*hX zKE+XUac=_JZ^gQ#u~tbj=?e_}c<&1HC9Sl=GxSf(fnek+j6kYFis;n9#KF*&!<9$? zNUs^JSCkcEt)L%;PoMj9JK8J)939}~0S?(tJ@~9*S`89!bXTZ7WuJF~)sxbnWbTY( zI%ofBNl16B6l0Bs;N5fOHNblS@D>1`+6Pa%Zk_Dx>ua1@ zrVkb;9eL1n9ktXRQ12YNFoKSdmp-?hwoL)NZbkjh+E3jJk1K`j$P-jzJ&INVY~?ciD>^MU}4L#NF`CSQw#LL zy9yesM~pFb{1LskdqsP=eFIZdY;C{8sVFd?$>DYvOVwQJt)XL~LeuMlZ!@440t7+V07d~3mgJ6aXtnG+>SIw3F_Hbja=2{{>tgl@qAo^56n zy4thX$Tp;$^;kT|;JK%0ogXcb#Z-Ulim2}DmSeS#wsv8U6^G(47qJzR-K`Zbu&}A) zd2yzQJsIFH6jXuDNFExW_KJB<3qiIHr8lSh&;=o9gTIy4ExJy&yA%v30&s%>_mqmS zEKj#~ZcPOHT2Rs8U({iUd4>fKT@(Dk!eGu7;4Zq^fqr$MUn2llf_|A* z*o(+{@3EdO!1lcduVSv$rfs?D@0vDErt?s|f3tcf*iHN2zh>duuYVX0Bj(l|vT(d3 z(HC3@%D8{C1$p?&p_uyvL>j=+YS8D}vp0#x>0Ih`+#?$QPQ_%8LxoaFT&ZN7<$KhL z`gfG<_7l>|Qmdz^y5rqAcb4Imge~nAhlzlOy^>_X@&u7DR$)Fgd0pg}|R!PJkScut9|Au|-?E)X=_t;BW&;DT)_`vGE6R<(w?(3M}9{@WUuy4csex$HzZMd|Ia#+ZKW%1?Gi*ea7q0Xg`Pok5u5M1Zl7Cxdu1E$<9k-XWos!3|Z7 za=m;4OaodHXxsf0V4no+nSdPu*e?P0Ge;+v%k1B_l}d8h85_s2^Ly9hPnS`e{i(ZB zQGM|HY}=X)eRtz4b9nXOIj7xluxUsd#3#a+B7`hURIW^a=6D%k+zo?oQ{AFg%BLdP zKypY7xZeY=H1^Mp)tUc@b?jij9+s)}X6uht$)4$!bcLFKu3}@fvZk5Q{c{jkd)-~X z&{^cTlaG&Tnal@I8N^m$e}lV`mPG;OTp~LE8%0rl3@)9NpXJDDBso=kw$%+>h_{Xg zEKnqmwOCu!Ug#z6zY9o0}dcat~CVBk4ic#}iR@DX-cHCK{ zO9~$-nXNyg{*S|eRaYT?U^Nr{i)})6hA>K{Z8z?ebqB3~(3+9Ekp&Qw4_ww+GLbhU46km}I-q;k8<}Cdb-3 z!`hoa?t{&2j{XHAQjRu6g3gtmRrHenkX$!5|w+9`+qGWwB;wuhtb zk5shFQ_00?C73R(os<^GtS?Mo#-li$=i;-dj3tyLqOwFzQR=`H0%5QXI0OB92J*iI z$q?8~3B~~!G@Vj@w7mc#&p~thL}!Sge$( zgTMYuMHJmbv{8GuqaAJUM|&jm$)~A@&dhW$v-`z4;`n&fnzEl_qWYw7i=+F#onmix zX}KJinkz;X0d>=dN|ewFEjBk)Fw z1;nsqksj-{c9AC%{4oLZrT{K&;Ez@n{0vBtIb6!g$9Wav4)Ls;Yprd6ldZM(EUND5 z8)N^;b*PsMukuW@G4HU(<#~bJt{oHMuOB21N!Lc;L7C{wRapQJ18D^m5V<7{gY$g+ z%F}=`xri|#{Voz?@+#>;yyUQ&7svK&Rhj=V@s_a{Kc;x84J_LHe%kVN{UVFwfQ)b9EY*^4J%#@%>EtAjpA84`t#~kdG7} zFe~WOP;q^l2bb^DpF3&KH0`@u1(@T|SECBmv?05c9SpFy8*+{Z?@*k+smP$QNgzA=xDkA{vD>$y)R zx6k2}uKEd(MU@%VA30`W$Ddt1Y7jlcu048u5ogujyj zvm4_K9YefhTe`J2XK%v7w^RFLooh_bwMRO`>K2EJ7ijs_Yo4gE>sznSDYxz#-@hT< zx{%ru^hAdA)3a!cYyr|w--P{@w%A!@zNBUs-~f5YEd2?Crmw#INRM}&H2bsGVu{Ut z{m$_IJ7rfUv#HOKG|Cgke-ZOL#^Ud2D;;eqFc#Y}{<$@3)X){nE7c`R99v42R|N~4 zUaVaTxf7>_Ct(s7XvFTv>lQJcXd@1PQ{OnWQKtfXm)?ZqxAjqdS>q3-1uM)i{MLT; z>&-X~8>@c;+(Pix+Um0T=71oktW9`Czi@k1QoP=B9tMGtDubANG%x z_!;N{{eF6p*ocnF{O32n5OO5;rXbGZB9UJvSw(n_;><50K|2CNbFsNTKqx-k~j zYOZ}SMdIU&i`fI4qL?8r@0So8V+>5i=%pkt=$Plz_vo?}vh(-2&@p&hEhaY7|lGh-%~9xfm4(6qgxW}YF!l%@(5;%BH6(nC2;58~k~_$}o)J*i`# z_3n}W+w_HvBl0k?$GD^MD3jgNxT{_nX}`)fX6ak!7xol$rLJICsWg_G1%2RDlRr3u z&>bY9;KZinpKQcua>!R2g>WLdw*wKp2Sle5%4&7J_XGB4xX4F;7vR51M?4MxkE==& zWqHiVZC5ij1t^g_v|Jm)df42<6?szcYNs4{l)A1TR3ABPdDCSeWf;!H;t|S4e2-I50=my+=R^}kmt}X<+I!~%pM@Ad z+N(5!l4kpx8!8eN}s2YTmpjp@JmWm=?SO!L!QCJ=prKINadR|CzrDMe0%5rk8C~_a(GZnrEeo1r}2_t-o8N-Z|XXN zI}QXNh{GE6Rdm4?K$6>#WzZ0WuHmPmMU=Z-tMmR1&r%N1e%xDtzU|iy>z;+G+t%xu z)@uporZ{GI4mZuDsbCdrs_JoUrkk1NogRw)K`3udpJ%LuA}B^uEZoUiA{5r}k2CFl zhk7qK$Me$!3A#WiXCmy&*20pNM1Hnaq Y%FzEYDENJ>1~rIkmy7 Date: Mon, 26 Oct 2020 09:59:16 +0100 Subject: [PATCH 100/275] Somehow forgot to delete VertexShaderGeneratorVulkan.cpp --- GPU/Vulkan/VertexShaderGeneratorVulkan.cpp | 654 --------------------- 1 file changed, 654 deletions(-) delete mode 100644 GPU/Vulkan/VertexShaderGeneratorVulkan.cpp diff --git a/GPU/Vulkan/VertexShaderGeneratorVulkan.cpp b/GPU/Vulkan/VertexShaderGeneratorVulkan.cpp deleted file mode 100644 index 03b9ade092..0000000000 --- a/GPU/Vulkan/VertexShaderGeneratorVulkan.cpp +++ /dev/null @@ -1,654 +0,0 @@ -// Copyright (c) 2012- PPSSPP Project. - -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 2.0 or later versions. - -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License 2.0 for more details. - -// A copy of the GPL 2.0 should have been included with the program. -// If not, see http://www.gnu.org/licenses/ - -// Official git repository and contact information can be found at -// https://github.com/hrydgard/ppsspp and http://www.ppsspp.org/. - -#include -#include -#include - -#include "Common/GPU/OpenGL/GLFeatures.h" - -#if defined(_WIN32) && defined(_DEBUG) -#include "Common/CommonWindows.h" -#endif - -#include "Common/StringUtils.h" -#include "Common/GPU/Vulkan/VulkanLoader.h" -#include "Core/Config.h" -#include "GPU/ge_constants.h" -#include "GPU/GPUState.h" -#include "GPU/Common/ShaderId.h" -#include "GPU/Common/VertexDecoderCommon.h" -#include "GPU/Vulkan/VertexShaderGeneratorVulkan.h" -#include "GPU/Vulkan/PipelineManagerVulkan.h" -#include "GPU/Vulkan/ShaderManagerVulkan.h" - -static const char *vulkan_glsl_preamble = -"#version 450\n" -"#extension GL_ARB_separate_shader_objects : enable\n" -"#extension GL_ARB_shading_language_420pack : enable\n" -"#define splat3(x) vec3(x)\n\n"; - -// "Varying" layout - must match fragment shader -// color0 = 0 -// color1 = 1 -// texcoord = 2 -// fog = 3 - -#undef WRITE - -#define WRITE p+=sprintf - -static const char * const boneWeightDecl[9] = { - "#ERROR#", - "layout(location = 3) in float w1;\n", - "layout(location = 3) in vec2 w1;\n", - "layout(location = 3) in vec3 w1;\n", - "layout(location = 3) in vec4 w1;\n", - "layout(location = 3) in vec4 w1;\nlayout(location = 4) in float w2;\n", - "layout(location = 3) in vec4 w1;\nlayout(location = 4) in vec2 w2;\n", - "layout(location = 3) in vec4 w1;\nlayout(location = 4) in vec3 w2;\n", - "layout(location = 3) in vec4 w1;\nlayout(location = 4) in vec4 w2;\n", -}; - -// Depth range and viewport -// -// After the multiplication with the projection matrix, we have a 4D vector in clip space. -// In OpenGL, Z is from -1 to 1, while in D3D, Z is from 0 to 1. -// PSP appears to use the OpenGL convention. As Z is from -1 to 1, and the viewport is represented -// by a center and a scale, to find the final Z value, all we need to do is to multiply by ZScale and -// add ZCenter - these are properly scaled to directly give a Z value in [0, 65535]. -// -// z = vec.z * ViewportZScale + ViewportZCenter; -// -// That will give us the final value between 0 and 65535, which we can simply floor to simulate -// the limited precision of the PSP's depth buffer. Then we convert it back: -// z = floor(z); -// -// vec.z = (z - ViewportZCenter) / ViewportZScale; -// -// Now, the regular machinery will take over and do the calculation again. -// -// All this above is for full transform mode. -// In through mode, the Z coordinate just goes straight through and there is no perspective division. -// We simulate this of course with pretty much an identity matrix. Rounding Z becomes very easy. -// -// TODO: Skip all this if we can actually get a 16-bit depth buffer along with stencil, which -// is a bit of a rare configuration, although quite common on mobile. - -bool GenerateVertexShaderVulkanGLSL(const VShaderID &id, char *buffer, std::string *errorString) { - char *p = buffer; - - WRITE(p, "%s", vulkan_glsl_preamble); - - bool highpFog = false; - bool highpTexcoord = false; - - bool isModeThrough = id.Bit(VS_BIT_IS_THROUGH); - bool lmode = id.Bit(VS_BIT_LMODE); - bool doTexture = id.Bit(VS_BIT_DO_TEXTURE); - bool doTextureTransform = id.Bit(VS_BIT_DO_TEXTURE_TRANSFORM); - - GETexMapMode uvGenMode = static_cast(id.Bits(VS_BIT_UVGEN_MODE, 2)); - - // this is only valid for some settings of uvGenMode - GETexProjMapMode uvProjMode = static_cast(id.Bits(VS_BIT_UVPROJ_MODE, 2)); - bool doShadeMapping = uvGenMode == GE_TEXMAP_ENVIRONMENT_MAP; - bool doFlatShading = id.Bit(VS_BIT_FLATSHADE); - - bool useHWTransform = id.Bit(VS_BIT_USE_HW_TRANSFORM); - bool hasColor = id.Bit(VS_BIT_HAS_COLOR) || !useHWTransform; - bool hasNormal = id.Bit(VS_BIT_HAS_NORMAL) && useHWTransform; - bool hasTexcoord = id.Bit(VS_BIT_HAS_TEXCOORD) || !useHWTransform; - bool enableFog = id.Bit(VS_BIT_ENABLE_FOG); - bool flipNormal = id.Bit(VS_BIT_NORM_REVERSE); - int ls0 = id.Bits(VS_BIT_LS0, 2); - int ls1 = id.Bits(VS_BIT_LS1, 2); - bool enableBones = id.Bit(VS_BIT_ENABLE_BONES); - bool enableLighting = id.Bit(VS_BIT_LIGHTING_ENABLE); - int matUpdate = id.Bits(VS_BIT_MATERIAL_UPDATE, 3); - - bool doBezier = id.Bit(VS_BIT_BEZIER) && !enableBones && useHWTransform; - bool doSpline = id.Bit(VS_BIT_SPLINE) && !enableBones && useHWTransform; - - if ((doBezier || doSpline) && !hasNormal) { - // Bad usage. - *errorString = "Invalid flags - tess requires normal."; - return false; - } - - bool hasColorTess = id.Bit(VS_BIT_HAS_COLOR_TESS); - bool hasTexcoordTess = id.Bit(VS_BIT_HAS_TEXCOORD_TESS); - bool hasNormalTess = id.Bit(VS_BIT_HAS_NORMAL_TESS); - bool flipNormalTess = id.Bit(VS_BIT_NORM_REVERSE_TESS); - - WRITE(p, "\n"); - WRITE(p, "layout (std140, set = 0, binding = 3) uniform baseVars {\n%s};\n", ub_baseStr); - if (enableLighting || doShadeMapping) - WRITE(p, "layout (std140, set = 0, binding = 4) uniform lightVars {\n%s};\n", ub_vs_lightsStr); - if (enableBones) - WRITE(p, "layout (std140, set = 0, binding = 5) uniform boneVars {\n%s};\n", ub_vs_bonesStr); - - const char *shading = doFlatShading ? "flat " : ""; - - DoLightComputation doLight[4] = { LIGHT_OFF, LIGHT_OFF, LIGHT_OFF, LIGHT_OFF }; - if (useHWTransform) { - int shadeLight0 = doShadeMapping ? ls0 : -1; - int shadeLight1 = doShadeMapping ? ls1 : -1; - for (int i = 0; i < 4; i++) { - if (i == shadeLight0 || i == shadeLight1) - doLight[i] = LIGHT_SHADE; - if (id.Bit(VS_BIT_LIGHTING_ENABLE) && id.Bit(VS_BIT_LIGHT0_ENABLE + i)) - doLight[i] = LIGHT_FULL; - } - } - - int numBoneWeights = 0; - int boneWeightScale = id.Bits(VS_BIT_WEIGHT_FMTSCALE, 2); - if (enableBones) { - numBoneWeights = 1 + id.Bits(VS_BIT_BONES, 3); - WRITE(p, "%s", boneWeightDecl[numBoneWeights]); - } - - if (useHWTransform) - WRITE(p, "layout (location = %d) in vec3 position;\n", (int)PspAttributeLocation::POSITION); - else - // we pass the fog coord in w - WRITE(p, "layout (location = %d) in vec4 position;\n", (int)PspAttributeLocation::POSITION); - - if (useHWTransform && hasNormal) - WRITE(p, "layout (location = %d) in vec3 normal;\n", (int)PspAttributeLocation::NORMAL); - - bool texcoordInVec3 = false; - if (doTexture && hasTexcoord) { - if (!useHWTransform && doTextureTransform && !isModeThrough) { - WRITE(p, "layout (location = %d) in vec3 texcoord;\n", (int)PspAttributeLocation::TEXCOORD); - texcoordInVec3 = true; - } else - WRITE(p, "layout (location = %d) in vec2 texcoord;\n", (int)PspAttributeLocation::TEXCOORD); - } - if (hasColor) { - WRITE(p, "layout (location = %d) in vec4 color0;\n", (int)PspAttributeLocation::COLOR0); - if (lmode && !useHWTransform) // only software transform supplies color1 as vertex data - WRITE(p, "layout (location = %d) in vec3 color1;\n", (int)PspAttributeLocation::COLOR1); - } - - WRITE(p, "layout (location = 1) %sout vec4 v_color0;\n", shading); - if (lmode) { - WRITE(p, "layout (location = 2) %sout vec3 v_color1;\n", shading); - } - - if (doTexture) { - WRITE(p, "layout (location = 0) out vec3 v_texcoord;\n"); - } - - if (enableFog) { - // See the fragment shader generator - WRITE(p, "layout (location = 3) out float v_fogdepth;\n"); - } - - // See comment above this function (GenerateVertexShader). - if (!isModeThrough && gstate_c.Supports(GPU_ROUND_DEPTH_TO_16BIT)) { - // Apply the projection and viewport to get the Z buffer value, floor to integer, undo the viewport and projection. - WRITE(p, "\nvec4 depthRoundZVP(vec4 v) {\n"); - WRITE(p, " float z = v.z / v.w;\n"); - WRITE(p, " z = z * u_depthRange.x + u_depthRange.y;\n"); - WRITE(p, " z = floor(z);\n"); - WRITE(p, " z = (z - u_depthRange.z) * u_depthRange.w;\n"); - WRITE(p, " return vec4(v.x, v.y, z * v.w, v.w);\n"); - WRITE(p, "}\n\n"); - } - - // Hardware tessellation - if (doBezier || doSpline) { - WRITE(p, "struct TessData {\n"); - WRITE(p, " vec4 pos;\n"); - WRITE(p, " vec4 uv;\n"); - WRITE(p, " vec4 color;\n"); - WRITE(p, "};\n"); - WRITE(p, "layout (std430, set = 0, binding = 6) readonly buffer s_tess_data {\n"); - WRITE(p, " TessData data[];\n"); - WRITE(p, "} tess_data;\n"); - - WRITE(p, "struct TessWeight {\n"); - WRITE(p, " vec4 basis;\n"); - WRITE(p, " vec4 deriv;\n"); - WRITE(p, "};\n"); - WRITE(p, "layout (std430, set = 0, binding = 7) readonly buffer s_tess_weights_u {\n"); - WRITE(p, " TessWeight data[];\n"); - WRITE(p, "} tess_weights_u;\n"); - WRITE(p, "layout (std430, set = 0, binding = 8) readonly buffer s_tess_weights_v {\n"); - WRITE(p, " TessWeight data[];\n"); - WRITE(p, "} tess_weights_v;\n"); - - for (int i = 2; i <= 4; i++) { - // Define 3 types vec2, vec3, vec4 - WRITE(p, "vec%d tess_sample(in vec%d points[16], mat4 weights) {\n", i, i); - WRITE(p, " vec%d pos = vec%d(0.0);\n", i, i); - for (int v = 0; v < 4; ++v) { - for (int u = 0; u < 4; ++u) { - WRITE(p, " pos += weights[%i][%i] * points[%i];\n", v, u, v * 4 + u); - } - } - WRITE(p, " return pos;\n"); - WRITE(p, "}\n"); - } - - WRITE(p, "struct Tess {\n"); - WRITE(p, " vec3 pos;\n"); - if (doTexture) - WRITE(p, " vec2 tex;\n"); - WRITE(p, " vec4 col;\n"); - if (hasNormalTess) - WRITE(p, " vec3 nrm;\n"); - WRITE(p, "};\n"); - - WRITE(p, "void tessellate(out Tess tess) {\n"); - WRITE(p, " ivec2 point_pos = ivec2(position.z, normal.z)%s;\n", doBezier ? " * 3" : ""); - WRITE(p, " ivec2 weight_idx = ivec2(position.xy);\n"); - // Load 4x4 control points - WRITE(p, " vec3 _pos[16];\n"); - WRITE(p, " vec2 _tex[16];\n"); - WRITE(p, " vec4 _col[16];\n"); - WRITE(p, " int index;\n"); - for (int i = 0; i < 4; i++) { - for (int j = 0; j < 4; j++) { - WRITE(p, " index = (%i + point_pos.y) * int(u_spline_counts) + (%i + point_pos.x);\n", i, j); - WRITE(p, " _pos[%i] = tess_data.data[index].pos.xyz;\n", i * 4 + j); - if (doTexture && hasTexcoordTess) - WRITE(p, " _tex[%i] = tess_data.data[index].uv.xy;\n", i * 4 + j); - if (hasColorTess) - WRITE(p, " _col[%i] = tess_data.data[index].color;\n", i * 4 + j); - } - } - - // Basis polynomials as weight coefficients - WRITE(p, " vec4 basis_u = tess_weights_u.data[weight_idx.x].basis;\n"); - WRITE(p, " vec4 basis_v = tess_weights_v.data[weight_idx.y].basis;\n"); - WRITE(p, " mat4 basis = outerProduct(basis_u, basis_v);\n"); - - // Tessellate - WRITE(p, " tess.pos = tess_sample(_pos, basis);\n"); - if (doTexture) { - if (hasTexcoordTess) - WRITE(p, " tess.tex = tess_sample(_tex, basis);\n"); - else - WRITE(p, " tess.tex = normal.xy;\n"); - } - if (hasColorTess) - WRITE(p, " tess.col = tess_sample(_col, basis);\n"); - else - WRITE(p, " tess.col = u_matambientalpha;\n"); - if (hasNormalTess) { - // Derivatives as weight coefficients - WRITE(p, " vec4 deriv_u = tess_weights_u.data[weight_idx.x].deriv;\n"); - WRITE(p, " vec4 deriv_v = tess_weights_v.data[weight_idx.y].deriv;\n"); - - WRITE(p, " vec3 du = tess_sample(_pos, outerProduct(deriv_u, basis_v));\n"); - WRITE(p, " vec3 dv = tess_sample(_pos, outerProduct(basis_u, deriv_v));\n"); - WRITE(p, " tess.nrm = normalize(cross(du, dv));\n"); - } - WRITE(p, "}\n"); - } - - WRITE(p, "void main() {\n"); - - if (!useHWTransform) { - // Simple pass-through of vertex data to fragment shader - if (doTexture) { - if (texcoordInVec3) { - WRITE(p, " v_texcoord = texcoord;\n"); - } else { - WRITE(p, " v_texcoord = vec3(texcoord, 1.0);\n"); - } - } - if (hasColor) { - WRITE(p, " v_color0 = color0;\n"); - if (lmode) - WRITE(p, " v_color1 = color1;\n"); - } else { - WRITE(p, " v_color0 = u_matambientalpha;\n"); - if (lmode) - WRITE(p, " v_color1 = vec3(0.0);\n"); - } - if (enableFog) { - WRITE(p, " v_fogdepth = position.w;\n"); - } - if (isModeThrough) { - WRITE(p, " vec4 outPos = u_proj_through * vec4(position.xyz, 1.0);\n"); - } else { - // The viewport is used in this case, so need to compensate for that. - if (gstate_c.Supports(GPU_ROUND_DEPTH_TO_16BIT)) { - WRITE(p, " vec4 outPos = depthRoundZVP(u_proj * vec4(position.xyz, 1.0));\n"); - } else { - WRITE(p, " vec4 outPos = u_proj * vec4(position.xyz, 1.0);\n"); - } - } - } else { - // Step 1: World Transform / Skinning - if (!enableBones) { - if (doBezier || doSpline) { - // Hardware tessellation - WRITE(p, " Tess tess;\n"); - WRITE(p, " tessellate(tess);\n"); - - WRITE(p, " vec3 worldpos = (vec4(tess.pos.xyz, 1.0) * u_world).xyz;\n"); - if (hasNormalTess) { - WRITE(p, " mediump vec3 worldnormal = normalize((vec4(%stess.nrm, 0.0) * u_world).xyz);\n", flipNormalTess ? "-" : ""); - } else { - WRITE(p, " mediump vec3 worldnormal = vec3(0.0, 0.0, 1.0);\n"); - } - } else { - // No skinning, just standard T&L. - WRITE(p, " vec3 worldpos = (vec4(position.xyz, 1.0) * u_world).xyz;\n"); - if (hasNormal) - WRITE(p, " mediump vec3 worldnormal = normalize((vec4(%snormal, 0.0) * u_world).xyz);\n", flipNormal ? "-" : ""); - else - WRITE(p, " mediump vec3 worldnormal = vec3(0.0, 0.0, 1.0);\n"); - } - } else { - static const char *rescale[4] = { "", " * 1.9921875", " * 1.999969482421875", "" }; // 2*127.5f/128.f, 2*32767.5f/32768.f, 1.0f}; - const char *factor = rescale[boneWeightScale]; - - static const char * const boneWeightAttr[8] = { - "w1.x", "w1.y", "w1.z", "w1.w", - "w2.x", "w2.y", "w2.z", "w2.w", - }; - - WRITE(p, " mat3x4 skinMatrix = w1.x * u_bone0"); - if (numBoneWeights > 1) { - for (int i = 1; i < numBoneWeights; i++) { - WRITE(p, " + %s * u_bone%d", boneWeightAttr[i], i); - } - } - - WRITE(p, ";\n"); - - WRITE(p, " vec3 skinnedpos = (vec4(position, 1.0) * skinMatrix).xyz %s;\n", factor); - WRITE(p, " vec3 worldpos = (vec4(skinnedpos, 1.0) * u_world).xyz;\n"); - - if (hasNormal) { - WRITE(p, " mediump vec3 skinnednormal = (vec4(%snormal, 0.0) * skinMatrix).xyz %s;\n", flipNormal ? "-" : "", factor); - } else { - WRITE(p, " mediump vec3 skinnednormal = (vec4(0.0, 0.0, %s1.0, 0.0) * skinMatrix).xyz %s;\n", flipNormal ? "-" : "", factor); - } - WRITE(p, " mediump vec3 worldnormal = normalize((vec4(skinnednormal, 0.0) * u_world).xyz);\n"); - } - - WRITE(p, " vec4 viewPos = vec4((vec4(worldpos, 1.0) * u_view).xyz, 1.0);\n"); - - // Final view and projection transforms. - if (gstate_c.Supports(GPU_ROUND_DEPTH_TO_16BIT)) { - WRITE(p, " vec4 outPos = depthRoundZVP(u_proj * viewPos);\n"); - } else { - WRITE(p, " vec4 outPos = u_proj * viewPos;\n"); - } - - // TODO: Declare variables for dots for shade mapping if needed. - - const char *ambientStr = ((matUpdate & 1) && hasColor) ? "color0" : "u_matambientalpha"; - const char *diffuseStr = ((matUpdate & 2) && hasColor) ? "color0.rgb" : "u_matdiffuse"; - const char *specularStr = ((matUpdate & 4) && hasColor) ? "color0.rgb" : "u_matspecular.rgb"; - if (doBezier || doSpline) { - // TODO: Probably, should use hasColorTess but FF4 has a problem with drawing the background. - ambientStr = (matUpdate & 1) && hasColor ? "tess.col" : "u_matambientalpha"; - diffuseStr = (matUpdate & 2) && hasColor ? "tess.col.rgb" : "u_matdiffuse"; - specularStr = (matUpdate & 4) && hasColor ? "tess.col.rgb" : "u_matspecular.rgb"; - } - - bool diffuseIsZero = true; - bool specularIsZero = true; - bool distanceNeeded = false; - - bool anySpots = false; - if (enableLighting) { - WRITE(p, " lowp vec4 lightSum0 = u_ambient * %s + vec4(u_matemissive, 0.0);\n", ambientStr); - - for (int i = 0; i < 4; i++) { - GELightType type = static_cast(id.Bits(VS_BIT_LIGHT0_TYPE + 4 * i, 2)); - GELightComputation comp = static_cast(id.Bits(VS_BIT_LIGHT0_COMP + 4 * i, 2)); - if (doLight[i] != LIGHT_FULL) - continue; - diffuseIsZero = false; - if (comp == GE_LIGHTCOMP_BOTH) - specularIsZero = false; - if (type != GE_LIGHTTYPE_DIRECTIONAL) - distanceNeeded = true; - if (type == GE_LIGHTTYPE_SPOT || type == GE_LIGHTTYPE_UNKNOWN) - anySpots = true; - } - - if (!specularIsZero) { - WRITE(p, " lowp vec3 lightSum1 = vec3(0.0);\n"); - } - if (!diffuseIsZero) { - WRITE(p, " vec3 toLight;\n"); - WRITE(p, " lowp vec3 diffuse;\n"); - } - if (distanceNeeded) { - WRITE(p, " float distance;\n"); - WRITE(p, " lowp float lightScale;\n"); - } - WRITE(p, " mediump float ldot;\n"); - if (anySpots) { - WRITE(p, " lowp float angle;\n"); - } - } - - // Calculate lights if needed. If shade mapping is enabled, lights may need to be - // at least partially calculated. - for (int i = 0; i < 4; i++) { - if (doLight[i] != LIGHT_FULL) - continue; - - GELightType type = static_cast(id.Bits(VS_BIT_LIGHT0_TYPE + 4 * i, 2)); - GELightComputation comp = static_cast(id.Bits(VS_BIT_LIGHT0_COMP + 4 * i, 2)); - - if (type == GE_LIGHTTYPE_DIRECTIONAL) { - // We prenormalize light positions for directional lights. - WRITE(p, " toLight = u_lightpos%d;\n", i); - } else { - WRITE(p, " toLight = u_lightpos%d - worldpos;\n", i); - WRITE(p, " distance = length(toLight);\n"); - WRITE(p, " toLight /= distance;\n"); - } - - bool doSpecular = comp == GE_LIGHTCOMP_BOTH; - bool poweredDiffuse = comp == GE_LIGHTCOMP_ONLYPOWDIFFUSE; - - WRITE(p, " ldot = dot(toLight, worldnormal);\n"); - if (poweredDiffuse) { - // pow(0.0, 0.0) may be undefined, but the PSP seems to treat it as 1.0. - // Seen in Tales of the World: Radiant Mythology (#2424.) - WRITE(p, " if (u_matspecular.a <= 0.0) {\n"); - WRITE(p, " ldot = 1.0;\n"); - WRITE(p, " } else {\n"); - WRITE(p, " ldot = pow(max(ldot, 0.0), u_matspecular.a);\n"); - WRITE(p, " }\n"); - } - - const char *timesLightScale = " * lightScale"; - - // Attenuation - switch (type) { - case GE_LIGHTTYPE_DIRECTIONAL: - timesLightScale = ""; - break; - case GE_LIGHTTYPE_POINT: - WRITE(p, " lightScale = clamp(1.0 / dot(u_lightatt%d, vec3(1.0, distance, distance*distance)), 0.0, 1.0);\n", i); - break; - case GE_LIGHTTYPE_SPOT: - case GE_LIGHTTYPE_UNKNOWN: - WRITE(p, " angle = length(u_lightdir%d) == 0.0 ? 0.0 : dot(normalize(u_lightdir%d), toLight);\n", i, i); - WRITE(p, " if (angle >= u_lightangle_spotCoef%d.x) {\n", i); - WRITE(p, " lightScale = clamp(1.0 / dot(u_lightatt%d, vec3(1.0, distance, distance*distance)), 0.0, 1.0) * (u_lightangle_spotCoef%d.y <= 0.0 ? 1.0 : pow(angle, u_lightangle_spotCoef%d.y));\n", i, i, i); - WRITE(p, " } else {\n"); - WRITE(p, " lightScale = 0.0;\n"); - WRITE(p, " }\n"); - break; - default: - // ILLEGAL - break; - } - - WRITE(p, " diffuse = (u_lightdiffuse%d * %s) * max(ldot, 0.0);\n", i, diffuseStr); - if (doSpecular) { - WRITE(p, " if (ldot >= 0.0) {\n"); - WRITE(p, " ldot = dot(normalize(toLight + vec3(0.0, 0.0, 1.0)), worldnormal);\n"); - WRITE(p, " if (u_matspecular.a <= 0.0) {\n"); - WRITE(p, " ldot = 1.0;\n"); - WRITE(p, " } else {\n"); - WRITE(p, " ldot = pow(max(ldot, 0.0), u_matspecular.a);\n"); - WRITE(p, " }\n"); - WRITE(p, " if (ldot > 0.0)\n"); - WRITE(p, " lightSum1 += u_lightspecular%d * %s * ldot %s;\n", i, specularStr, timesLightScale); - WRITE(p, " }\n"); - } - WRITE(p, " lightSum0.rgb += (u_lightambient%d * %s.rgb + diffuse)%s;\n", i, ambientStr, timesLightScale); - } - - if (enableLighting) { - // Sum up ambient, emissive here. - if (lmode) { - WRITE(p, " v_color0 = clamp(lightSum0, 0.0, 1.0);\n"); - // v_color1 only exists when lmode = 1. - if (specularIsZero) { - WRITE(p, " v_color1 = vec3(0.0);\n"); - } else { - WRITE(p, " v_color1 = clamp(lightSum1, 0.0, 1.0);\n"); - } - } else { - if (specularIsZero) { - WRITE(p, " v_color0 = clamp(lightSum0, 0.0, 1.0);\n"); - } else { - WRITE(p, " v_color0 = clamp(clamp(lightSum0, 0.0, 1.0) + vec4(lightSum1, 0.0), 0.0, 1.0);\n"); - } - } - } else { - // Lighting doesn't affect color. - if (hasColor) { - if (doBezier || doSpline) - WRITE(p, " v_color0 = tess.col;\n"); - else - WRITE(p, " v_color0 = color0;\n"); - } else { - WRITE(p, " v_color0 = u_matambientalpha;\n"); - } - if (lmode) { - WRITE(p, " v_color1 = vec3(0.0);\n"); - } - } - - bool scaleUV = !isModeThrough && (uvGenMode == GE_TEXMAP_TEXTURE_COORDS || uvGenMode == GE_TEXMAP_UNKNOWN); - - // Step 3: UV generation - if (doTexture) { - switch (uvGenMode) { - case GE_TEXMAP_TEXTURE_COORDS: // Scale-offset. Easy. - case GE_TEXMAP_UNKNOWN: // Not sure what this is, but Riviera uses it. Treating as coords works. - if (scaleUV) { - if (hasTexcoord) { - if (doBezier || doSpline) - WRITE(p, " v_texcoord = vec3(tess.tex.xy * u_uvscaleoffset.xy + u_uvscaleoffset.zw, 0.0);\n"); - else - WRITE(p, " v_texcoord = vec3(texcoord.xy * u_uvscaleoffset.xy, 0.0);\n"); - } else { - WRITE(p, " v_texcoord = vec3(0.0);\n"); - } - } else { - if (hasTexcoord) { - WRITE(p, " v_texcoord = vec3(texcoord.xy * u_uvscaleoffset.xy + u_uvscaleoffset.zw, 0.0);\n"); - } else { - WRITE(p, " v_texcoord = vec3(u_uvscaleoffset.zw, 0.0);\n"); - } - } - break; - - case GE_TEXMAP_TEXTURE_MATRIX: // Projection mapping. - { - std::string temp_tc; - switch (uvProjMode) { - case GE_PROJMAP_POSITION: // Use model space XYZ as source - temp_tc = "vec4(position.xyz, 1.0)"; - break; - case GE_PROJMAP_UV: // Use unscaled UV as source - { - // scaleUV is false here. - if (hasTexcoord) { - temp_tc = "vec4(texcoord.xy, 0.0, 1.0)"; - } else { - temp_tc = "vec4(0.0, 0.0, 0.0, 1.0)"; - } - } - break; - case GE_PROJMAP_NORMALIZED_NORMAL: // Use normalized transformed normal as source - if (hasNormal) - temp_tc = flipNormal ? "vec4(normalize(-normal), 1.0)" : "vec4(normalize(normal), 1.0)"; - else - temp_tc = "vec4(0.0, 0.0, 1.0, 1.0)"; - break; - case GE_PROJMAP_NORMAL: // Use non-normalized transformed normal as source - if (hasNormal) - temp_tc = flipNormal ? "vec4(-normal, 1.0)" : "vec4(normal, 1.0)"; - else - temp_tc = "vec4(0.0, 0.0, 1.0, 1.0)"; - break; - } - // Transform by texture matrix. XYZ as we are doing projection mapping. - WRITE(p, " v_texcoord = (%s * u_texmtx).xyz * vec3(u_uvscaleoffset.xy, 1.0);\n", temp_tc.c_str()); - } - break; - - case GE_TEXMAP_ENVIRONMENT_MAP: // Shade mapping - use dots from light sources. - { - std::string lightFactor0 = StringFromFormat("(length(u_lightpos%d) == 0.0 ? worldnormal.z : dot(normalize(u_lightpos%d), worldnormal))", ls0, ls0); - std::string lightFactor1 = StringFromFormat("(length(u_lightpos%d) == 0.0 ? worldnormal.z : dot(normalize(u_lightpos%d), worldnormal))", ls1, ls1); - WRITE(p, " v_texcoord = vec3(u_uvscaleoffset.xy * vec2(1.0 + %s, 1.0 + %s) * 0.5, 1.0);\n", lightFactor0.c_str(), lightFactor1.c_str()); - } - break; - - default: - // ILLEGAL - break; - } - } - - // Compute fogdepth - if (enableFog) - WRITE(p, " v_fogdepth = (viewPos.z + u_fogcoef.x) * u_fogcoef.y;\n"); - } - - if (!isModeThrough && gstate_c.Supports(GPU_SUPPORTS_VS_RANGE_CULLING)) { - WRITE(p, " vec3 projPos = outPos.xyz / outPos.w;\n"); - // Vertex range culling doesn't happen when depth is clamped, so only do this if in range. - WRITE(p, " if (u_cullRangeMin.w <= 0.0 || (projPos.z >= u_cullRangeMin.z && projPos.z <= u_cullRangeMax.z)) {\n"); - const char *outMin = "projPos.x < u_cullRangeMin.x || projPos.y < u_cullRangeMin.y || projPos.z < u_cullRangeMin.z"; - const char *outMax = "projPos.x > u_cullRangeMax.x || projPos.y > u_cullRangeMax.y || projPos.z > u_cullRangeMax.z"; - WRITE(p, " if (%s || %s) {\n", outMin, outMax); - WRITE(p, " outPos.xyzw = vec4(u_cullRangeMax.w);\n"); - WRITE(p, " }\n"); - WRITE(p, " }\n"); - } - WRITE(p, " gl_Position = outPos;\n"); - WRITE(p, " gl_PointSize = 1.0;\n"); - - if (gstate_c.Supports(GPU_NEEDS_Z_EQUAL_W_HACK)) { - // See comment in GPU_Vulkan.cpp. - WRITE(p, " if (gl_Position.z == gl_Position.w) gl_Position.z *= 0.999999;\n"); - } - WRITE(p, "}\n"); - return true; -} From 3831d2346d08ac7d7a8d64c39cb38593e2df3be4 Mon Sep 17 00:00:00 2001 From: nassau-tk Date: Tue, 27 Oct 2020 16:53:32 +0900 Subject: [PATCH 101/275] Modified "ltn1/3/5/7 .pgf" I tried made "ltn1.pgf/ltn3.pgf/ltn5.pgf/ltn7.pgf" files. --- assets/flash0/font/ltn1.pgf | Bin 63504 -> 49916 bytes assets/flash0/font/ltn3.pgf | Bin 71900 -> 54016 bytes assets/flash0/font/ltn5.pgf | Bin 76216 -> 51424 bytes assets/flash0/font/ltn7.pgf | Bin 84860 -> 53832 bytes 4 files changed, 0 insertions(+), 0 deletions(-) diff --git a/assets/flash0/font/ltn1.pgf b/assets/flash0/font/ltn1.pgf index 7b9dede4846140bc9af4ab5a2d39ea396f87254b..7217e164c015518f1410643ed7324e7b09b44638 100644 GIT binary patch literal 49916 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Ξ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 a0!Jvl0Im=o;sm%w*!gT3DnyC-4F4aoSLv_- diff --git a/assets/flash0/font/ltn5.pgf b/assets/flash0/font/ltn5.pgf index d12e9eccc3873da26f3159cff133e28536f90e6c..afae101542a0027ff006e53fefca7a341afefb54 100644 GIT binary patch literal 51424 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 JO;^D4{}0w|nz#S} literal 76216 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м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 JUl+>G{{}ILsf7Rl diff --git a/assets/flash0/font/ltn7.pgf b/assets/flash0/font/ltn7.pgf index ba9afda58c8761c3fc717dd26dee9f8348f91560..23a7cff954df5655f4c45ba77aeacbaec2dc1efe 100644 GIT binary patch literal 53832 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

6g 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 From eb5c22bbae04a9f2b4944325cb2960fd81b66ac4 Mon Sep 17 00:00:00 2001 From: shenweip <1037567878@qq.com> Date: Tue, 27 Oct 2020 19:50:27 +0800 Subject: [PATCH 102/275] SaveState:Don't register the event during Dostate. --- Core/HLE/sceUsbMic.cpp | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/Core/HLE/sceUsbMic.cpp b/Core/HLE/sceUsbMic.cpp index 39a6903f6d..a714be9230 100644 --- a/Core/HLE/sceUsbMic.cpp +++ b/Core/HLE/sceUsbMic.cpp @@ -74,6 +74,8 @@ static void __UsbMicAudioUpdate(u64 userdata, int cyclesLate) { isNeedInput = false; } else { u64 waitTimeus = (waitingThread.needSize - Microphone::availableAudioBufSize()) * 1000000 / 2 / waitingThread.sampleRate; + if(eventUsbMicAudioUpdate == -1) + eventUsbMicAudioUpdate = CoreTiming::RegisterEvent("UsbMicAudioUpdate", &__UsbMicAudioUpdate); CoreTiming::ScheduleEvent(usToCycles(waitTimeus), eventUsbMicAudioUpdate, userdata); } } else { @@ -138,13 +140,6 @@ void __UsbMicDoState(PointerWrap &p) { if (!audioBuf && numNeedSamples > 0) { audioBuf = new QueueBuf(numNeedSamples << 1); } - if(eventUsbMicAudioUpdate = -1) - eventUsbMicAudioUpdate = CoreTiming::RegisterEvent("UsbMicAudioUpdate", &__UsbMicAudioUpdate); - // Maybe also need to save the state of audioBuf. - if (waitingThreads.size() != 0 && p.mode == PointerWrap::MODE_READ) { - u64 waitTimeus = (waitingThreads[0].needSize - Microphone::availableAudioBufSize()) * 1000000 / 2 / waitingThreads[0].sampleRate; - CoreTiming::ScheduleEvent(usToCycles(waitTimeus), eventUsbMicAudioUpdate, waitingThreads[0].threadID); - } if (micState == 0) { if (Microphone::isMicStarted()) @@ -415,6 +410,8 @@ u32 __MicInputBlocking(u32 maxSamples, u32 sampleRate, u32 bufAddr) { waitTimeus = (size - Microphone::availableAudioBufSize()) * 1000000 / 2 / sampleRate; isNeedInput = true; } + if(eventUsbMicAudioUpdate == -1) + eventUsbMicAudioUpdate = CoreTiming::RegisterEvent("UsbMicAudioUpdate", &__UsbMicAudioUpdate); CoreTiming::ScheduleEvent(usToCycles(waitTimeus), eventUsbMicAudioUpdate, __KernelGetCurThread()); MicWaitInfo waitInfo = { __KernelGetCurThread(), bufAddr, size, sampleRate }; std::unique_lock lock(wtMutex); From 807de037bb2339c4dba89aa755f7d9cbfc56bad7 Mon Sep 17 00:00:00 2001 From: shenweip <1037567878@qq.com> Date: Tue, 27 Oct 2020 20:11:08 +0800 Subject: [PATCH 103/275] IMP sceKernelFindModuleByUID and sceKernelFindModuleByName. --- Core/ELF/ElfReader.cpp | 14 ++++++- Core/ELF/ElfReader.h | 6 +++ Core/HLE/sceKernelModule.cpp | 81 ++++++++++++++++++++++++++++++++---- 3 files changed, 91 insertions(+), 10 deletions(-) diff --git a/Core/ELF/ElfReader.cpp b/Core/ELF/ElfReader.cpp index 942236c68a..93863d7c6d 100644 --- a/Core/ELF/ElfReader.cpp +++ b/Core/ELF/ElfReader.cpp @@ -410,8 +410,10 @@ int ElfReader::LoadInto(u32 loadAddress, bool fromTop) for (int i = 0; i < header->e_phnum; i++) { const Elf32_Phdr *p = &segments[i]; if (p->p_type == PT_LOAD) { - if (p->p_vaddr < totalStart) + if (p->p_vaddr < totalStart) { totalStart = p->p_vaddr; + firstSegAlign = p->p_align; + } if (p->p_vaddr + p->p_memsz > totalEnd) totalEnd = p->p_vaddr + p->p_memsz; } @@ -612,6 +614,16 @@ u32 ElfReader::GetTotalTextSize() const { return total; } +u32 ElfReader::GetTotalTextSizeFromSeg() const { + u32 total = 0; + for (int i = 0; i < GetNumSegments(); ++i) { + if ((segments[i].p_flags & PF_X) != 0) { + total += segments[i].p_filesz; + } + } + return total; +} + u32 ElfReader::GetTotalDataSize() const { u32 total = 0; for (int i = 0; i < GetNumSections(); ++i) { diff --git a/Core/ELF/ElfReader.h b/Core/ELF/ElfReader.h index 44d33a8e8e..0284b56bd4 100644 --- a/Core/ELF/ElfReader.h +++ b/Core/ELF/ElfReader.h @@ -114,6 +114,10 @@ public: return segments[segment].p_memsz; } + u32 GetFirstSegmentAlign() const { + return firstSegAlign; + } + bool DidRelocate() const { return bRelocate; } @@ -127,6 +131,7 @@ public: } u32 GetTotalTextSize() const; + u32 GetTotalTextSizeFromSeg() const; u32 GetTotalDataSize() const; u32 GetTotalSectionSizeByPrefix(const std::string &prefix) const; @@ -151,4 +156,5 @@ private: u32 vaddr = 0; u32 segmentVAddr[32]; size_t size_ = 0; + u32 firstSegAlign = 0; }; diff --git a/Core/HLE/sceKernelModule.cpp b/Core/HLE/sceKernelModule.cpp index 4952f9be31..be48124fd8 100644 --- a/Core/HLE/sceKernelModule.cpp +++ b/Core/HLE/sceKernelModule.cpp @@ -168,6 +168,7 @@ struct NativeModule { char name[28]; u32_le status; u32_le unk1; + u32_le modid; // 0x2C u32_le usermod_thid; u32_le memid; u32_le mpidtext; @@ -233,7 +234,7 @@ enum NativeModuleStatus { class PSPModule : public KernelObject { public: - PSPModule() : textStart(0), textEnd(0), libstub(0), libstubend(0), memoryBlockAddr(0), isFake(false) {} + PSPModule() : textStart(0), textEnd(0), libstub(0), libstubend(0), memoryBlockAddr(0), isFake(false), modulePtr(0) {} ~PSPModule() { if (memoryBlockAddr) { // If it's either below user memory, or using a high kernel bit, it's in kernel. @@ -244,6 +245,11 @@ public: } g_symbolMap->UnloadModule(memoryBlockAddr, memoryBlockSize); } + + if (modulePtr) { + //Only alloc at kernel memory. + kernelMemory.Free(modulePtr); + } } const char *GetName() override { return nm.name; } const char *GetTypeName() override { return GetStaticTypeName(); } @@ -263,11 +269,23 @@ public: void DoState(PointerWrap &p) override { - auto s = p.Section("Module", 1, 4); + auto s = p.Section("Module", 1, 5); if (!s) return; - Do(p, nm); + if (s >= 5) { + Do(p, nm); + } else { + char temp[192]; + NativeModule *pnm = &nm; + char *ptemp = temp; + DoArray(p, ptemp, 0xC0); + memcpy(pnm, ptemp, 0x2C); + pnm->modid = GetUID(); + pnm += 0x30; + ptemp += 0x30; + memcpy(pnm, ptemp, 0xC0 - 0x2C); + } Do(p, memoryBlockAddr); Do(p, memoryBlockSize); Do(p, isFake); @@ -290,6 +308,10 @@ public: Do(p, libstubend); } + if (s >= 5) { + Do(p, modulePtr); + } + ModuleWaitingThread mwt = {0}; Do(p, waitingThreads, mwt); FuncSymbolExport fsx = {{0}}; @@ -422,6 +444,7 @@ public: u32 memoryBlockAddr; u32 memoryBlockSize; + u32 modulePtr; bool isFake; }; @@ -1104,6 +1127,8 @@ static PSPModule *__KernelLoadELFFromPtr(const u8 *ptr, size_t elfSize, u32 load loadedModules.insert(module->GetUID()); memset(&module->nm, 0, sizeof(module->nm)); + module->nm.modid = module->GetUID(); + bool reportedModule = false; u32 devkitVersion = 0; u8 *newptr = 0; @@ -1310,6 +1335,12 @@ static PSPModule *__KernelLoadELFFromPtr(const u8 *ptr, size_t elfSize, u32 load if (textSection == -1) { module->textStart = reader.GetVaddr(); module->textEnd = firstImportStubAddr - 4; + // Reference Jpcsp. + if (reader.GetFirstSegmentAlign() > 0) + module->textStart &= ~(reader.GetFirstSegmentAlign() - 1); + // PSP set these values even if no section. + module->nm.text_addr = module->textStart; + module->nm.text_size = reader.GetTotalTextSizeFromSeg(); } if (!module->isFake) { @@ -1540,6 +1571,15 @@ static PSPModule *__KernelLoadELFFromPtr(const u8 *ptr, size_t elfSize, u32 load } } + u32 moduleSize = sizeof(module->nm); + char tag[32]; + snprintf(tag, sizeof(tag), "SceModule-%d", module->nm.modid); + module->modulePtr = kernelMemory.Alloc(moduleSize, true, tag); + + // Fill the struct. + if (Memory::IsValidAddress(module->modulePtr)) + Memory::WriteStruct(module->modulePtr, &module->nm); + error = 0; return module; } @@ -1896,6 +1936,15 @@ u32 sceKernelLoadModule(const char *name, u32 flags, u32 optionAddr) { module->nm.entry_addr = -1; module->nm.gp_value = -1; + u32 moduleSize = sizeof(module->nm); + char tag[32]; + snprintf(tag, sizeof(tag), "SceModule-%d", module->nm.modid); + module->modulePtr = kernelMemory.Alloc(moduleSize, true, tag); + + // Fill the struct. + if(Memory::IsValidAddress(module->modulePtr)) + Memory::WriteStruct(module->modulePtr, &module->nm); + // TODO: It would be more ideal to allocate memory for this module. return hleLogSuccessInfoI(LOADER, module->GetUID(), "created fake module"); @@ -2367,16 +2416,30 @@ static u32 sceKernelGetModuleId() u32 sceKernelFindModuleByUID(u32 uid) { - ERROR_LOG(SCEMODULE, "UNIMPL sceKernelFindModuleByUID(%d)", uid); - return 0; + u32 error; + PSPModule *module = kernelObjects.Get(uid, error); + if (!module || module->isFake) { + ERROR_LOG(SCEMODULE, "0 = sceKernelFindModuleByUID(%d): Module Not Found or Fake", uid); + return 0; + } + INFO_LOG(SCEMODULE, "sceKernelFindModuleByUID(%d)", uid); + return module->modulePtr; } u32 sceKernelFindModuleByName(const char *name) { - int index = GetModuleIndex(name); - u32 temp = index + 1; - INFO_LOG(SCEMODULE, "%d = sceKernelFindModuleByName(%s)", temp, name); - return temp; + u32 error; + for (SceUID moduleId : loadedModules) { + PSPModule *module = kernelObjects.Get(moduleId, error); + if (!module) + continue; + if (!module->isFake && strcmp(name, module->nm.name) == 0) { + INFO_LOG(SCEMODULE, "%d = sceKernelFindModuleByName(%s)", module->modulePtr, name); + return module->modulePtr; + } + } + WARN_LOG(SCEMODULE, "0 = sceKernelFindModuleByName(%s): Module Not Found or Fake", name); + return 0; } static u32 sceKernelLoadModuleByID(u32 id, u32 flags, u32 lmoptionPtr) From 6717c2b55f97fac1079750cdf2cd81acd3b4a6e2 Mon Sep 17 00:00:00 2001 From: shenweip <1037567878@qq.com> Date: Tue, 27 Oct 2020 20:58:07 +0800 Subject: [PATCH 104/275] Fixes mistake. --- Core/HLE/sceKernelModule.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Core/HLE/sceKernelModule.cpp b/Core/HLE/sceKernelModule.cpp index be48124fd8..75f13ff2fe 100644 --- a/Core/HLE/sceKernelModule.cpp +++ b/Core/HLE/sceKernelModule.cpp @@ -283,7 +283,7 @@ public: memcpy(pnm, ptemp, 0x2C); pnm->modid = GetUID(); pnm += 0x30; - ptemp += 0x30; + ptemp += 0x2C; memcpy(pnm, ptemp, 0xC0 - 0x2C); } Do(p, memoryBlockAddr); From 6c5d4b5fc71e9cad1c8317283c2e3bf25e3cc88a Mon Sep 17 00:00:00 2001 From: shenweip <1037567878@qq.com> Date: Tue, 27 Oct 2020 22:12:53 +0800 Subject: [PATCH 105/275] Log the return value. --- Core/HLE/sceKernelModule.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Core/HLE/sceKernelModule.cpp b/Core/HLE/sceKernelModule.cpp index 75f13ff2fe..26d5ef0dce 100644 --- a/Core/HLE/sceKernelModule.cpp +++ b/Core/HLE/sceKernelModule.cpp @@ -2422,7 +2422,7 @@ u32 sceKernelFindModuleByUID(u32 uid) ERROR_LOG(SCEMODULE, "0 = sceKernelFindModuleByUID(%d): Module Not Found or Fake", uid); return 0; } - INFO_LOG(SCEMODULE, "sceKernelFindModuleByUID(%d)", uid); + INFO_LOG(SCEMODULE, "%d = sceKernelFindModuleByUID(%d)", module->modulePtr, uid); return module->modulePtr; } From 41ee5fbd931c796d188d35e6df43156dea25985f Mon Sep 17 00:00:00 2001 From: nassau-tk Date: Wed, 28 Oct 2020 23:32:47 +0900 Subject: [PATCH 106/275] Modified "ltn1/3/5/7 .pgf" --- assets/flash0/font/ltn1.pgf | Bin 49916 -> 50744 bytes assets/flash0/font/ltn3.pgf | Bin 54016 -> 53760 bytes assets/flash0/font/ltn5.pgf | Bin 51424 -> 52428 bytes assets/flash0/font/ltn7.pgf | Bin 53832 -> 54468 bytes 4 files changed, 0 insertions(+), 0 deletions(-) diff --git a/assets/flash0/font/ltn1.pgf b/assets/flash0/font/ltn1.pgf index 7217e164c015518f1410643ed7324e7b09b44638..f6e95f3e56205caba0da6be4082ec5ec0743d51b 100644 GIT binary patch literal 50744 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 UkRlNI(C|#q1V)!Y5L(s$0OmNG6951J literal 49916 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 ae%cGf+VQU~8_p}Cq_{rbhl3;qjMSt)D) delta 3389 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 T1B^$pb|t_TRQ=Ja4a@!u=r?mK diff --git a/assets/flash0/font/ltn5.pgf b/assets/flash0/font/ltn5.pgf index afae101542a0027ff006e53fefca7a341afefb54..2628252c325ebc2745c07ab3707ba180f0ee0648 100644 GIT binary patch literal 52428 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%0Du{z3IV1TJ+&WKI>J7VRIn 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 ND=!W+IWwA0{67)g-b4TZ literal 51424 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 JO;^D4{}0w|nz#S} diff --git a/assets/flash0/font/ltn7.pgf b/assets/flash0/font/ltn7.pgf index 23a7cff954df5655f4c45ba77aeacbaec2dc1efe..966a164be1535c78fbc0b3ac07cbbf4604459782 100644 GIT binary patch literal 54468 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�xi?vQPkY)VT%BAm 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 Date: Wed, 28 Oct 2020 23:51:22 +0100 Subject: [PATCH 107/275] Fix checks for fragment test cache in GLES fragment shader generator --- GPU/GLES/FragmentShaderGeneratorGLES.cpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/GPU/GLES/FragmentShaderGeneratorGLES.cpp b/GPU/GLES/FragmentShaderGeneratorGLES.cpp index fb6215e5bc..bbd6aee489 100644 --- a/GPU/GLES/FragmentShaderGeneratorGLES.cpp +++ b/GPU/GLES/FragmentShaderGeneratorGLES.cpp @@ -47,7 +47,7 @@ bool GenerateFragmentShaderGLSL(const FShaderID &id, char *buffer, const GLSLSha bool highpFog = false; bool highpTexcoord = false; - bool fragmentTestCache = g_Config.bFragmentTestCache && !compat.vulkan; + bool enableFragmentTestCache = g_Config.bFragmentTestCache && !compat.vulkan; if (compat.gles) { // PowerVR needs highp to do the fog in MHU correctly. @@ -202,7 +202,7 @@ bool GenerateFragmentShaderGLSL(const FShaderID &id, char *buffer, const GLSLSha } if (enableAlphaTest || enableColorTest) { - if (g_Config.bFragmentTestCache) { + if (enableFragmentTestCache) { WRITE(p, "uniform sampler2D testtex;\n"); } else { *uniformMask |= DIRTY_ALPHACOLORREF; @@ -241,7 +241,7 @@ bool GenerateFragmentShaderGLSL(const FShaderID &id, char *buffer, const GLSLSha WRITE(p, "%s %s vec3 v_texcoord;\n", compat.varying_fs, highpTexcoord ? "highp" : "mediump"); } - if (!g_Config.bFragmentTestCache) { + if (!enableFragmentTestCache) { if (enableAlphaTest && !alphaTestAgainstZero) { if (compat.bitwiseOps) { WRITE(p, "int roundAndScaleTo255i(in float x) { return int(floor(x * 255.0 + 0.5)); }\n"); @@ -516,7 +516,7 @@ bool GenerateFragmentShaderGLSL(const FShaderID &id, char *buffer, const GLSLSha // Texture access is at half texels [0.5/256, 255.5/256], but colors are normalized [0, 255]. // So we have to scale to account for the difference. std::string alphaTestXCoord = "0"; - if (fragmentTestCache) { + if (enableFragmentTestCache) { if (enableColorTest && !colorTestAgainstZero) { WRITE(p, " vec4 vScale256 = v * %f + %f;\n", 255.0 / 256.0, 0.5 / 256.0); alphaTestXCoord = "vScale256.a"; @@ -542,7 +542,7 @@ bool GenerateFragmentShaderGLSL(const FShaderID &id, char *buffer, const GLSLSha // Maybe we could discard the drawcall, but it's pretty rare. Let's just statically discard here. WRITE(p, " %s\n", discardStatement); } - } else if (fragmentTestCache) { + } else if (enableFragmentTestCache) { WRITE(p, " float aResult = %s(testtex, vec2(%s, 0)).a;\n", compat.texture, alphaTestXCoord.c_str()); WRITE(p, " if (aResult < 0.5) %s\n", discardStatement); } else { @@ -579,7 +579,7 @@ bool GenerateFragmentShaderGLSL(const FShaderID &id, char *buffer, const GLSLSha // Maybe we could discard the drawcall, but it's pretty rare. Let's just statically discard here. WRITE(p, " %s\n", discardStatement); } - } else if (g_Config.bFragmentTestCache) { + } else if (enableFragmentTestCache) { WRITE(p, " float rResult = %s(testtex, vec2(vScale256.r, 0)).r;\n", compat.texture); WRITE(p, " float gResult = %s(testtex, vec2(vScale256.g, 0)).g;\n", compat.texture); WRITE(p, " float bResult = %s(testtex, vec2(vScale256.b, 0)).b;\n", compat.texture); From 335650da6cd160d3527a56f4cd6b4dff471d268d Mon Sep 17 00:00:00 2001 From: ANR2ME Date: Wed, 21 Oct 2020 07:45:16 +0700 Subject: [PATCH 108/275] Prevent Port leaks after loading SaveState in the middle of multiplayer resulting to "port in use" error on the next attempt to play multiplayer. --- Core/HLE/sceNetAdhoc.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/Core/HLE/sceNetAdhoc.cpp b/Core/HLE/sceNetAdhoc.cpp index 0ec8c85ecf..9cbbd132e7 100644 --- a/Core/HLE/sceNetAdhoc.cpp +++ b/Core/HLE/sceNetAdhoc.cpp @@ -960,6 +960,7 @@ void __NetAdhocDoState(PointerWrap &p) { adhocctlRequests.clear(); adhocSocketRequests.clear(); sendTargetPeers.clear(); + deleteAllAdhocSockets(); // Let's not change "Inited" value when Loading SaveState to prevent memory & port leaks netAdhocMatchingInited = cur_netAdhocMatchingInited; From 5216433e0cd55e50627c930da61a469736497a0e Mon Sep 17 00:00:00 2001 From: ANR2ME Date: Wed, 21 Oct 2020 07:47:25 +0700 Subject: [PATCH 109/275] Prevent memory leaks when attempting to play GameMode multiplayer again after loading from SaveState in the middle of GameMode multiplayer. --- Core/HLE/sceNetAdhoc.cpp | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/Core/HLE/sceNetAdhoc.cpp b/Core/HLE/sceNetAdhoc.cpp index 9cbbd132e7..b9ac49fb4e 100644 --- a/Core/HLE/sceNetAdhoc.cpp +++ b/Core/HLE/sceNetAdhoc.cpp @@ -2580,9 +2580,9 @@ int NetAdhocctl_CreateEnterGameMode(const char* group_name, int game_type, int n if (game_type <= 0 || game_type > 3 || num_members < 2 || num_members > 16 || (game_type == 1 && num_members > 4)) return ERROR_NET_ADHOCCTL_INVALID_ARG; + deleteAllGMB(); + SceNetEtherAddr* addrs = PSPPointer::Create(membersAddr); // List of participating MAC addresses (started from host) - gameModeMacs.clear(); - requiredGameModeMacs.clear(); for (int i = 0; i < num_members; i++) { requiredGameModeMacs.push_back(*addrs); DEBUG_LOG(SCENET, "GameMode macAddress#%d=%s", i, mac2str(addrs).c_str()); @@ -2643,6 +2643,8 @@ static int sceNetAdhocctlJoinEnterGameMode(const char * group_name, const char * if (!hostMac) return hleLogError(SCENET, ERROR_NET_ADHOCCTL_INVALID_ARG, "invalid arg"); + deleteAllGMB(); + // Add host mac first gameModeMacs.push_back(*(SceNetEtherAddr*)hostMac); @@ -2681,12 +2683,12 @@ int NetAdhoc_Term() { // Library is initialized if (netAdhocInited) { - // Delete Adhoc Sockets - deleteAllAdhocSockets(); - // Delete GameMode Buffers deleteAllGMB(); + // Delete Adhoc Sockets + deleteAllAdhocSockets(); + // Terminate Internet Library //sceNetInetTerm(); From 6e50487fcd43cbc399565a52bd75eed1d7434faa Mon Sep 17 00:00:00 2001 From: ANR2ME Date: Thu, 22 Oct 2020 00:58:39 +0700 Subject: [PATCH 110/275] Updated error code on sceNetGetLocalEtherAddr --- Core/HLE/sceNet.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/Core/HLE/sceNet.cpp b/Core/HLE/sceNet.cpp index 15e5179d5e..448b0ba66e 100644 --- a/Core/HLE/sceNet.cpp +++ b/Core/HLE/sceNet.cpp @@ -676,8 +676,6 @@ static u32 sceWlanGetEtherAddr(u32 addrAddr) { return hleLogError(SCENET, SCE_KERNEL_ERROR_ILLEGAL_ADDR, "illegal address"); } - // FIXME: Return 0x80410180 (pspnet[_core] error code?) when Adhocctl not connected to a group (ie. ADHOCCTL_STATE_DISCONNECTED)? - u8 *addr = Memory::GetPointer(addrAddr); if (PPSSPP_ID > 1) { Memory::Memset(addrAddr, PPSSPP_ID, 6); @@ -697,6 +695,10 @@ static u32 sceWlanGetEtherAddr(u32 addrAddr) { } static u32 sceNetGetLocalEtherAddr(u32 addrAddr) { + // FIXME: Return 0x80410180 (pspnet[_core] error code?) before successful attempt to Create/Connect/Join a Group? (ie. adhocctlCurrentMode == ADHOCCTL_MODE_NONE) + if (adhocctlCurrentMode == ADHOCCTL_MODE_NONE) + return hleLogDebug(SCENET, 0x80410180, "address not available?"); + return sceWlanGetEtherAddr(addrAddr); } From 3020efdbe7a1a0c5a53f37f969522a9be9a45f7a Mon Sep 17 00:00:00 2001 From: ANR2ME Date: Tue, 20 Oct 2020 13:09:28 +0700 Subject: [PATCH 111/275] Added hleEatMicro (may not be accurate tho) on PdpSend, PdpRecv, and GetPeerInfo. --- Core/HLE/sceNetAdhoc.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/Core/HLE/sceNetAdhoc.cpp b/Core/HLE/sceNetAdhoc.cpp index b9ac49fb4e..1ddda409d4 100644 --- a/Core/HLE/sceNetAdhoc.cpp +++ b/Core/HLE/sceNetAdhoc.cpp @@ -1360,6 +1360,7 @@ static int sceNetAdhocPdpSend(int id, const char *mac, u32 port, void *data, int // Free Network Lock //_freeNetworkLock(); + hleEatMicro(1000); // Can be longer than 1ms tho // Sent Data if (sent >= 0) { DEBUG_LOG(SCENET, "sceNetAdhocPdpSend[%i:%u]: Sent %u bytes to %s:%u\n", id, getLocalPort(pdpsocket.id), sent, inet_ntoa(target.sin_addr), ntohs(target.sin_port)); @@ -1451,6 +1452,7 @@ static int sceNetAdhocPdpSend(int id, const char *mac, u32 port, void *data, int // Free Network Lock //_freeNetworkLock(); + hleEatMicro(1000); // Success, Broadcast never fails! return 0; // len; } @@ -1478,7 +1480,6 @@ static int sceNetAdhocPdpSend(int id, const char *mac, u32 port, void *data, int // Library is uninitialized return ERROR_NET_ADHOC_NOT_INITIALIZED; - } /** @@ -1598,6 +1599,7 @@ static int sceNetAdhocPdpRecv(int id, void *addr, void * port, void *buf, void * VERBOSE_LOG(SCENET, "Socket Error (%i) on sceNetAdhocPdpRecv[%i:%u] [size=%i]", error, id, pdpsocket.lport, *len); } + hleEatMicro(1000); // Received Data. UDP can also receives 0 data, while on TCP 0 data = connection gracefully closed, but not sure about PDP tho if (received > 0) { DEBUG_LOG(SCENET, "sceNetAdhocPdpRecv[%i:%u]: Received %u bytes from %s:%u\n", id, getLocalPort(pdpsocket.id), received, inet_ntoa(sin.sin_addr), ntohs(sin.sin_port)); @@ -2421,6 +2423,7 @@ int sceNetAdhocctlGetPeerInfo(const char *mac, int size, u32 peerInfoAddr) { // Multithreading Unlock peerlock.unlock(); } + hleEatMicro(1000); return retval; } From 8762718abf3075f70cd4a054995b948458135648 Mon Sep 17 00:00:00 2001 From: ANR2ME Date: Tue, 20 Oct 2020 16:52:47 +0700 Subject: [PATCH 112/275] Updated Loggings and return value of PdpSend and PdpRecv --- Core/HLE/sceNetAdhoc.cpp | 55 +++++++++++++++++++--------------------- 1 file changed, 26 insertions(+), 29 deletions(-) diff --git a/Core/HLE/sceNetAdhoc.cpp b/Core/HLE/sceNetAdhoc.cpp index 1ddda409d4..877f87e172 100644 --- a/Core/HLE/sceNetAdhoc.cpp +++ b/Core/HLE/sceNetAdhoc.cpp @@ -354,7 +354,7 @@ int DoBlockingPdpRecv(int uid, AdhocSocketRequest& req, s64& result) { if (ret >= 0 && ret <= *req.length) { ret = recvfrom(uid, (char*)req.buffer, *req.length, MSG_NOSIGNAL, (sockaddr*)&sin, &sinlen); // UDP can also receives 0 data, while on TCP receiving 0 data = connection gracefully closed, but not sure whether PDP can send/recv 0 data or not tho - if (ret > 0) { + if (ret >= 0) { DEBUG_LOG(SCENET, "sceNetAdhocPdpRecv[%i:%u]: Received %u bytes from %s:%u\n", req.id, getLocalPort(uid), ret, inet_ntoa(sin.sin_addr), ntohs(sin.sin_port)); // Peer MAC @@ -403,7 +403,7 @@ int DoBlockingPdpRecv(int uid, AdhocSocketRequest& req, s64& result) { result = ERROR_NET_ADHOC_TIMEOUT; } else - result = ERROR_NET_ADHOC_INVALID_ARG; // ERROR_NET_ADHOC_DISCONNECTED + result = ERROR_NET_ADHOC_TIMEOUT; // ERROR_NET_ADHOC_INVALID_ARG; // ERROR_NET_ADHOC_DISCONNECTED if (ret == SOCKET_ERROR) DEBUG_LOG(SCENET, "sceNetAdhocPdpRecv[%i]: Socket Error (%i)", req.id, sockerr); @@ -1344,7 +1344,7 @@ static int sceNetAdhocPdpSend(int id, const char *mac, u32 port, void *data, int u64 threadSocketId = ((u64)__KernelGetCurThread()) << 32 | pdpsocket.id; if (sendTargetPeers.find(threadSocketId) != sendTargetPeers.end()) { DEBUG_LOG(SCENET, "sceNetAdhocPdpSend[%i:%u]: Socket(%d) is Busy!", id, getLocalPort(pdpsocket.id), pdpsocket.id); - return ERROR_NET_ADHOC_BUSY; + return hleLogError(SCENET, ERROR_NET_ADHOC_BUSY, "busy?"); } AdhocSendTargets dest = { len, {}, false }; @@ -1371,10 +1371,10 @@ static int sceNetAdhocPdpSend(int id, const char *mac, u32 port, void *data, int // Non-Blocking if (flag) - return ERROR_NET_ADHOC_WOULD_BLOCK; + return hleLogSuccessVerboseI(SCENET, ERROR_NET_ADHOC_WOULD_BLOCK, "would block"); // Does PDP can Timeout? There is no concept of Timeout when sending UDP due to no ACK, but might happen if the socket buffer is full, not sure about PDP since some games did use the timeout arg - return ERROR_NET_ADHOC_TIMEOUT; // ERROR_NET_ADHOC_INVALID_ADDR; + return hleLogDebug(SCENET, ERROR_NET_ADHOC_TIMEOUT, "timeout?"); // ERROR_NET_ADHOC_INVALID_ADDR; } //VERBOSE_LOG(SCENET, "sceNetAdhocPdpSend[%i:%u]: Unknown Target Peer %s:%u\n", id, getLocalPort(pdpsocket.id), mac2str(daddr, tmpmac), ntohs(target.sin_port)); } @@ -1419,7 +1419,7 @@ static int sceNetAdhocPdpSend(int id, const char *mac, u32 port, void *data, int u64 threadSocketId = ((u64)__KernelGetCurThread()) << 32 | pdpsocket.id; if (sendTargetPeers.find(threadSocketId) != sendTargetPeers.end()) { DEBUG_LOG(SCENET, "sceNetAdhocPdpSend[%i:%u](BC): Socket(%d) is Busy!", id, getLocalPort(pdpsocket.id), pdpsocket.id); - return ERROR_NET_ADHOC_BUSY; + return hleLogError(SCENET, ERROR_NET_ADHOC_BUSY, "busy?"); } sendTargetPeers[threadSocketId] = dest; @@ -1459,27 +1459,27 @@ static int sceNetAdhocPdpSend(int id, const char *mac, u32 port, void *data, int } // Invalid Destination Address - return ERROR_NET_ADHOC_INVALID_ADDR; + return hleLogError(SCENET, ERROR_NET_ADHOC_INVALID_ADDR, "invalid address"); } // Invalid Argument - return ERROR_NET_ADHOC_INVALID_ARG; + return hleLogError(SCENET, ERROR_NET_ADHOC_INVALID_ARG, "invalid arg"); } // Invalid Socket ID - return ERROR_NET_ADHOC_INVALID_SOCKET_ID; + return hleLogError(SCENET, ERROR_NET_ADHOC_INVALID_SOCKET_ID, "invalid socket id"); } // Invalid Data Length - return ERROR_NET_ADHOC_INVALID_DATALEN; + return hleLogError(SCENET, ERROR_NET_ADHOC_INVALID_DATALEN, "invalid data length"); } // Invalid Destination Port - return ERROR_NET_ADHOC_INVALID_PORT; + return hleLogError(SCENET, ERROR_NET_ADHOC_INVALID_PORT, "invalid port"); } // Library is uninitialized - return ERROR_NET_ADHOC_NOT_INITIALIZED; + return hleLogError(SCENET, ERROR_NET_ADHOC_NOT_INITIALIZED, "not initialized"); } /** @@ -1584,24 +1584,25 @@ static int sceNetAdhocPdpRecv(int id, void *addr, void * port, void *buf, void * // Free Network Lock //_freeNetworkLock(); - return ERROR_NET_ADHOC_NOT_ENOUGH_SPACE; //received; + return hleLogSuccessVerboseI(SCENET, ERROR_NET_ADHOC_NOT_ENOUGH_SPACE, "not enough space"); //received; } received = recvfrom(pdpsocket.id, (char*)buf, *len, MSG_NOSIGNAL, (sockaddr*)&sin, &sinlen); error = errno; - if (received == SOCKET_ERROR && (error == EAGAIN || error == EWOULDBLOCK)) { + // On Windows: recvfrom on UDP can get error WSAECONNRESET when previous sendto's destination is unreachable (or destination port is not bound), may need to disable SIO_UDP_CONNRESET + if (received == SOCKET_ERROR && (error == EAGAIN || error == EWOULDBLOCK || error == ECONNRESET)) { if (flag == 0) { // Simulate blocking behaviour with non-blocking socket u64 threadSocketId = ((u64)__KernelGetCurThread()) << 32 | pdpsocket.id; return WaitBlockingAdhocSocket(threadSocketId, PDP_RECV, id, buf, len, timeout, saddr, sport, "pdp recv"); } - VERBOSE_LOG(SCENET, "Socket Error (%i) on sceNetAdhocPdpRecv[%i:%u] [size=%i]", error, id, pdpsocket.lport, *len); + return hleLogSuccessVerboseI(SCENET, ERROR_NET_ADHOC_WOULD_BLOCK, "would block"); } hleEatMicro(1000); // Received Data. UDP can also receives 0 data, while on TCP 0 data = connection gracefully closed, but not sure about PDP tho - if (received > 0) { + if (received >= 0) { DEBUG_LOG(SCENET, "sceNetAdhocPdpRecv[%i:%u]: Received %u bytes from %s:%u\n", id, getLocalPort(pdpsocket.id), received, inet_ntoa(sin.sin_addr), ntohs(sin.sin_port)); // Peer MAC @@ -1650,29 +1651,22 @@ static int sceNetAdhocPdpRecv(int id, void *addr, void * port, void *buf, void * if (wouldblock) flag = 1; #endif - // Nothing received. On Windows: recvfrom on UDP can get error WSAECONNRESET when previous sendto's destination is unreachable (or destination port is not bound), may need to disable SIO_UDP_CONNRESET - if (received == SOCKET_ERROR && (error == EAGAIN || error == EWOULDBLOCK || error == ECONNRESET || error == ETIMEDOUT)) { - // Blocking Situation - if (flag) return ERROR_NET_ADHOC_WOULD_BLOCK; + DEBUG_LOG(SCENET, "sceNetAdhocPdpRecv[%i:%u]: Result:%i (Error:%i)", id, pdpsocket.lport, received, error); - // Timeout - return ERROR_NET_ADHOC_TIMEOUT; - } - - // Disconnected - return ERROR_NET_ADHOC_DISCONNECTED; + // Timeout? + return hleLogError(SCENET, ERROR_NET_ADHOC_TIMEOUT, "timeout"); } // Invalid Argument - return ERROR_NET_ADHOC_INVALID_ARG; + return hleLogError(SCENET, ERROR_NET_ADHOC_INVALID_ARG, "invalid arg"); } // Invalid Socket ID - return ERROR_NET_ADHOC_INVALID_SOCKET_ID; + return hleLogError(SCENET, ERROR_NET_ADHOC_INVALID_SOCKET_ID, "invalid socket id"); } // Library is uninitialized - return ERROR_NET_ADHOC_NOT_INITIALIZED; + return hleLogError(SCENET, ERROR_NET_ADHOC_NOT_INITIALIZED, "not initialized"); } int NetAdhoc_SetSocketAlert(int id, s32_le flag) { @@ -3756,6 +3750,9 @@ static int sceNetAdhocPtpRecv(int id, u32 dataAddr, u32 dataSizeAddr, int timeou DEBUG_LOG(SCENET, "sceNetAdhocPtpRecv[%i:%u]: Result:%i (Error:%i)", id, ptpsocket.lport, received, error); + if (*len == 0) + return 0; + // Change Socket State ptpsocket.state = ADHOC_PTP_STATE_CLOSED; From 40102787c85f25445319c257f82b5abb7c2aa7a6 Mon Sep 17 00:00:00 2001 From: ANR2ME Date: Thu, 22 Oct 2020 08:44:23 +0700 Subject: [PATCH 113/275] Updated validity checking of mac address on PdpCreate, PtpListen, and PtpOpen --- Core/HLE/sceNetAdhoc.cpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/Core/HLE/sceNetAdhoc.cpp b/Core/HLE/sceNetAdhoc.cpp index 877f87e172..8854e4687f 100644 --- a/Core/HLE/sceNetAdhoc.cpp +++ b/Core/HLE/sceNetAdhoc.cpp @@ -1125,8 +1125,8 @@ static int sceNetAdhocPdpCreate(const char *mac, int port, int bufferSize, u32 f if (saddr != NULL) { getLocalMac(saddr); } - // Valid MAC supplied - if (isLocalMAC(saddr)) { + // Valid MAC supplied. FIXME: MAC only valid after successful attempt to Create/Connect/Join a Group? (ie. adhocctlCurrentMode != ADHOCCTL_MODE_NONE) + if ((adhocctlCurrentMode != ADHOCCTL_MODE_NONE) && isLocalMAC(saddr)) { // Create Internet UDP Socket int usocket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); // Valid Socket produced @@ -2912,8 +2912,8 @@ static int sceNetAdhocPtpOpen(const char *srcmac, int sport, const char *dstmac, if (saddr != NULL) { getLocalMac(saddr); } - // Valid Addresses - if (saddr != NULL && isLocalMAC(saddr) && daddr != NULL && !isBroadcastMAC(daddr) && !isZeroMAC(daddr)) { + // Valid Addresses. FIXME: MAC only valid after successful attempt to Create/Connect/Join a Group? (ie. adhocctlCurrentMode != ADHOCCTL_MODE_NONE) + if ((adhocctlCurrentMode != ADHOCCTL_MODE_NONE) && saddr != NULL && isLocalMAC(saddr) && daddr != NULL && !isBroadcastMAC(daddr) && !isZeroMAC(daddr)) { // Dissidia 012 will try to reOpen the port without Closing the old one first when PtpConnect failed to try again. if (isPTPPortInUse(sport, false)) return hleLogDebug(SCENET, ERROR_NET_ADHOC_PORT_IN_USE, "port in use"); @@ -3438,8 +3438,8 @@ static int sceNetAdhocPtpListen(const char *srcmac, int sport, int bufsize, int if (saddr != NULL) { getLocalMac(saddr); } - // Valid Address - if (saddr != NULL && isLocalMAC(saddr)) { + // Valid Address. FIXME: MAC only valid after successful attempt to Create/Connect/Join a Group? (ie. adhocctlCurrentMode != ADHOCCTL_MODE_NONE) + if ((adhocctlCurrentMode != ADHOCCTL_MODE_NONE) && saddr != NULL && isLocalMAC(saddr)) { // It's allowed to Listen and Open the same PTP port, But it's not allowed to Listen or Open the same PTP port twice. if (isPTPPortInUse(sport, true)) return hleLogDebug(SCENET, ERROR_NET_ADHOC_PORT_IN_USE, "port in use"); From 0363319f141721107db60cff0a2b94173eba439c Mon Sep 17 00:00:00 2001 From: ANR2ME Date: Wed, 21 Oct 2020 08:43:34 +0700 Subject: [PATCH 114/275] Prevent Scanning issue after reconnected to AdhocServer, also Updated logging to showing the error code on sceNetAdhocctlScan --- Core/HLE/proAdhoc.cpp | 2 ++ Core/HLE/sceNetAdhoc.cpp | 6 +++--- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/Core/HLE/proAdhoc.cpp b/Core/HLE/proAdhoc.cpp index c408aa8b52..9eaf171a02 100644 --- a/Core/HLE/proAdhoc.cpp +++ b/Core/HLE/proAdhoc.cpp @@ -1334,6 +1334,8 @@ int friendFinder(){ if (initNetwork(&product_code) == 0) { networkInited = true; INFO_LOG(SCENET, "FriendFinder: Network [RE]Initialized"); + // At this point we are most-likely not in a Group within the Adhoc Server, so we should probably reset AdhocctlState + adhocctlState = ADHOCCTL_STATE_DISCONNECTED; } else { networkInited = false; diff --git a/Core/HLE/sceNetAdhoc.cpp b/Core/HLE/sceNetAdhoc.cpp index 8854e4687f..70a00000e1 100644 --- a/Core/HLE/sceNetAdhoc.cpp +++ b/Core/HLE/sceNetAdhoc.cpp @@ -1974,7 +1974,7 @@ int sceNetAdhocctlScan() { ERROR_LOG(SCENET, "Socket error (%i) when sending", error); adhocctlState = ADHOCCTL_STATE_DISCONNECTED; //if (error == ECONNABORTED || error == ECONNRESET || error == ENOTCONN) return ERROR_NET_ADHOCCTL_NOT_INITIALIZED; // A case where it need to reconnect to AdhocServer - return ERROR_NET_ADHOCCTL_BUSY; + return hleLogError(SCENET, ERROR_NET_ADHOCCTL_BUSY, "busy"); } else if (friendFinderRunning) { AdhocctlRequest req = { OPCODE_SCAN, {0} }; @@ -1989,7 +1989,7 @@ int sceNetAdhocctlScan() { } } else if (adhocctlState == ADHOCCTL_STATE_SCANNING) - return ERROR_NET_ADHOCCTL_BUSY; + return hleLogError(SCENET, ERROR_NET_ADHOCCTL_BUSY, "busy"); // Already connected to a group. Should we fake a success? // We need to notify the handler on success, even if it was faked. Using flag = 0/ADHOCCTL_EVENT_ERROR for error? @@ -2000,7 +2000,7 @@ int sceNetAdhocctlScan() { } // Library uninitialized - return ERROR_NET_ADHOCCTL_NOT_INITIALIZED; + return hleLogError(SCENET, ERROR_NET_ADHOCCTL_NOT_INITIALIZED, "not initialized"); } int sceNetAdhocctlGetScanInfo(u32 sizeAddr, u32 bufAddr) { From fa95afab0716ab085515226c564d56511aa88a3c Mon Sep 17 00:00:00 2001 From: ANR2ME Date: Thu, 22 Oct 2020 09:46:22 +0700 Subject: [PATCH 115/275] Do not clear socket alert flag after signaled. --- Core/HLE/sceNetAdhoc.cpp | 16 ---------------- 1 file changed, 16 deletions(-) diff --git a/Core/HLE/sceNetAdhoc.cpp b/Core/HLE/sceNetAdhoc.cpp index 70a00000e1..435f625124 100644 --- a/Core/HLE/sceNetAdhoc.cpp +++ b/Core/HLE/sceNetAdhoc.cpp @@ -391,8 +391,6 @@ int DoBlockingPdpRecv(int uid, AdhocSocketRequest& req, s64& result) { auto sock = adhocSockets[req.id - 1]; if (sock->flags & ADHOC_F_ALERTRECV) { result = ERROR_NET_ADHOC_SOCKET_ALERTED; - // FIXME: Should we clear the flag after alert signaled? - sock->flags &= ~ADHOC_F_ALERTRECV; sock->alerted_flags |= ADHOC_F_ALERTRECV; } else if (req.timeout == 0 || now - req.startTime <= req.timeout) { @@ -437,8 +435,6 @@ int DoBlockingPdpSend(int uid, AdhocSocketRequest& req, s64& result, AdhocSendTa u64 now = (u64)(time_now_d() * 1000000.0); if (sock->flags & ADHOC_F_ALERTSEND) { result = ERROR_NET_ADHOC_SOCKET_ALERTED; - // FIXME: Should we clear the flag after alert signaled? - sock->flags &= ~ADHOC_F_ALERTSEND; sock->alerted_flags |= ADHOC_F_ALERTSEND; break; } @@ -484,8 +480,6 @@ int DoBlockingPtpSend(int uid, AdhocSocketRequest& req, s64& result) { u64 now = (u64)(time_now_d() * 1000000.0); if (sock->flags & ADHOC_F_ALERTSEND) { result = ERROR_NET_ADHOC_SOCKET_ALERTED; - // FIXME: Should we clear the flag after alert signaled? - sock->flags &= ~ADHOC_F_ALERTSEND; sock->alerted_flags |= ADHOC_F_ALERTSEND; } else if (req.timeout == 0 || now - req.startTime <= req.timeout) { @@ -533,8 +527,6 @@ int DoBlockingPtpRecv(int uid, AdhocSocketRequest& req, s64& result) { u64 now = (u64)(time_now_d() * 1000000.0); if (sock->flags & ADHOC_F_ALERTRECV) { result = ERROR_NET_ADHOC_SOCKET_ALERTED; - // FIXME: Should we clear the flag after alert signaled? - sock->flags &= ~ADHOC_F_ALERTRECV; sock->alerted_flags |= ADHOC_F_ALERTRECV; } else if (req.timeout == 0 || now - req.startTime <= req.timeout) { @@ -583,8 +575,6 @@ int DoBlockingPtpAccept(int uid, AdhocSocketRequest& req, s64& result) { u64 now = (u64)(time_now_d() * 1000000.0); if (sock->flags & ADHOC_F_ALERTACCEPT) { result = ERROR_NET_ADHOC_SOCKET_ALERTED; - // FIXME: Should we clear the flag after alert signaled? - sock->flags &= ~ADHOC_F_ALERTACCEPT; sock->alerted_flags |= ADHOC_F_ALERTACCEPT; } else if (req.timeout == 0 || now - req.startTime <= req.timeout) { @@ -631,8 +621,6 @@ int DoBlockingPtpConnect(int uid, AdhocSocketRequest& req, s64& result) { u64 now = (u64)(time_now_d() * 1000000.0); if (sock->flags & ADHOC_F_ALERTCONNECT) { result = ERROR_NET_ADHOC_SOCKET_ALERTED; - // FIXME: Should we clear the flag after alert signaled? - sock->flags &= ~ADHOC_F_ALERTCONNECT; sock->alerted_flags |= ADHOC_F_ALERTCONNECT; } else if (req.timeout == 0 || now - req.startTime <= req.timeout) { @@ -667,8 +655,6 @@ int DoBlockingPtpFlush(int uid, AdhocSocketRequest& req, s64& result) { u64 now = (u64)(time_now_d() * 1000000.0); if (sock->flags & ADHOC_F_ALERTFLUSH) { result = ERROR_NET_ADHOC_SOCKET_ALERTED; - // FIXME: Should we clear the flag after alert signaled? - sock->flags &= ~ADHOC_F_ALERTFLUSH; sock->alerted_flags |= ADHOC_F_ALERTFLUSH; } else if (req.timeout == 0 || now - req.startTime <= req.timeout) { @@ -1758,8 +1744,6 @@ int PollAdhocSocket(SceNetAdhocPollSd* sds, int count, int timeout, int nonblock } if (sock->flags & ADHOC_F_ALERTPOLL) { - // FIXME: Should we clear the flag after alert signaled? - sock->flags &= ~ADHOC_F_ALERTPOLL; sock->alerted_flags |= ADHOC_F_ALERTPOLL; return ERROR_NET_ADHOC_SOCKET_ALERTED; From d87713226c270af0c3a890a2b36ff25c7adf781e Mon Sep 17 00:00:00 2001 From: ANR2ME Date: Thu, 22 Oct 2020 12:19:11 +0700 Subject: [PATCH 116/275] Socket alerts can be triggered regardless of the nonblocking flag --- Core/HLE/sceNetAdhoc.cpp | 126 +++++++++++++++++++++++++++------------ 1 file changed, 88 insertions(+), 38 deletions(-) diff --git a/Core/HLE/sceNetAdhoc.cpp b/Core/HLE/sceNetAdhoc.cpp index 435f625124..cc30552391 100644 --- a/Core/HLE/sceNetAdhoc.cpp +++ b/Core/HLE/sceNetAdhoc.cpp @@ -343,6 +343,13 @@ int StartGameModeScheduler(int bufSize) { } int DoBlockingPdpRecv(int uid, AdhocSocketRequest& req, s64& result) { + auto sock = adhocSockets[req.id - 1]; + if (sock->flags & ADHOC_F_ALERTRECV) { + result = ERROR_NET_ADHOC_SOCKET_ALERTED; + sock->alerted_flags |= ADHOC_F_ALERTRECV; + return 0; + } + sockaddr_in sin; memset(&sin, 0, sizeof(sin)); socklen_t sinlen = sizeof(sin); @@ -388,12 +395,7 @@ int DoBlockingPdpRecv(int uid, AdhocSocketRequest& req, s64& result) { // On Windows: recvfrom on UDP can get error WSAECONNRESET when previous sendto's destination is unreachable (or destination port is not bound yet), may need to disable SIO_UDP_CONNRESET error else if (sockerr == EAGAIN || sockerr == EWOULDBLOCK || sockerr == ECONNRESET) { u64 now = (u64)(time_now_d() * 1000000.0); - auto sock = adhocSockets[req.id - 1]; - if (sock->flags & ADHOC_F_ALERTRECV) { - result = ERROR_NET_ADHOC_SOCKET_ALERTED; - sock->alerted_flags |= ADHOC_F_ALERTRECV; - } - else if (req.timeout == 0 || now - req.startTime <= req.timeout) { + if (req.timeout == 0 || now - req.startTime <= req.timeout) { // Try again later return -1; } @@ -412,6 +414,11 @@ int DoBlockingPdpRecv(int uid, AdhocSocketRequest& req, s64& result) { int DoBlockingPdpSend(int uid, AdhocSocketRequest& req, s64& result, AdhocSendTargets& targetPeers) { auto sock = adhocSockets[req.id - 1]; auto& pdpsocket = sock->data.pdp; + if (sock->flags & ADHOC_F_ALERTSEND) { + result = ERROR_NET_ADHOC_SOCKET_ALERTED; + sock->alerted_flags |= ADHOC_F_ALERTSEND; + return 0; + } result = 0; bool retry = false; @@ -433,12 +440,7 @@ int DoBlockingPdpSend(int uid, AdhocSocketRequest& req, s64& result, AdhocSendTa else { if (ret == SOCKET_ERROR && (sockerr == EAGAIN || sockerr == EWOULDBLOCK)) { u64 now = (u64)(time_now_d() * 1000000.0); - if (sock->flags & ADHOC_F_ALERTSEND) { - result = ERROR_NET_ADHOC_SOCKET_ALERTED; - sock->alerted_flags |= ADHOC_F_ALERTSEND; - break; - } - else if (req.timeout == 0 || now - req.startTime <= req.timeout) { + if (req.timeout == 0 || now - req.startTime <= req.timeout) { retry = true; } else @@ -461,6 +463,11 @@ int DoBlockingPdpSend(int uid, AdhocSocketRequest& req, s64& result, AdhocSendTa int DoBlockingPtpSend(int uid, AdhocSocketRequest& req, s64& result) { auto sock = adhocSockets[req.id - 1]; auto& ptpsocket = sock->data.ptp; + if (sock->flags & ADHOC_F_ALERTSEND) { + result = ERROR_NET_ADHOC_SOCKET_ALERTED; + sock->alerted_flags |= ADHOC_F_ALERTSEND; + return 0; + } // Send Data int ret = send(uid, (const char*)req.buffer, *req.length, MSG_NOSIGNAL); @@ -478,11 +485,7 @@ int DoBlockingPtpSend(int uid, AdhocSocketRequest& req, s64& result) { } else if (ret == SOCKET_ERROR && (sockerr == EAGAIN || sockerr == EWOULDBLOCK)) { u64 now = (u64)(time_now_d() * 1000000.0); - if (sock->flags & ADHOC_F_ALERTSEND) { - result = ERROR_NET_ADHOC_SOCKET_ALERTED; - sock->alerted_flags |= ADHOC_F_ALERTSEND; - } - else if (req.timeout == 0 || now - req.startTime <= req.timeout) { + if (req.timeout == 0 || now - req.startTime <= req.timeout) { return -1; } else @@ -505,6 +508,11 @@ int DoBlockingPtpSend(int uid, AdhocSocketRequest& req, s64& result) { int DoBlockingPtpRecv(int uid, AdhocSocketRequest& req, s64& result) { auto sock = adhocSockets[req.id - 1]; auto& ptpsocket = sock->data.ptp; + if (sock->flags & ADHOC_F_ALERTRECV) { + result = ERROR_NET_ADHOC_SOCKET_ALERTED; + sock->alerted_flags |= ADHOC_F_ALERTRECV; + return 0; + } int ret = recv(uid, (char*)req.buffer, *req.length, MSG_NOSIGNAL); int sockerr = errno; @@ -525,11 +533,7 @@ int DoBlockingPtpRecv(int uid, AdhocSocketRequest& req, s64& result) { } else if (ret == SOCKET_ERROR && (sockerr == EAGAIN || sockerr == EWOULDBLOCK)) { u64 now = (u64)(time_now_d() * 1000000.0); - if (sock->flags & ADHOC_F_ALERTRECV) { - result = ERROR_NET_ADHOC_SOCKET_ALERTED; - sock->alerted_flags |= ADHOC_F_ALERTRECV; - } - else if (req.timeout == 0 || now - req.startTime <= req.timeout) { + if (req.timeout == 0 || now - req.startTime <= req.timeout) { return -1; } else @@ -552,6 +556,12 @@ int DoBlockingPtpRecv(int uid, AdhocSocketRequest& req, s64& result) { int DoBlockingPtpAccept(int uid, AdhocSocketRequest& req, s64& result) { auto sock = adhocSockets[req.id - 1]; auto& ptpsocket = sock->data.ptp; + if (sock->flags & ADHOC_F_ALERTACCEPT) { + result = ERROR_NET_ADHOC_SOCKET_ALERTED; + sock->alerted_flags |= ADHOC_F_ALERTACCEPT; + return 0; + } + sockaddr_in sin; memset(&sin, 0, sizeof(sin)); socklen_t sinlen = sizeof(sin); @@ -573,11 +583,7 @@ int DoBlockingPtpAccept(int uid, AdhocSocketRequest& req, s64& result) { } else if (ret == 0 || (ret == SOCKET_ERROR && (sockerr == EAGAIN || sockerr == EWOULDBLOCK))) { u64 now = (u64)(time_now_d() * 1000000.0); - if (sock->flags & ADHOC_F_ALERTACCEPT) { - result = ERROR_NET_ADHOC_SOCKET_ALERTED; - sock->alerted_flags |= ADHOC_F_ALERTACCEPT; - } - else if (req.timeout == 0 || now - req.startTime <= req.timeout) { + if (req.timeout == 0 || now - req.startTime <= req.timeout) { return -1; } else { @@ -596,8 +602,13 @@ int DoBlockingPtpAccept(int uid, AdhocSocketRequest& req, s64& result) { int DoBlockingPtpConnect(int uid, AdhocSocketRequest& req, s64& result) { auto sock = adhocSockets[req.id - 1]; auto& ptpsocket = sock->data.ptp; - int sockerr; + if (sock->flags & ADHOC_F_ALERTCONNECT) { + result = ERROR_NET_ADHOC_SOCKET_ALERTED; + sock->alerted_flags |= ADHOC_F_ALERTCONNECT; + return 0; + } + int sockerr; // Wait for Connection (assuming "connect" has been called before) int ret = IsSocketReady(uid, false, true, &sockerr); @@ -619,11 +630,7 @@ int DoBlockingPtpConnect(int uid, AdhocSocketRequest& req, s64& result) { // Timeout else if (ret == 0) { u64 now = (u64)(time_now_d() * 1000000.0); - if (sock->flags & ADHOC_F_ALERTCONNECT) { - result = ERROR_NET_ADHOC_SOCKET_ALERTED; - sock->alerted_flags |= ADHOC_F_ALERTCONNECT; - } - else if (req.timeout == 0 || now - req.startTime <= req.timeout) { + if (req.timeout == 0 || now - req.startTime <= req.timeout) { return -1; } else { @@ -646,6 +653,11 @@ int DoBlockingPtpConnect(int uid, AdhocSocketRequest& req, s64& result) { int DoBlockingPtpFlush(int uid, AdhocSocketRequest& req, s64& result) { auto sock = adhocSockets[req.id - 1]; auto& ptpsocket = sock->data.ptp; + if (sock->flags & ADHOC_F_ALERTFLUSH) { + result = ERROR_NET_ADHOC_SOCKET_ALERTED; + sock->alerted_flags |= ADHOC_F_ALERTFLUSH; + return 0; + } // Try Sending Empty Data int sockerr = FlushPtpSocket(uid); @@ -653,11 +665,7 @@ int DoBlockingPtpFlush(int uid, AdhocSocketRequest& req, s64& result) { if (sockerr == EAGAIN || sockerr == EWOULDBLOCK) { u64 now = (u64)(time_now_d() * 1000000.0); - if (sock->flags & ADHOC_F_ALERTFLUSH) { - result = ERROR_NET_ADHOC_SOCKET_ALERTED; - sock->alerted_flags |= ADHOC_F_ALERTFLUSH; - } - else if (req.timeout == 0 || now - req.startTime <= req.timeout) { + if (req.timeout == 0 || now - req.startTime <= req.timeout) { return -1; } else @@ -1305,6 +1313,12 @@ static int sceNetAdhocPdpSend(int id, const char *mac, u32 port, void *data, int if (timeout > 0) setSockTimeout(pdpsocket.id, SO_SNDTIMEO, timeout); + if (socket->flags & ADHOC_F_ALERTSEND) { + socket->alerted_flags |= ADHOC_F_ALERTSEND; + + return hleLogError(SCENET, ERROR_NET_ADHOC_SOCKET_ALERTED, "socket alerted"); + } + // Single Target if (!isBroadcastMAC(daddr)) { // Fill in Target Structure @@ -1530,6 +1544,12 @@ static int sceNetAdhocPdpRecv(int id, void *addr, void * port, void *buf, void * if (timeout > 0) setSockTimeout(pdpsocket.id, SO_RCVTIMEO, timeout); + if (socket->flags & ADHOC_F_ALERTRECV) { + socket->alerted_flags |= ADHOC_F_ALERTRECV; + + return hleLogError(SCENET, ERROR_NET_ADHOC_SOCKET_ALERTED, "socket alerted"); + } + // Sender Address sockaddr_in sin; @@ -3172,6 +3192,12 @@ static int sceNetAdhocPtpAccept(int id, u32 peerMacAddrPtr, u32 peerPortPtr, int auto& ptpsocket = socket->data.ptp; socket->nonblocking = flag; + if (socket->flags & ADHOC_F_ALERTACCEPT) { + socket->alerted_flags |= ADHOC_F_ALERTACCEPT; + + return hleLogError(SCENET, ERROR_NET_ADHOC_SOCKET_ALERTED, "socket alerted"); + } + // Listener Socket if (ptpsocket.state == ADHOC_PTP_STATE_LISTEN) { hleEatMicro(500); @@ -3255,6 +3281,12 @@ static int sceNetAdhocPtpConnect(int id, int timeout, int flag) { auto& ptpsocket = socket->data.ptp; socket->nonblocking = flag; + if (socket->flags & ADHOC_F_ALERTCONNECT) { + socket->alerted_flags |= ADHOC_F_ALERTCONNECT; + + return hleLogError(SCENET, ERROR_NET_ADHOC_SOCKET_ALERTED, "socket alerted"); + } + // Phantasy Star Portable 2 will try to reconnect even when previous connect already success, so we should return success too if it's already connected if (ptpsocket.state == ADHOC_PTP_STATE_ESTABLISHED) return 0; @@ -3597,6 +3629,12 @@ static int sceNetAdhocPtpSend(int id, u32 dataAddr, u32 dataSizeAddr, int timeou // Apply Send Timeout Settings to Socket if (timeout > 0) setSockTimeout(ptpsocket.id, SO_SNDTIMEO, timeout); + + if (socket->flags & ADHOC_F_ALERTSEND) { + socket->alerted_flags |= ADHOC_F_ALERTSEND; + + return hleLogError(SCENET, ERROR_NET_ADHOC_SOCKET_ALERTED, "socket alerted"); + } // Acquire Network Lock // _acquireNetworkLock(); @@ -3689,6 +3727,12 @@ static int sceNetAdhocPtpRecv(int id, u32 dataAddr, u32 dataSizeAddr, int timeou if (timeout > 0) setSockTimeout(ptpsocket.id, SO_RCVTIMEO, timeout); + if (socket->flags & ADHOC_F_ALERTRECV) { + socket->alerted_flags |= ADHOC_F_ALERTRECV; + + return hleLogError(SCENET, ERROR_NET_ADHOC_SOCKET_ALERTED, "socket alerted"); + } + // Acquire Network Lock // _acquireNetworkLock(); @@ -3797,6 +3841,12 @@ static int sceNetAdhocPtpFlush(int id, int timeout, int nonblock) { auto& ptpsocket = socket->data.ptp; socket->nonblocking = nonblock; + if (socket->flags & ADHOC_F_ALERTFLUSH) { + socket->alerted_flags |= ADHOC_F_ALERTFLUSH; + + return hleLogError(SCENET, ERROR_NET_ADHOC_SOCKET_ALERTED, "socket alerted"); + } + // Connected Socket if (ptpsocket.state == ADHOC_PTP_STATE_ESTABLISHED) { hleEatMicro(1000); From 1bfe0897852bf50c12f47afe1ef660c064b279f2 Mon Sep 17 00:00:00 2001 From: ANR2ME Date: Sun, 25 Oct 2020 05:06:55 +0700 Subject: [PATCH 117/275] Added delay result to SetSocketAlert for other threads that use the socket to trigger the alert. --- Core/HLE/sceNetAdhoc.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Core/HLE/sceNetAdhoc.cpp b/Core/HLE/sceNetAdhoc.cpp index cc30552391..14124abc2a 100644 --- a/Core/HLE/sceNetAdhoc.cpp +++ b/Core/HLE/sceNetAdhoc.cpp @@ -1685,7 +1685,7 @@ int NetAdhoc_SetSocketAlert(int id, s32_le flag) { adhocSockets[id - 1]->flags = flg; adhocSockets[id - 1]->alerted_flags = 0; - return 0; + return hleDelayResult(0, "set socket alert delay", 1000); } // Flags seems to be bitmasks of ADHOC_F_ALERT... (need more games to test this) From bff18c07d00a1ffb6e754ab5da76313d2460ea3b Mon Sep 17 00:00:00 2001 From: ANR2ME Date: Thu, 22 Oct 2020 16:09:17 +0700 Subject: [PATCH 118/275] Fixed unable to see game room issue on Air Conflicts - Aces Of World War 2, should also fix other games with similar issue (due to invalid group mode) --- Core/HLE/proAdhoc.cpp | 7 ++++++- Core/HLE/proAdhoc.h | 8 ++++---- Core/HLE/sceNetAdhoc.cpp | 5 +++-- 3 files changed, 13 insertions(+), 7 deletions(-) diff --git a/Core/HLE/proAdhoc.cpp b/Core/HLE/proAdhoc.cpp index 9eaf171a02..689d6ac73d 100644 --- a/Core/HLE/proAdhoc.cpp +++ b/Core/HLE/proAdhoc.cpp @@ -21,6 +21,10 @@ // This is a direct port of Coldbird's code from http://code.google.com/p/aemu/ // All credit goes to him! +#if defined(_WIN32) +#include "Common/CommonWindows.h" +#endif + #if !defined(_WIN32) #include #include @@ -1635,7 +1639,8 @@ int friendFinder(){ // Set group parameters // Since 0 is not a valid active channel we fake the channel for Automatic Channel (JPCSP use 11 as default). Ridge Racer 2 will ignore any groups with channel 0 or that doesn't matched with channel value returned from sceUtilityGetSystemParamInt (which mean sceUtilityGetSystemParamInt must not return channel 0 when connected to a network?) group->channel = parameter.channel; //(parameter.channel == PSP_SYSTEMPARAM_ADHOC_CHANNEL_AUTOMATIC) ? defaultWlanChannel : parameter.channel; - group->mode = adhocctlCurrentMode; + // This Mode should be a valid mode (>=0), probably should be sent by AdhocServer since there are 2 possibilities (Normal and GameMode). Air Conflicts - Aces Of World War 2 (which use GameMode) seems to relies on this Mode value. + group->mode = std::max(ADHOCCTL_MODE_NORMAL, adhocctlCurrentMode); // default to ADHOCCTL_MODE_NORMAL // Link into Group List newnetworks = group; diff --git a/Core/HLE/proAdhoc.h b/Core/HLE/proAdhoc.h index 9edc7d89e2..236d07e5b3 100644 --- a/Core/HLE/proAdhoc.h +++ b/Core/HLE/proAdhoc.h @@ -116,7 +116,7 @@ inline bool isDisconnected(int errcode) { return (errcode == EPIPE || errcode == #define GAMEMODE_INIT_DELAY 10000 // psp strutcs and definitions -#define ADHOCCTL_MODE_NONE -1 +#define ADHOCCTL_MODE_NONE -1 // We only use this internally as initial value before attempting to create/connect/join/scan any group #define ADHOCCTL_MODE_NORMAL 0 // ADHOCCTL_MODE_ADHOC #define ADHOCCTL_MODE_GAMEMODE 1 @@ -141,7 +141,7 @@ inline bool isDisconnected(int errcode) { return (errcode == EPIPE || errcode == // ProductType ( extracted from SSID along with ProductId & GroupName, Pattern = "PSP_([AXS])(.........)_([LG])_(.*)" ) #define PSP_ADHOCCTL_TYPE_COMMERCIAL 0 #define PSP_ADHOCCTL_TYPE_DEBUG 1 -#define PSP_ADHOCCTL_TYPE_SYSTEM 2 +#define PSP_ADHOCCTL_TYPE_SYSTEM 2 // Used for GameSharing? // Kernel Utility Netconf Adhoc Types #define UTILITY_NETCONF_TYPE_CONNECT_ADHOC 2 @@ -393,8 +393,8 @@ typedef struct SceNetAdhocGameModeBufferStat { // Adhoc ID (Game Product Key) #define ADHOCCTL_ADHOCID_LEN 9 typedef struct SceNetAdhocctlAdhocId { - s32_le type; - uint8_t data[ADHOCCTL_ADHOCID_LEN]; + s32_le type; // Air Conflicts - Aces Of World War 2 is using 2 for GameSharing? + uint8_t data[ADHOCCTL_ADHOCID_LEN]; // Air Conflicts - Aces Of World War 2 is using "000000001" for GameSharing? uint8_t padding[3]; } PACK SceNetAdhocctlAdhocId; // should this be packed? #ifdef _MSC_VER diff --git a/Core/HLE/sceNetAdhoc.cpp b/Core/HLE/sceNetAdhoc.cpp index 14124abc2a..3bd7ca2a08 100644 --- a/Core/HLE/sceNetAdhoc.cpp +++ b/Core/HLE/sceNetAdhoc.cpp @@ -1959,6 +1959,7 @@ int sceNetAdhocctlScan() { // Only scan when in Disconnected state, otherwise AdhocServer will kick you out if (adhocctlState == ADHOCCTL_STATE_DISCONNECTED) { adhocctlState = ADHOCCTL_STATE_SCANNING; + adhocctlCurrentMode = ADHOCCTL_MODE_NORMAL; // Reset Networks/Group list to prevent other threads from using these soon to be replaced networks peerlock.lock(); @@ -2013,7 +2014,7 @@ int sceNetAdhocctlGetScanInfo(u32 sizeAddr, u32 bufAddr) { SceNetAdhocctlScanInfoEmu *buf = NULL; if (Memory::IsValidAddress(bufAddr)) buf = (SceNetAdhocctlScanInfoEmu *)Memory::GetPointer(bufAddr); - INFO_LOG(SCENET, "sceNetAdhocctlGetScanInfo([%08x]=%i, %08x)", sizeAddr, Memory::Read_U32(sizeAddr), bufAddr); + INFO_LOG(SCENET, "sceNetAdhocctlGetScanInfo([%08x]=%i, %08x) at %08x", sizeAddr, Memory::Read_U32(sizeAddr), bufAddr, currentMIPS->pc); if (!g_Config.bEnableWlan) { return 0; } @@ -2484,7 +2485,7 @@ int NetAdhocctl_Create(const char* groupName) { // Wait for Status to be connected to prevent Ford Street Racing from Failed to create game session int us = adhocDefaultDelay; - if (adhocctlState != ADHOCCTL_STATE_CONNECTED && iResult == SOCKET_ERROR && friendFinderRunning) { + if (adhocctlState != ADHOCCTL_STATE_CONNECTED && adhocctlState != ADHOCCTL_STATE_GAMEMODE && iResult == SOCKET_ERROR && friendFinderRunning) { AdhocctlRequest req = { OPCODE_CONNECT, {0} }; if (groupNameStruct != NULL) req.group = *groupNameStruct; return WaitBlockingAdhocctlSocket(req, us, "adhocctl connect"); From 22419bfc6ca0292bea44d490944fcb117db348f8 Mon Sep 17 00:00:00 2001 From: ANR2ME Date: Fri, 23 Oct 2020 00:45:08 +0700 Subject: [PATCH 119/275] Prevent memory leaks when clearing AdhocMatching events. --- Core/HLE/sceNetAdhoc.cpp | 24 ++++++++++++++++-------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/Core/HLE/sceNetAdhoc.cpp b/Core/HLE/sceNetAdhoc.cpp index 3bd7ca2a08..176e021b25 100644 --- a/Core/HLE/sceNetAdhoc.cpp +++ b/Core/HLE/sceNetAdhoc.cpp @@ -848,6 +848,19 @@ int WaitBlockingAdhocSocket(u64 threadSocketId, int type, int pspSocketId, void* return ERROR_NET_ADHOC_TIMEOUT; } +// Using matchingId = -1 to delete all matching events +void deleteMatchingEvents(const int matchingId = -1) { + for (auto it = matchingEvents.begin(); it != matchingEvents.end(); ) { + if (matchingId < 0 || it->data[0] == matchingId) { + if (Memory::IsValidAddress(it->data[2])) + userMemory.Free(it->data[2]); + it = matchingEvents.erase(it); + } + else + ++it; + } +} + void netAdhocValidateLoopMemory() { // Allocate Memory if it wasn't valid/allocated after loaded from old SaveState if (!dummyThreadHackAddr || (dummyThreadHackAddr && strcmp("dummythreadhack", kernelMemory.GetBlockTag(dummyThreadHackAddr)) != 0)) { @@ -950,11 +963,11 @@ void __NetAdhocDoState(PointerWrap &p) { if (p.mode == p.MODE_READ) { // Discard leftover events adhocctlEvents.clear(); - matchingEvents.clear(); adhocctlRequests.clear(); adhocSocketRequests.clear(); sendTargetPeers.clear(); deleteAllAdhocSockets(); + deleteMatchingEvents(); // Let's not change "Inited" value when Loading SaveState to prevent memory & port leaks netAdhocMatchingInited = cur_netAdhocMatchingInited; @@ -4194,12 +4207,7 @@ int NetAdhocMatching_Delete(int matchingId) { item = NULL; // Making sure there are no leftover matching events from this session which could cause a crash on the next session - for (auto it = matchingEvents.begin(); it != matchingEvents.end(); ) { - if (it->data[0] == matchingId) - it = matchingEvents.erase(it); - else - ++it; - } + deleteMatchingEvents(matchingId); // Stop Search break; @@ -4238,7 +4246,7 @@ int sceNetAdhocMatchingInit(u32 memsize) { fakePoolSize = memsize; // Initialize Library - matchingEvents.clear(); + deleteMatchingEvents(); netAdhocMatchingInited = true; // Return Success From 0157fe49886ce8dbef607c38b2827bde4430f73a Mon Sep 17 00:00:00 2001 From: ANR2ME Date: Fri, 23 Oct 2020 00:58:56 +0700 Subject: [PATCH 120/275] Updated GameMode API (Fixed Pocket Pool) --- Core/HLE/proAdhoc.cpp | 27 +++++++------- Core/HLE/proAdhoc.h | 5 +++ Core/HLE/sceNetAdhoc.cpp | 80 ++++++++++++++++++++++++++++++---------- Core/HLE/sceNetAdhoc.h | 1 + 4 files changed, 80 insertions(+), 33 deletions(-) diff --git a/Core/HLE/proAdhoc.cpp b/Core/HLE/proAdhoc.cpp index 689d6ac73d..56299de4aa 100644 --- a/Core/HLE/proAdhoc.cpp +++ b/Core/HLE/proAdhoc.cpp @@ -1340,6 +1340,7 @@ int friendFinder(){ INFO_LOG(SCENET, "FriendFinder: Network [RE]Initialized"); // At this point we are most-likely not in a Group within the Adhoc Server, so we should probably reset AdhocctlState adhocctlState = ADHOCCTL_STATE_DISCONNECTED; + netAdhocGameModeEntered = false; } else { networkInited = false; @@ -1425,14 +1426,14 @@ int friendFinder(){ }) == gameModeMacs.end()) { // Arrange the order to be consistent on all players (Host on top), Starting from our self the rest of new players will be added to the back gameModeMacs.push_back(localMac); + + if (gameModeMacs.size() >= requiredGameModeMacs.size()) { + //adhocctlState = ADHOCCTL_STATE_GAMEMODE; + notifyAdhocctlHandlers(ADHOCCTL_EVENT_GAME, 0); + } } else WARN_LOG(SCENET, "GameMode SelfMember [%s] Already Existed!", mac2str(&localMac).c_str()); - - if (gameModeMacs.size() >= requiredGameModeMacs.size()) { - //adhocctlState = ADHOCCTL_STATE_GAMEMODE; - notifyAdhocctlHandlers(ADHOCCTL_EVENT_GAME, 0); - } } else { //adhocctlState = ADHOCCTL_STATE_CONNECTED; @@ -1527,17 +1528,17 @@ int friendFinder(){ it = gameModeMacs.begin() + 1; gameModeMacs.insert(it, packet->mac); } + + // From JPCSP: Join complete when all the required MACs have joined + if (requiredGameModeMacs.size() > 0 && gameModeMacs.size() == requiredGameModeMacs.size()) { + // TODO: Should we replace gameModeMacs contents with requiredGameModeMacs contents to make sure they are in the same order with macs from sceNetAdhocctlCreateEnterGameMode? But may not be consistent with the list on client side! + //gameModeMacs = requiredGameModeMacs; + //adhocctlState = ADHOCCTL_STATE_GAMEMODE; + notifyAdhocctlHandlers(ADHOCCTL_EVENT_GAME, 0); + } } else WARN_LOG(SCENET, "GameMode Member [%s] Already Existed!", mac2str(&packet->mac).c_str()); - - // From JPCSP: Join complete when all the required MACs have joined - if (requiredGameModeMacs.size() > 0 && gameModeMacs.size() >= requiredGameModeMacs.size()) { - // TODO: Should we replace gameModeMacs contents with requiredGameModeMacs contents to make sure they are in the same order with macs from sceNetAdhocctlCreateEnterGameMode? But may not be consistent with the list on client side! - //gameModeMacs = requiredGameModeMacs; - //adhocctlState = ADHOCCTL_STATE_GAMEMODE; - notifyAdhocctlHandlers(ADHOCCTL_EVENT_GAME, 0); - } } // Update HUD User Count diff --git a/Core/HLE/proAdhoc.h b/Core/HLE/proAdhoc.h index 236d07e5b3..b956c902f8 100644 --- a/Core/HLE/proAdhoc.h +++ b/Core/HLE/proAdhoc.h @@ -115,6 +115,11 @@ inline bool isDisconnected(int errcode) { return (errcode == EPIPE || errcode == #define GAMEMODE_UPDATE_INTERVAL 500 // 12000 usec on JPCSP, but lower value works better on BattleZone (in order to get full speed 60 FPS) #define GAMEMODE_INIT_DELAY 10000 +// GameMode Type +#define ADHOCCTL_GAMETYPE_1A 1 +#define ADHOCCTL_GAMETYPE_1B 2 +#define ADHOCCTL_GAMETYPE_2A 3 + // psp strutcs and definitions #define ADHOCCTL_MODE_NONE -1 // We only use this internally as initial value before attempting to create/connect/join/scan any group #define ADHOCCTL_MODE_NORMAL 0 // ADHOCCTL_MODE_ADHOC diff --git a/Core/HLE/sceNetAdhoc.cpp b/Core/HLE/sceNetAdhoc.cpp index 176e021b25..860fa1cdce 100644 --- a/Core/HLE/sceNetAdhoc.cpp +++ b/Core/HLE/sceNetAdhoc.cpp @@ -65,7 +65,7 @@ bool netAdhocInited; bool netAdhocctlInited; bool networkInited = false; -bool netAdhocGameModeEntered; +bool netAdhocGameModeEntered = false; bool netAdhocMatchingInited; int netAdhocMatchingStarted = 0; @@ -105,6 +105,7 @@ int matchingInputThread(int matchingId); int AcceptPtpSocket(int ptpId, int newsocket, sockaddr_in& peeraddr, SceNetEtherAddr* addr, u16_le* port); int PollAdhocSocket(SceNetAdhocPollSd* sds, int count, int timeout, int nonblock); int FlushPtpSocket(int socketId); +int NetAdhocGameMode_DeleteMaster(); int NetAdhocctl_ExitGameMode(); static int sceNetAdhocPdpSend(int id, const char* mac, u32 port, void* data, int len, int timeout, int flag); static int sceNetAdhocPdpRecv(int id, void* addr, void* port, void* buf, void* dataLength, u32 timeout, int flag); @@ -1031,6 +1032,11 @@ u32 sceNetAdhocInit() { // Library initialized netAdhocInited = true; + // FIXME: It seems official prx is using sceNetAdhocGameModeDeleteMaster in here? + NetAdhocGameMode_DeleteMaster(); + // Since we are deleting GameMode Master here, we should probably need to make sure GameMode resources all cleared too. + deleteAllGMB(); + // Return Success return hleLogSuccessInfoI(SCENET, 0, "at %08x", currentMIPS->pc); } @@ -2271,6 +2277,10 @@ int NetAdhocctl_Term() { friendFinderThread.join(); } + // Clear GameMode resources + NetAdhocGameMode_DeleteMaster(); + deleteAllGMB(); + // Clear Peer List int32_t peercount = 0; freeFriendsRecursive(friends, &peercount); @@ -2592,7 +2602,7 @@ int NetAdhocctl_CreateEnterGameMode(const char* group_name, int game_type, int n if (!Memory::IsValidAddress(membersAddr)) return ERROR_NET_ADHOCCTL_INVALID_ARG; - if (game_type <= 0 || game_type > 3 || num_members < 2 || num_members > 16 || (game_type == 1 && num_members > 4)) + if (game_type < ADHOCCTL_GAMETYPE_1A || game_type > ADHOCCTL_GAMETYPE_2A || num_members < 2 || num_members > 16 || (game_type == ADHOCCTL_GAMETYPE_1A && num_members > 4)) return ERROR_NET_ADHOCCTL_INVALID_ARG; deleteAllGMB(); @@ -2608,6 +2618,14 @@ int NetAdhocctl_CreateEnterGameMode(const char* group_name, int game_type, int n getLocalMac(&localMac); gameModeMacs.push_back(localMac); + // FIXME: There seems to be an internal Adhocctl Handler on official prx (running on "SceNetAdhocctl" thread) that will try to sync GameMode timings, by using blocking PTP socket: + // 1). PtpListen (srcMacAddress=0x09F20CB4, srcPort=0x8001, bufSize=0x2000, retryDelay=0x30D40, retryCount=0x33, queue=0x1, unk1=0x0) + // 2). PtpAccpet (peerMacAddr=0x09FE2020, peerPortAddr=0x09FE2010, timeout=0x765BB0, nonblock=0x0) - probably for each clients + // 3). PtpSend (data=0x09F20E18, dataSizeAddr=0x09FE2094, timeout=0x627EDA, nonblock=0x0) - not sure what kind of data nor the size (more than 6 bytes) + // 4). PtpFlush (timeout=0x2DC6C0, nonblock=0x0) + // 5 & 6). PtpClose (accepted socket & listen socket) + // When timeout reached, notify user-defined Adhocctl Handlers with ERROR event (ERROR_NET_ADHOC_TIMEOUT) instead of GAMEMODE event + // We have to wait for all the MACs to have joined to go into CONNECTED state adhocctlCurrentMode = ADHOCCTL_MODE_GAMEMODE; adhocConnectionType = ADHOC_CREATE; @@ -2663,6 +2681,13 @@ static int sceNetAdhocctlJoinEnterGameMode(const char * group_name, const char * // Add host mac first gameModeMacs.push_back(*(SceNetEtherAddr*)hostMac); + // FIXME: There seems to be an internal Adhocctl Handler on official prx (running on "SceNetAdhocctl" thread) that will try to sync GameMode timings, by using blocking PTP socket: + // 1). PtpOpen (srcMacAddress=0x09FE2080, srcPort=0x8001, destMacAddress=0x09F20CB4, destPort=0x8001, bufSize=0x2000, retryDelay=0x30D40, retryCount=0x33, unk1=0x0) + // 2). PtpConnect (timeout=0x874CAC, nonblock=0x0) - to host/creator + // 3). PtpRecv (data=0x09F20E18, dataSizeAddr=0x09FE2044, timeout=0x647553, nonblock=0x0) - repeated until data fully received with data address/offset adjusted (increased) and timeout adjusted (decreased), probably also adjusted data size (decreased) on each call + // 4). PtpClose + // When timeout reached, notify user-defined Adhocctl Handlers with ERROR event (ERROR_NET_ADHOC_TIMEOUT) instead of GAMEMODE event + adhocctlCurrentMode = ADHOCCTL_MODE_GAMEMODE; adhocConnectionType = ADHOC_JOIN; netAdhocGameModeEntered = true; @@ -3939,7 +3964,8 @@ static int sceNetAdhocGameModeCreateMaster(u32 dataAddr, int size) { StartGameModeScheduler(size); } - return 0; // returned an id just like CreateReplica? always return 0? + hleEatMicro(GAMEMODE_INIT_DELAY); + return hleLogDebug(SCENET, 0, "success"); // returned an id just like CreateReplica? always return 0? } /** @@ -3965,6 +3991,7 @@ static int sceNetAdhocGameModeCreateReplica(const char *mac, u32 dataAddr, int s if (mac == nullptr || size < 0 || !Memory::IsValidAddress(dataAddr)) return hleLogError(SCENET, ERROR_NET_ADHOCCTL_INVALID_ARG, "invalid arg"); + hleEatMicro(1000); int maxid = 0; auto it = std::find_if(replicaGameModeAreas.begin(), replicaGameModeAreas.end(), [mac, &maxid](GameModeArea const& e) { @@ -4006,26 +4033,31 @@ static int sceNetAdhocGameModeUpdateMaster() { masterGameModeArea.updateTimestamp = CoreTiming::GetGlobalTimeUsScaled(); } + hleEatMicro(1000); + return 0; +} + +int NetAdhocGameMode_DeleteMaster() { + if (masterGameModeArea.data) { + free(masterGameModeArea.data); + } + //NetAdhocPdp_Delete(masterGameModeArea.socket, 0); + masterGameModeArea = { 0 }; + + if (replicaGameModeAreas.size() <= 0) { + NetAdhocPdp_Delete(gameModeSocket, 0); + gameModeSocket = (int)INVALID_SOCKET; + } + return 0; } static int sceNetAdhocGameModeDeleteMaster() { - WARN_LOG(SCENET, "UNTESTED sceNetAdhocGameModeDeleteMaster()"); + WARN_LOG(SCENET, "UNTESTED sceNetAdhocGameModeDeleteMaster() at %08x", currentMIPS->pc); if (isZeroMAC(&masterGameModeArea.mac)) return hleLogError(SCENET, ERROR_NET_ADHOC_NOT_CREATED, "not created"); - if (masterGameModeArea.data) { - free(masterGameModeArea.data); - } - //sceNetAdhocPdpDelete(masterGameModeArea.socket, 0); - masterGameModeArea = { 0 }; - - if (replicaGameModeAreas.size() <= 0) { - sceNetAdhocPdpDelete(gameModeSocket, 0); - gameModeSocket = (int)INVALID_SOCKET; - } - - return 0; + return NetAdhocGameMode_DeleteMaster(); } static int sceNetAdhocGameModeUpdateReplica(int id, u32 infoAddr) { @@ -4056,7 +4088,7 @@ static int sceNetAdhocGameModeUpdateReplica(int id, u32 infoAddr) { memcpy(Memory::GetPointer(gma.addr), gma.data, gma.size); gma.dataUpdated = 0; gmuinfo->updated = 1; - gmuinfo->timeStamp = std::max(gma.updateTimestamp, CoreTiming::GetGlobalTimeUsScaled() - 1000); + gmuinfo->timeStamp = std::max(gma.updateTimestamp, CoreTiming::GetGlobalTimeUsScaled() - defaultLastRecvDelta); } else { gmuinfo->updated = 0; @@ -4066,11 +4098,12 @@ static int sceNetAdhocGameModeUpdateReplica(int id, u32 infoAddr) { } } + hleEatMicro(1000); return 0; } static int sceNetAdhocGameModeDeleteReplica(int id) { - WARN_LOG(SCENET, "UNTESTED sceNetAdhocGameModeDeleteReplica(%i)", id); + WARN_LOG(SCENET, "UNTESTED sceNetAdhocGameModeDeleteReplica(%i) at %08x", id, currentMIPS->pc); auto it = std::find_if(replicaGameModeAreas.begin(), replicaGameModeAreas.end(), [id](GameModeArea const& e) { return e.id == id; @@ -5262,6 +5295,10 @@ void __NetTriggerCallbacks() { newState = ADHOCCTL_STATE_GAMEMODE; delayus = adhocEventDelay; + // TODO: Use blocking PTP connection to sync the timing just like official prx did (which is done before notifying user-defined Adhocctl Handlers) + // Workaround: Extra delay to prevent Joining player to progress faster than the Creator on Pocket Pool, but unbalanced delays could cause an issue on Shaun White Snowboarding :( + if (adhocConnectionType == ADHOC_JOIN) + delayus += adhocExtraDelay * 3; // Shows player list INFO_LOG(SCENET, "GameMode - All players have joined:"); int i = 0; @@ -5384,8 +5421,10 @@ const HLEFunction sceNetAdhocMatching[] = { }; int NetAdhocctl_ExitGameMode() { - if (gameModeSocket > 0) - sceNetAdhocPdpDelete(gameModeSocket, 0); + if (gameModeSocket > 0) { + NetAdhocPdp_Delete(gameModeSocket, 0); + gameModeSocket = (int)INVALID_SOCKET; + } deleteAllGMB(); @@ -5419,6 +5458,7 @@ static int sceNetAdhocctlGetGameModeInfo(u32 infoAddr) { break; } + hleEatMicro(1000); return 0; } diff --git a/Core/HLE/sceNetAdhoc.h b/Core/HLE/sceNetAdhoc.h index 682a609b2f..b0d2f36fe7 100644 --- a/Core/HLE/sceNetAdhoc.h +++ b/Core/HLE/sceNetAdhoc.h @@ -98,6 +98,7 @@ int NetAdhoc_Term(); extern bool netAdhocInited; extern bool netAdhocctlInited; extern bool networkInited; +extern bool netAdhocGameModeEntered; extern int adhocDefaultTimeout; //3000000 usec extern int adhocDefaultDelay; //10000 extern int adhocExtraDelay; //20000 From 399f56f73b00296992f47b0c7b0f72aaa6dd0a16 Mon Sep 17 00:00:00 2001 From: ANR2ME Date: Sat, 24 Oct 2020 00:50:50 +0700 Subject: [PATCH 121/275] Implementing Adhocctl Busy state to prevent getting kicked out from Adhoc Server on games that tries to leave the group multiple times in a row. Also Updated Adhocctl behavior. --- Core/HLE/proAdhoc.cpp | 7 +- Core/HLE/proAdhoc.h | 3 +- Core/HLE/sceNetAdhoc.cpp | 146 +++++++++++++++++++++++++++------------ 3 files changed, 110 insertions(+), 46 deletions(-) diff --git a/Core/HLE/proAdhoc.cpp b/Core/HLE/proAdhoc.cpp index 56299de4aa..2a69c352ff 100644 --- a/Core/HLE/proAdhoc.cpp +++ b/Core/HLE/proAdhoc.cpp @@ -66,6 +66,7 @@ SceNetAdhocctlPeerInfo * friends = NULL; SceNetAdhocctlScanInfo * networks = NULL; SceNetAdhocctlScanInfo * newnetworks = NULL; u64 adhocctlStartTime = 0; +bool isAdhocctlBusy = false; int adhocctlState = ADHOCCTL_STATE_DISCONNECTED; int adhocctlCurrentMode = ADHOCCTL_MODE_NONE; int adhocConnectionType = ADHOC_CONNECT; @@ -319,7 +320,7 @@ void changeBlockingMode(int fd, int nonblocking) { #endif } -int countAvailableNetworks() { +int countAvailableNetworks(const bool excludeSelf) { // Network Count int count = 0; @@ -327,7 +328,7 @@ int countAvailableNetworks() { SceNetAdhocctlScanInfo * group = networks; // Count Groups - for (; group != NULL; group = group->next) count++; + for (; group != NULL && (!excludeSelf || !isLocalMAC(&group->bssid.mac_addr)); group = group->next) count++; // Return Network Count return count; @@ -1169,6 +1170,7 @@ void AfterAdhocMipsCall::run(MipsCall& call) { u32 v0 = currentMIPS->r[MIPS_REG_V0]; if (__IsInInterrupt()) ERROR_LOG(SCENET, "AfterAdhocMipsCall::run [ID=%i][Event=%d] is Returning Inside an Interrupt!", HandlerID, EventID); SetAdhocctlInCallback(false); + isAdhocctlBusy = false; DEBUG_LOG(SCENET, "AfterAdhocMipsCall::run [ID=%i][Event=%d] [cbId: %u][retV0: %08x]", HandlerID, EventID, call.cbId, v0); //call.setReturnValue(v0); } @@ -1341,6 +1343,7 @@ int friendFinder(){ // At this point we are most-likely not in a Group within the Adhoc Server, so we should probably reset AdhocctlState adhocctlState = ADHOCCTL_STATE_DISCONNECTED; netAdhocGameModeEntered = false; + isAdhocctlBusy = false; } else { networkInited = false; diff --git a/Core/HLE/proAdhoc.h b/Core/HLE/proAdhoc.h index b956c902f8..0fa4cc8c90 100644 --- a/Core/HLE/proAdhoc.h +++ b/Core/HLE/proAdhoc.h @@ -918,6 +918,7 @@ extern bool friendFinderRunning; extern SceNetAdhocctlPeerInfo * friends; extern SceNetAdhocctlScanInfo * networks; extern u64 adhocctlStartTime; +extern bool isAdhocctlBusy; extern int adhocctlState; extern int adhocctlCurrentMode; extern int adhocConnectionType; @@ -1030,7 +1031,7 @@ void changeBlockingMode(int fd, int nonblocking); * Count Virtual Networks by analyzing the Friend List * @return Number of Virtual Networks */ -int countAvailableNetworks(); +int countAvailableNetworks(const bool excludeSelf = false); /* * Find an existing group in networks diff --git a/Core/HLE/sceNetAdhoc.cpp b/Core/HLE/sceNetAdhoc.cpp index 860fa1cdce..9ad7c6d673 100644 --- a/Core/HLE/sceNetAdhoc.cpp +++ b/Core/HLE/sceNetAdhoc.cpp @@ -74,7 +74,7 @@ int adhocDefaultDelay = 10000; //10000 int adhocExtraDelay = 20000; //20000 int adhocEventPollDelay = 100000; //100000; // Same timings with PSP_ADHOCCTL_RECV_TIMEOUT ? int adhocMatchingEventDelay = 30000; //30000 -int adhocEventDelay = 1000000; //1000000 +int adhocEventDelay = 2000000; //2000000 on real PSP ? u32 defaultLastRecvDelta = 10000; //10000 usec worked well for games published by Falcom (ie. Ys vs Sora Kiseki, Vantage Master Portable) SceUID threadAdhocID; @@ -287,6 +287,12 @@ static void __AdhocctlState(u64 userdata, int cyclesLate) { u32 waitVal = __KernelGetWaitValue(threadID, error); if (error == 0) { adhocctlState = waitVal; + // FIXME: It seems Adhocctl is still busy within the Adhocctl Handler function (ie. during callbacks), + // so we should probably set isAdhocctlBusy to false after mispscall are fully executed (ie. in afterAction). + // But since Adhocctl Handler is optional, there might be cases where there are no handler thus no callback/mipcall being triggered, + // so we should probably need to set isAdhocctlBusy to false here too as a workaround (or may be there is internal handler by default?) + if (adhocctlHandlers.empty()) + isAdhocctlBusy = false; } __KernelResumeThreadFromWait(threadID, result); @@ -877,7 +883,7 @@ void netAdhocValidateLoopMemory() { } void __NetAdhocDoState(PointerWrap &p) { - auto s = p.Section("sceNetAdhoc", 1, 7); + auto s = p.Section("sceNetAdhoc", 1, 8); if (!s) return; @@ -960,6 +966,14 @@ void __NetAdhocDoState(PointerWrap &p) { else { adhocctlStateEvent = -1; } + if (s >= 8) { + Do(p, isAdhocctlBusy); + Do(p, netAdhocGameModeEntered); + } + else { + isAdhocctlBusy = false; + netAdhocGameModeEntered = false; + } if (p.mode == p.MODE_READ) { // Discard leftover events @@ -1031,6 +1045,7 @@ u32 sceNetAdhocInit() { if (!netAdhocInited) { // Library initialized netAdhocInited = true; + isAdhocctlBusy = false; // FIXME: It seems official prx is using sceNetAdhocGameModeDeleteMaster in here? NetAdhocGameMode_DeleteMaster(); @@ -1128,9 +1143,10 @@ static int sceNetAdhocPdpCreate(const char *mac, int port, int bufferSize, u32 f // Valid Arguments are supplied if (mac != NULL && bufferSize > 0) { // Port is in use by another PDP Socket. - // TODO: Need to test whether using the same PDP port is allowed or not, since PDP/UDP is connectionless it might be allowed. - if (isPDPPortInUse(port)) + if (isPDPPortInUse(port)) { + // FIXME: When PORT_IN_USE error occured it seems the index to the socket id also increased, which means it tries to create & bind the socket first and then closes it due to failed to bind return hleLogDebug(SCENET, ERROR_NET_ADHOC_PORT_IN_USE, "port in use"); + } //sport 0 should be shifted back to 0 when using offset Phantasy Star Portable 2 use this if (port == 0) port = -static_cast(portOffset); @@ -1183,6 +1199,7 @@ static int sceNetAdhocPdpCreate(const char *mac, int port, int bufferSize, u32 f // Allocated Memory if (internal != NULL) { // Find Free Translator Index + // FIXME: We should probably use an increasing index instead of looking for an empty slot from beginning if we want to simulate a real socket id int i = 0; for (; i < MAX_SOCKET; i++) if (adhocSockets[i] == NULL) break; @@ -1973,10 +1990,18 @@ int sceNetAdhocctlScan() { // Library initialized if (netAdhocctlInited) { - int us = adhocDefaultDelay * 2; + int us = adhocDefaultDelay; + // FIXME: When tested with JPCSP + official prx files it seems when adhocctl in a connected state (ie. joined to a group) attempting to create/connect/join/scan will return a success (without doing anything?) + if ((adhocctlState == ADHOCCTL_STATE_CONNECTED) || (adhocctlState == ADHOCCTL_STATE_GAMEMODE)) { + // TODO: Valhalla Knights 2 need handler notification, but need to test this on games that doesn't use Adhocctl Handler too (not sure if there are games like that tho) + notifyAdhocctlHandlers(ADHOCCTL_EVENT_ERROR, ERROR_NET_ADHOCCTL_ALREADY_CONNECTED); + hleEatMicro(500); + return 0; + } // Only scan when in Disconnected state, otherwise AdhocServer will kick you out - if (adhocctlState == ADHOCCTL_STATE_DISCONNECTED) { + if (adhocctlState == ADHOCCTL_STATE_DISCONNECTED && !isAdhocctlBusy) { + isAdhocctlBusy = true; adhocctlState = ADHOCCTL_STATE_SCANNING; adhocctlCurrentMode = ADHOCCTL_MODE_NORMAL; @@ -2005,22 +2030,16 @@ int sceNetAdhocctlScan() { return WaitBlockingAdhocctlSocket(req, us, "adhocctl scan"); } } - else { - // Return Success and let friendFinder thread to notify the handler when scan completed - // Not delaying here may cause Naruto Shippuden Ultimate Ninja Heroes 3 to get disconnected when the mission started - hleEatMicro(us); - return 0; - } - } - else if (adhocctlState == ADHOCCTL_STATE_SCANNING) - return hleLogError(SCENET, ERROR_NET_ADHOCCTL_BUSY, "busy"); - // Already connected to a group. Should we fake a success? - // We need to notify the handler on success, even if it was faked. Using flag = 0/ADHOCCTL_EVENT_ERROR for error? - notifyAdhocctlHandlers(ADHOCCTL_EVENT_ERROR, ERROR_NET_ADHOCCTL_ALREADY_CONNECTED); - // FIXME: returning ERROR_NET_ADHOCCTL_BUSY may trigger the game (ie. Ford Street Racing) to call sceNetAdhocctlDisconnect, But Not returning a Success(0) will cause Valhalla Knights 2 not working properly - hleEatMicro(us); - return 0; + // Return Success and let friendFinder thread to notify the handler when scan completed + // Not delaying here may cause Naruto Shippuden Ultimate Ninja Heroes 3 to get disconnected when the mission started + hleEatMicro(us); + // FIXME: When tested using JPCSP + official prx files it seems sceNetAdhocctlScan switching to a different thread for at least 100ms after returning success and before executing the next line? + return hleDelayResult(0, "scan delay", adhocEventPollDelay); + } + + // FIXME: Returning BUSY when previous adhocctl handler's callback is not fully executed yet, But returning success and notifying handler's callback with error (ie. ALREADY_CONNECTED) when previous adhocctl handler's callback is fully executed? Is there a case where error = BUSY sent through handler's callback? + return hleLogError(SCENET, ERROR_NET_ADHOCCTL_BUSY, "busy"); } // Library uninitialized @@ -2045,12 +2064,20 @@ int sceNetAdhocctlGetScanInfo(u32 sizeAddr, u32 bufAddr) { // Minimum Argument Requirements if (buflen != NULL) { + // FIXME: Do we need to exclude Groups created by this device it's self? + bool excludeSelf = false; + // Multithreading Lock peerlock.lock(); + // FIXME: When already connected to a group GetScanInfo will return size = 0 ? or may be only hides the group created by it's self? + if (adhocctlState == ADHOCCTL_STATE_CONNECTED || adhocctlState == ADHOCCTL_STATE_GAMEMODE) { + *buflen = 0; + DEBUG_LOG(SCENET, "NetworkList [Available: 0] Already in a Group"); + } // Length Returner Mode - if (buf == NULL) { - int availNetworks = countAvailableNetworks(); + else if (buf == NULL) { + int availNetworks = countAvailableNetworks(excludeSelf); *buflen = availNetworks * sizeof(SceNetAdhocctlScanInfoEmu); DEBUG_LOG(SCENET, "NetworkList [Available: %i]", availNetworks); } @@ -2071,7 +2098,7 @@ int sceNetAdhocctlGetScanInfo(u32 sizeAddr, u32 bufAddr) { SceNetAdhocctlScanInfo * group = networks; // Iterate Group List - for (; group != NULL && discovered < requestcount; group = group->next) { + for (; group != NULL && (!excludeSelf || !isLocalMAC(&group->bssid.mac_addr)) && discovered < requestcount; group = group->next) { // Copy Group Information //buf[discovered] = *group; buf[discovered].group_name = group->group_name; @@ -2106,6 +2133,7 @@ int sceNetAdhocctlGetScanInfo(u32 sizeAddr, u32 bufAddr) { // Multithreading Unlock peerlock.unlock(); + hleEatMicro(2000); // Return Success return 0; } @@ -2164,9 +2192,17 @@ u32 NetAdhocctl_Disconnect() { // Library initialized if (netAdhocctlInited) { int iResult, error; - int us = adhocDefaultDelay * 5; - // Connected State (Adhoc Mode) - if (adhocctlState != ADHOCCTL_STATE_DISCONNECTED) { // (threadStatus == ADHOCCTL_STATE_CONNECTED) + int us = adhocDefaultDelay * 3; + hleEatMicro(1000); + + if (isAdhocctlBusy) { + return ERROR_NET_ADHOCCTL_BUSY; + } + + // Connected State (Adhoc Mode). Attempting to leave a group while not in a group will be kicked out by Adhoc Server (ie. some games tries to disconnect more than once within a short time) + if (adhocctlState != ADHOCCTL_STATE_DISCONNECTED) { + isAdhocctlBusy = true; + // Clear Network Name memset(¶meter.group_name, 0, sizeof(parameter.group_name)); @@ -2196,7 +2232,6 @@ u32 NetAdhocctl_Disconnect() { } else { // Set Disconnected State - //adhocctlState = ADHOCCTL_STATE_DISCONNECTED; return ERROR_NET_ADHOCCTL_BUSY; } } @@ -2226,12 +2261,16 @@ u32 NetAdhocctl_Disconnect() { adhocctlCurrentMode = ADHOCCTL_MODE_NONE; // Notify Event Handlers (even if we weren't connected, not doing this will freeze games like God Eater, which expect this behaviour) - notifyAdhocctlHandlers(ADHOCCTL_EVENT_DISCONNECT, 0); - //hleCheckCurrentCallbacks(); + // FIXME: When there are no handler the state will immediately became ADHOCCTL_STATE_DISCONNECTED ? + if (adhocctlHandlers.empty()) { + adhocctlState = ADHOCCTL_STATE_DISCONNECTED; + } + else { + notifyAdhocctlHandlers(ADHOCCTL_EVENT_DISCONNECT, 0); + } - hleEatMicro(us); // Return Success, some games might ignore returned value and always treat it as success, otherwise repeatedly calling this function - return 0; + return hleDelayResult(0, "disconnect delay", us); } // Library uninitialized @@ -2302,6 +2341,7 @@ int NetAdhocctl_Term() { } threadAdhocID = 0; adhocctlCurrentMode = ADHOCCTL_MODE_NONE; + isAdhocctlBusy = false; netAdhocctlInited = false; } @@ -2459,8 +2499,18 @@ int NetAdhocctl_Create(const char* groupName) { if (netAdhocctlInited) { // Valid Argument if (validNetworkName(groupNameStruct)) { - // Disconnected State, may also need to check for Scanning state to prevent some games from failing to host a game session - if ((adhocctlState == ADHOCCTL_STATE_DISCONNECTED) || (adhocctlState == ADHOCCTL_STATE_SCANNING)) { + // FIXME: When tested with JPCSP + official prx files it seems when adhocctl in a connected state (ie. joined to a group) attempting to create/connect/join/scan will return a success (without doing anything?) + if ((adhocctlState == ADHOCCTL_STATE_CONNECTED) || (adhocctlState == ADHOCCTL_STATE_GAMEMODE)) { + // TODO: Need to test this on games that doesn't use Adhocctl Handler too (not sure if there are games like that tho) + notifyAdhocctlHandlers(ADHOCCTL_EVENT_ERROR, ERROR_NET_ADHOCCTL_ALREADY_CONNECTED); + hleEatMicro(500); + return 0; + } + + // Disconnected State + if (adhocctlState == ADHOCCTL_STATE_DISCONNECTED && !isAdhocctlBusy) { + isAdhocctlBusy = true; + // Set Network Name if (groupNameStruct != NULL) parameter.group_name = *groupNameStruct; @@ -2487,7 +2537,7 @@ int NetAdhocctl_Create(const char* groupName) { if (iResult == SOCKET_ERROR && error != EAGAIN && error != EWOULDBLOCK) { ERROR_LOG(SCENET, "Socket error (%i) when sending", error); - //return ERROR_NET_ADHOCCTL_NOT_INITIALIZED; // ERROR_NET_ADHOCCTL_DISCONNECTED; // ERROR_NET_ADHOCCTL_BUSY; + //Faking success, to prevent Full Auto 2 from freezing while Initializing Network if (adhocctlCurrentMode == ADHOCCTL_MODE_GAMEMODE) { adhocctlState = ADHOCCTL_STATE_GAMEMODE; @@ -2516,7 +2566,8 @@ int NetAdhocctl_Create(const char* groupName) { hleEatMicro(us); // Return Success - return 0; + // FIXME: When tested using JPCSP + official prx files it seems sceNetAdhocctlCreate switching to a different thread for at least 100ms after returning success and before executing the next line. + return hleDelayResult(0, "create/connect/join delay", adhocEventPollDelay); } // Connected State @@ -2958,8 +3009,10 @@ static int sceNetAdhocPtpOpen(const char *srcmac, int sport, const char *dstmac, // Valid Addresses. FIXME: MAC only valid after successful attempt to Create/Connect/Join a Group? (ie. adhocctlCurrentMode != ADHOCCTL_MODE_NONE) if ((adhocctlCurrentMode != ADHOCCTL_MODE_NONE) && saddr != NULL && isLocalMAC(saddr) && daddr != NULL && !isBroadcastMAC(daddr) && !isZeroMAC(daddr)) { // Dissidia 012 will try to reOpen the port without Closing the old one first when PtpConnect failed to try again. - if (isPTPPortInUse(sport, false)) + if (isPTPPortInUse(sport, false)) { + // FIXME: When PORT_IN_USE error occured it seems the index to the socket id also increased, which means it tries to create & bind the socket first and then closes it due to failed to bind return hleLogDebug(SCENET, ERROR_NET_ADHOC_PORT_IN_USE, "port in use"); + } // Random Port required if (sport == 0) { @@ -3019,6 +3072,7 @@ static int sceNetAdhocPtpOpen(const char *srcmac, int sport, const char *dstmac, // Allocated Memory if (internal != NULL) { // Find Free Translator ID + // FIXME: We should probably use an increasing index instead of looking for an empty slot from beginning if we want to simulate a real socket id int i = 0; for (; i < MAX_SOCKET; i++) if (adhocSockets[i] == NULL) break; @@ -3122,6 +3176,7 @@ int AcceptPtpSocket(int ptpId, int newsocket, sockaddr_in& peeraddr, SceNetEther // Allocated Memory if (internal != NULL) { // Find Free Translator ID + // FIXME: We should probably use an increasing index instead of looking for an empty slot from beginning if we want to simulate a real socket id int i = 0; for (; i < MAX_SOCKET; i++) if (adhocSockets[i] == NULL) break; @@ -3496,8 +3551,10 @@ static int sceNetAdhocPtpListen(const char *srcmac, int sport, int bufsize, int // Valid Address. FIXME: MAC only valid after successful attempt to Create/Connect/Join a Group? (ie. adhocctlCurrentMode != ADHOCCTL_MODE_NONE) if ((adhocctlCurrentMode != ADHOCCTL_MODE_NONE) && saddr != NULL && isLocalMAC(saddr)) { // It's allowed to Listen and Open the same PTP port, But it's not allowed to Listen or Open the same PTP port twice. - if (isPTPPortInUse(sport, true)) + if (isPTPPortInUse(sport, true)) { + // FIXME: When PORT_IN_USE error occured it seems the index to the socket id also increased, which means it tries to create & bind the socket first and then closes it due to failed to bind return hleLogDebug(SCENET, ERROR_NET_ADHOC_PORT_IN_USE, "port in use"); + } // Random Port required if (sport == 0) { @@ -3558,6 +3615,7 @@ static int sceNetAdhocPtpListen(const char *srcmac, int sport, int bufsize, int // Allocated Memory if (internal != NULL) { // Find Free Translator ID + // FIXME: We should probably use an increasing index instead of looking for an empty slot from beginning if we want to simulate a real socket id int i = 0; for (; i < MAX_SOCKET; i++) if (adhocSockets[i] == NULL) break; @@ -5255,7 +5313,7 @@ void __NetTriggerCallbacks() { std::lock_guard adhocGuard(adhocEvtMtx); hleSkipDeadbeef(); - int delayus = 10000; + int delayus = adhocDefaultDelay; auto params = adhocctlEvents.begin(); if (params != adhocctlEvents.end()) @@ -5282,11 +5340,12 @@ void __NetTriggerCallbacks() newState = ADHOCCTL_STATE_CONNECTED; if (adhocConnectionType == ADHOC_CREATE) delayus = adhocEventDelay; // May affects Dissidia 012 and GTA VCS - else if (adhocConnectionType == ADHOC_CONNECT && getActivePeerCount() == 0) + else if (adhocConnectionType == ADHOC_CONNECT) delayus = adhocEventDelay / 2; break; case ADHOCCTL_EVENT_SCAN: // notified only when scan completed? newState = ADHOCCTL_STATE_DISCONNECTED; + //delayus = adhocEventDelay / 2; break; case ADHOCCTL_EVENT_DISCONNECT: newState = ADHOCCTL_STATE_DISCONNECTED; @@ -5316,8 +5375,7 @@ void __NetTriggerCallbacks() newState = ADHOCCTL_STATE_WOL; break; case ADHOCCTL_EVENT_ERROR: - // FIXME: Should we change the state on error or leave it alone? for example after Creating/Joining a group, doing Scan could trigger an error through handler, what about the AdhocctlState after this error? - //newState = ADHOCCTL_STATE_DISCONNECTED; + delayus = adhocDefaultDelay * 3; break; } @@ -5477,7 +5535,7 @@ static int sceNetAdhocctlGetPeerList(u32 sizeAddr, u32 bufAddr) { if (netAdhocctlInited) { // Minimum Arguments if (buflen != NULL) { - // FIXME: Sometimes returing 0x80410682 before AdhocctlGetState became ADHOCCTL_STATE_CONNECTED or related to Auth/Library ? + // FIXME: Sometimes returing 0x80410682 when Adhocctl is still BUSY or before AdhocctlGetState became ADHOCCTL_STATE_CONNECTED or related to Auth/Library ? // Multithreading Lock peerlock.lock(); @@ -5497,6 +5555,8 @@ static int sceNetAdhocctlGetPeerList(u32 sizeAddr, u32 bufAddr) { // Calculate Request Count int requestcount = *buflen / sizeof(SceNetAdhocctlPeerInfoEmu); + // FIXME: When bufAddr is not null but buffer size is smaller than activePeers * sizeof(SceNetAdhocctlPeerInfoEmu), simply return buffer size = 0 without filling the buffer? + // Clear Memory memset(buf, 0, *buflen); From 3aed0c258b467d267417b1364370ec8ee4a5bd34 Mon Sep 17 00:00:00 2001 From: ANR2ME Date: Sun, 25 Oct 2020 06:33:10 +0700 Subject: [PATCH 122/275] Fixed an issue with AdhocMatching where there is a possibility that some data didn't get sent upon AdhocMatchingStop causing Joined players to get timeout. (Fixed Star Wars: The Force Unleashed) --- Core/HLE/sceNetAdhoc.cpp | 84 +++++++++++++++++++++++++++++++++------- 1 file changed, 71 insertions(+), 13 deletions(-) diff --git a/Core/HLE/sceNetAdhoc.cpp b/Core/HLE/sceNetAdhoc.cpp index 9ad7c6d673..89f15f0e3a 100644 --- a/Core/HLE/sceNetAdhoc.cpp +++ b/Core/HLE/sceNetAdhoc.cpp @@ -4738,23 +4738,19 @@ static int sceNetAdhocMatchingSelectTarget(int matchingId, const char *macAddres return hleLogError(SCENET, ERROR_NET_ADHOC_MATCHING_NOT_INITIALIZED, "adhocmatching not initialized"); } -int sceNetAdhocMatchingCancelTargetWithOpt(int matchingId, const char *macAddress, int optLen, u32 optDataPtr) { - WARN_LOG(SCENET, "UNTESTED sceNetAdhocMatchingCancelTargetWithOpt(%i, %s, %i, %08x) at %08x", matchingId, mac2str((SceNetEtherAddr*)macAddress).c_str(), optLen, optDataPtr, currentMIPS->pc); - if (!g_Config.bEnableWlan) - return -1; - +int NetAdhocMatching_CancelTargetWithOpt(int matchingId, const char* macAddress, int optLen, u32 optDataPtr) { // Initialized Library if (netAdhocMatchingInited) { - SceNetEtherAddr * target = (SceNetEtherAddr *)macAddress; - void * opt = NULL; + SceNetEtherAddr* target = (SceNetEtherAddr*)macAddress; + void* opt = NULL; if (Memory::IsValidAddress(optDataPtr)) opt = Memory::GetPointer(optDataPtr); // Valid Arguments if (target != NULL && ((optLen == 0) || (optLen > 0 && opt != NULL))) { // Find Matching Context - SceNetAdhocMatchingContext * context = findMatchingContext(matchingId); + SceNetAdhocMatchingContext* context = findMatchingContext(matchingId); // Found Matching Context if (context != NULL) @@ -4763,7 +4759,7 @@ int sceNetAdhocMatchingCancelTargetWithOpt(int matchingId, const char *macAddres if (context->running) { // Find Peer - SceNetAdhocMatchingMemberInternal * peer = findPeer(context, (SceNetEtherAddr *)target); + SceNetAdhocMatchingMemberInternal* peer = findPeer(context, (SceNetEtherAddr*)target); // Found Peer if (peer != NULL) @@ -4792,6 +4788,7 @@ int sceNetAdhocMatchingCancelTargetWithOpt(int matchingId, const char *macAddres // Marking peer to be timedout instead of deleting immediately peer->lastping = 0; + hleEatCycles(adhocDefaultDelay); // Return Success return 0; } @@ -4819,11 +4816,18 @@ int sceNetAdhocMatchingCancelTargetWithOpt(int matchingId, const char *macAddres return hleLogError(SCENET, ERROR_NET_ADHOC_MATCHING_NOT_INITIALIZED, "adhocmatching not initialized"); } +int sceNetAdhocMatchingCancelTargetWithOpt(int matchingId, const char *macAddress, int optLen, u32 optDataPtr) { + WARN_LOG(SCENET, "UNTESTED sceNetAdhocMatchingCancelTargetWithOpt(%i, %s, %i, %08x) at %08x", matchingId, mac2str((SceNetEtherAddr*)macAddress).c_str(), optLen, optDataPtr, currentMIPS->pc); + if (!g_Config.bEnableWlan) + return -1; + return NetAdhocMatching_CancelTargetWithOpt(matchingId, macAddress, optLen, optDataPtr); +} + int sceNetAdhocMatchingCancelTarget(int matchingId, const char *macAddress) { WARN_LOG(SCENET, "UNTESTED sceNetAdhocMatchingCancelTarget(%i, %s)", matchingId, mac2str((SceNetEtherAddr*)macAddress).c_str()); if (!g_Config.bEnableWlan) return -1; - return sceNetAdhocMatchingCancelTargetWithOpt(matchingId, macAddress, 0, 0); + return NetAdhocMatching_CancelTargetWithOpt(matchingId, macAddress, 0, 0); } int sceNetAdhocMatchingGetHelloOpt(int matchingId, u32 optLenAddr, u32 optDataAddr) { @@ -5400,7 +5404,7 @@ void __NetTriggerCallbacks() void __NetMatchingCallbacks() //(int matchingId) { std::lock_guard adhocGuard(adhocEvtMtx); - int delayus = 10000; + int delayus = adhocDefaultDelay; auto params = matchingEvents.begin(); if (params != matchingEvents.end()) @@ -6878,6 +6882,7 @@ int matchingEventThread(int matchingId) context->eventlock->lock(); // Iterate Message List + int msg_count = 0; ThreadMessage * msg = context->event_stack; for (; msg != NULL; msg = msg->next) { @@ -6895,6 +6900,7 @@ int matchingEventThread(int matchingId) // Notify Event Handlers notifyMatchingHandler(context, msg, opt, bufAddr, bufLen, args); //context->eventlock->lock(); + msg_count++; } // Clear Event Message Stack @@ -6902,6 +6908,7 @@ int matchingEventThread(int matchingId) // Free Stack context->eventlock->unlock(); + INFO_LOG(SCENET, "EventLoop[%d]: Finished (%d msg)", matchingId, msg_count); } // Free memory @@ -7114,11 +7121,62 @@ int matchingInputThread(int matchingId) // TODO: The MatchingInput thread is usi } if (contexts != NULL) { + // Process Last Messages + if (context->input_stack != NULL) + { + // Claim Stack + context->inputlock->lock(); + + // Iterate Message List + int msg_count = 0; + ThreadMessage* msg = context->input_stack; + for (; msg != NULL; msg = msg->next) + { + // Default Optional Data + void* opt = NULL; + + // Grab Optional Data + if (msg->optlen > 0) opt = ((u8*)msg) + sizeof(ThreadMessage); + + // Send Accept Packet + if (msg->opcode == PSP_ADHOC_MATCHING_PACKET_ACCEPT) sendAcceptPacket(context, &msg->mac, msg->optlen, opt); + + // Send Join Packet + else if (msg->opcode == PSP_ADHOC_MATCHING_PACKET_JOIN) sendJoinPacket(context, &msg->mac, msg->optlen, opt); + + // Send Cancel Packet + else if (msg->opcode == PSP_ADHOC_MATCHING_PACKET_CANCEL) sendCancelPacket(context, &msg->mac, msg->optlen, opt); + + // Send Bulk Data Packet + else if (msg->opcode == PSP_ADHOC_MATCHING_PACKET_BULK) sendBulkDataPacket(context, &msg->mac, msg->optlen, opt); + + // Send Birth Packet + else if (msg->opcode == PSP_ADHOC_MATCHING_PACKET_BIRTH) sendBirthPacket(context, &msg->mac); + + // Send Death Packet + else if (msg->opcode == PSP_ADHOC_MATCHING_PACKET_DEATH) sendDeathPacket(context, &msg->mac); + + // Cancel Bulk Data Transfer (does nothing as of now as we fire and forget anyway) // Do we need to check DeathPacket and ByePacket here? + //else if(msg->opcode == PSP_ADHOC_MATCHING_PACKET_BULK_ABORT) sendAbortBulkDataPacket(context, &msg->mac, msg->optlen, opt); + + // Pop input stack from front (this should be queue instead of stack?) + context->input_stack = msg->next; + free(msg); + msg = context->input_stack; + msg_count++; + } + + // Free Stack + context->inputlock->unlock(); + INFO_LOG(SCENET, "InputLoop[%d]: Finished (%d msg)", matchingId, msg_count); + } + // Clear IO Message Stack clearStack(context, PSP_ADHOC_MATCHING_INPUT_STACK); - // Send Bye Messages - sendByePacket(context); + // Send Bye Messages. FIXME: Official prx seems to be sending DEATH instead of BYE packet during MatchingStop? + //sendByePacket(context); + sendDeathPacket(context, &context->mac); // Free Peer List Buffer clearPeerList(context); //deleteAllMembers(context); From a47cb101bb5dc0f865c4ea0fc7d1df1cea5cf024 Mon Sep 17 00:00:00 2001 From: ANR2ME Date: Thu, 29 Oct 2020 05:58:12 +0700 Subject: [PATCH 123/275] Moving socket creation from AdhocMatchingCreate to AdhocMatchingStart. (Fixes Dissidia 012 unable to see any room issue) --- Core/HLE/sceNetAdhoc.cpp | 144 ++++++++++++++++++--------------------- 1 file changed, 65 insertions(+), 79 deletions(-) diff --git a/Core/HLE/sceNetAdhoc.cpp b/Core/HLE/sceNetAdhoc.cpp index 89f15f0e3a..65501c38ca 100644 --- a/Core/HLE/sceNetAdhoc.cpp +++ b/Core/HLE/sceNetAdhoc.cpp @@ -4224,6 +4224,12 @@ int NetAdhocMatching_Stop(int matchingId) { } matchingThreads[item->matching_thid] = 0; + // Make sure nobody locking/using the socket + item->socketlock->lock(); + // Delete the socket + NetAdhocPdp_Delete(item->socket, 0); // item->connected = (sceNetAdhocPdpDelete(item->socket, 0) < 0); + item->socketlock->unlock(); + // Multithreading Lock peerlock.lock(); @@ -4274,11 +4280,7 @@ int NetAdhocMatching_Delete(int matchingId) { // Delete the Fake PSP Thread //__KernelDeleteThread(item->matching_thid, SCE_KERNEL_ERROR_THREAD_TERMINATED, "AdhocMatching deleted"); //delete item->matchingThread; - // Make sure nobody locking/using the socket - item->socketlock->lock(); - // Delete the socket - NetAdhocPdp_Delete(item->socket, 0); // item->connected = (sceNetAdhocPdpDelete(item->socket, 0) < 0); - item->socketlock->unlock(); + // Free allocated memories free(item->hello); free(item->rxbuf); @@ -4395,7 +4397,8 @@ static int sceNetAdhocMatchingCreate(int mode, int maxnum, int port, int rxbufle SceNetAdhocMatchingContext * item = contexts; for (; item != NULL; item = item->next) { // Port Match found - if (item->port == port) return ERROR_NET_ADHOC_MATCHING_PORT_IN_USE; + if (item->port == port) + return hleLogError(SCENET, ERROR_NET_ADHOC_MATCHING_PORT_IN_USE, "adhoc matching port in use"); } // Allocate Context Memory @@ -4406,95 +4409,85 @@ static int sceNetAdhocMatchingCreate(int mode, int maxnum, int port, int rxbufle // Create PDP Socket SceNetEtherAddr localmac; getLocalMac(&localmac); - int socket = sceNetAdhocPdpCreate((const char*)&localmac, (uint32_t)port, rxbuflen, 0); - // Created PDP Socket - if (socket > 0) { + + // Clear Memory + memset(context, 0, sizeof(SceNetAdhocMatchingContext)); + + // Allocate Receive Buffer + context->rxbuf = (uint8_t*)malloc(rxbuflen); + + // Allocated Memory + if (context->rxbuf != NULL) { // Clear Memory - memset(context, 0, sizeof(SceNetAdhocMatchingContext)); + memset(context->rxbuf, 0, rxbuflen); - // Allocate Receive Buffer - context->rxbuf = (uint8_t *)malloc(rxbuflen); + // Fill in Context Data + context->id = findFreeMatchingID(); + context->mode = mode; + context->maxpeers = maxnum; + context->port = port; + context->rxbuflen = rxbuflen; + context->resendcounter = init_count; + context->resend_int = rexmt_int; // used as ack timeout on lost packet (ie. not receiving anything after sending)? + context->hello_int = hello_int; // client might set this to 0 + if (keepalive_int < 1) context->keepalive_int = PSP_ADHOCCTL_PING_TIMEOUT; else context->keepalive_int = keepalive_int; // client might set this to 0 + context->keepalivecounter = init_count; // used to multiply keepalive_int as timeout + context->timeout = (((u64)(keepalive_int)+(u64)rexmt_int) * (u64)init_count); + context->timeout += adhocDefaultTimeout; // For internet play we need higher timeout than what the game wanted + context->handler = handler; - // Allocated Memory - if (context->rxbuf != NULL) { - // Clear Memory - memset(context->rxbuf, 0, rxbuflen); + // Fill in Selfpeer + context->mac = localmac; - // Fill in Context Data - context->id = findFreeMatchingID(); - context->mode = mode; - context->maxpeers = maxnum; - context->port = port; - context->socket = socket; - context->rxbuflen = rxbuflen; - context->resendcounter = init_count; - context->resend_int = rexmt_int; // used as ack timeout on lost packet (ie. not receiving anything after sending)? - context->hello_int = hello_int; // client might set this to 0 - if (keepalive_int < 1) context->keepalive_int = PSP_ADHOCCTL_PING_TIMEOUT; else context->keepalive_int = keepalive_int; // client might set this to 0 - context->keepalivecounter = init_count; // used to multiply keepalive_int as timeout - context->timeout = (((u64)(keepalive_int) + (u64)rexmt_int) * (u64)init_count); - context->timeout += adhocDefaultTimeout; // For internet play we need higher timeout than what the game wanted - context->handler = handler; + // Create locks + context->socketlock = new std::recursive_mutex; + context->eventlock = new std::recursive_mutex; + context->inputlock = new std::recursive_mutex; - // Fill in Selfpeer - context->mac = localmac; + // Multithreading Lock + peerlock.lock(); //contextlock.lock(); - // Create locks - context->socketlock = new std::recursive_mutex; - context->eventlock = new std::recursive_mutex; - context->inputlock = new std::recursive_mutex; + // Add Callback Handler + context->handler.entryPoint = callbackAddr; + context->matching_thid = static_cast(matchingThreads.size()); + matchingThreads.push_back(0); - // Multithreading Lock - peerlock.lock(); //contextlock.lock(); - - // Add Callback Handler - context->handler.entryPoint = callbackAddr; - context->matching_thid = static_cast(matchingThreads.size()); - matchingThreads.push_back(0); + // Link Context + //context->connected = true; + context->next = contexts; + contexts = context; - // Link Context - //context->connected = true; - context->next = contexts; - contexts = context; + // Multithreading UnLock + peerlock.unlock(); //contextlock.unlock(); - // Multithreading UnLock - peerlock.unlock(); //contextlock.unlock(); + // Just to make sure Adhoc is already connected + //hleDelayResult(context->id, "give time to init/cleanup", adhocEventDelayMS * 1000); - // Just to make sure Adhoc is already connected - //hleDelayResult(context->id, "give time to init/cleanup", adhocEventDelayMS * 1000); - - // Return Matching ID - return context->id; - } - - // Close PDP Socket - sceNetAdhocPdpDelete(socket, 0); // context->connected = (sceNetAdhocPdpDelete(socket, 0) < 0); + // Return Matching ID + return hleLogDebug(SCENET, context->id, "success"); } // Free Memory free(context); - - // Port in use - if (socket < 1) return ERROR_NET_ADHOC_MATCHING_PORT_IN_USE; // ERROR_NET_ADHOC_MATCHING_NOT_INITIALIZED; // -1; // ERROR_NET_ADHOC_MATCHING_NOT_ESTABLISHED; } // Out of Memory - return ERROR_NET_ADHOC_MATCHING_NO_SPACE; + return hleLogError(SCENET, ERROR_NET_ADHOC_MATCHING_NO_SPACE, "adhoc matching no space"); } // InvalidERROR_NET_Arguments - return ERROR_NET_ADHOC_MATCHING_INVALID_ARG; + return hleLogError(SCENET, ERROR_NET_ADHOC_MATCHING_INVALID_ARG, "adhoc matching invalid arg"); } // Invalid Receive Buffer Size - return ERROR_NET_ADHOC_MATCHING_RXBUF_TOO_SHORT; + return hleLogError(SCENET, ERROR_NET_ADHOC_MATCHING_RXBUF_TOO_SHORT, "adhoc matching rxbuf too short"); } // Invalid Member Limit - return ERROR_NET_ADHOC_MATCHING_INVALID_MAXNUM; + return hleLogError(SCENET, ERROR_NET_ADHOC_MATCHING_INVALID_MAXNUM, "adhoc matching invalid maxnum"); } // Uninitialized Library - return ERROR_NET_ADHOC_MATCHING_NOT_INITIALIZED; + return hleLogError(SCENET, ERROR_NET_ADHOC_MATCHING_NOT_INITIALIZED, "adhoc matching not initialized"); } int NetAdhocMatching_Start(int matchingId, int evthPri, int evthPartitionId, int evthStack, int inthPri, int inthPartitionId, int inthStack, int optLen, u32 optDataAddr) { @@ -4518,18 +4511,11 @@ int NetAdhocMatching_Start(int matchingId, int evthPri, int evthPartitionId, int } //else return ERROR_NET_ADHOC_MATCHING_INVALID_ARG; // ERROR_NET_ADHOC_MATCHING_INVALID_OPTLEN; // Returning Not Success will cause GTA:VC stuck unable to choose host/join menu - //Add your own MAC as a member (only if it's empty?) - /*SceNetAdhocMatchingMemberInternal * peer = addMember(item, &item->mac); - switch (item->mode) { - case PSP_ADHOC_MATCHING_MODE_PARENT: - peer->state = PSP_ADHOC_MATCHING_PEER_OFFER; - break; - case PSP_ADHOC_MATCHING_MODE_CHILD: - peer->state = PSP_ADHOC_MATCHING_PEER_CHILD; - break; - case PSP_ADHOC_MATCHING_MODE_P2P: - peer->state = PSP_ADHOC_MATCHING_PEER_P2P; - }*/ + // Create PDP Socket + int sock = sceNetAdhocPdpCreate((const char*)&item->mac, static_cast(item->port), item->rxbuflen, 0); + item->socket = sock; + if (sock < 1) + return hleLogError(SCENET, ERROR_NET_ADHOC_MATCHING_PORT_IN_USE, "adhoc matching port in use"); // Create & Start the Fake PSP Thread ("matching_ev%d" and "matching_io%d") netAdhocValidateLoopMemory(); From 4eca1247108d79ce4bc7b64a0703ca68e88086b3 Mon Sep 17 00:00:00 2001 From: ANR2ME Date: Thu, 29 Oct 2020 05:48:55 +0700 Subject: [PATCH 124/275] Blocks current thread to synchronize initial GameMode data. Fixes desync issue when GameMode multiplayer mission is being started. --- Core/HLE/proAdhoc.cpp | 26 +++++--- Core/HLE/proAdhoc.h | 2 + Core/HLE/sceNetAdhoc.cpp | 140 +++++++++++++++++++++++++++++---------- Core/HLE/sceNetAdhoc.h | 1 + 4 files changed, 123 insertions(+), 46 deletions(-) diff --git a/Core/HLE/proAdhoc.cpp b/Core/HLE/proAdhoc.cpp index 2a69c352ff..416716561a 100644 --- a/Core/HLE/proAdhoc.cpp +++ b/Core/HLE/proAdhoc.cpp @@ -1405,6 +1405,12 @@ int friendFinder(){ } } + // Calculate EnterGameMode Timeout to prevent waiting forever for disconnected players + if (isAdhocctlBusy && adhocctlState == ADHOCCTL_STATE_DISCONNECTED && adhocctlCurrentMode == ADHOCCTL_MODE_GAMEMODE && netAdhocGameModeEntered && static_cast(now - adhocctlStartTime) > netAdhocEnterGameModeTimeout) { + netAdhocGameModeEntered = false; + notifyAdhocctlHandlers(ADHOCCTL_EVENT_ERROR, ERROR_NET_ADHOC_TIMEOUT); + } + // Handle Packets if (rxpos > 0) { // BSSID Packet @@ -1430,8 +1436,8 @@ int friendFinder(){ // Arrange the order to be consistent on all players (Host on top), Starting from our self the rest of new players will be added to the back gameModeMacs.push_back(localMac); - if (gameModeMacs.size() >= requiredGameModeMacs.size()) { - //adhocctlState = ADHOCCTL_STATE_GAMEMODE; + // FIXME: OPCODE_CONNECT_BSSID only triggered once, but the timing of ADHOCCTL_EVENT_GAME notification could be too soon, since there could be more players that need to join before the event should be notified + if (netAdhocGameModeEntered && gameModeMacs.size() >= requiredGameModeMacs.size()) { notifyAdhocctlHandlers(ADHOCCTL_EVENT_GAME, 0); } } @@ -1533,10 +1539,9 @@ int friendFinder(){ } // From JPCSP: Join complete when all the required MACs have joined - if (requiredGameModeMacs.size() > 0 && gameModeMacs.size() == requiredGameModeMacs.size()) { + if (netAdhocGameModeEntered && requiredGameModeMacs.size() > 0 && gameModeMacs.size() == requiredGameModeMacs.size()) { // TODO: Should we replace gameModeMacs contents with requiredGameModeMacs contents to make sure they are in the same order with macs from sceNetAdhocctlCreateEnterGameMode? But may not be consistent with the list on client side! //gameModeMacs = requiredGameModeMacs; - //adhocctlState = ADHOCCTL_STATE_GAMEMODE; notifyAdhocctlHandlers(ADHOCCTL_EVENT_GAME, 0); } } @@ -1582,13 +1587,14 @@ int friendFinder(){ // Log Incoming Peer Delete Request INFO_LOG(SCENET, "FriendFinder: Incoming Peer Data Delete Request..."); - /*if (adhocctlCurrentMode == ADHOCCTL_MODE_GAMEMODE) { + if (adhocctlCurrentMode == ADHOCCTL_MODE_GAMEMODE) { auto peer = findFriendByIP(packet->ip); - gameModeMacs.erase(std::remove_if(gameModeMacs.begin(), gameModeMacs.end(), - [peer](SceNetEtherAddr const& e) { - return isMacMatch(&e, &peer->mac_addr); - }), gameModeMacs.end()); - }*/ + for (auto& gma : replicaGameModeAreas) + if (isMacMatch(&gma.mac, &peer->mac_addr)) { + gma.updateTimestamp = 0; + break; + } + } // Delete User by IP, should delete by MAC since IP can be shared (behind NAT) isn't? deleteFriendByIP(packet->ip); diff --git a/Core/HLE/proAdhoc.h b/Core/HLE/proAdhoc.h index 0fa4cc8c90..c90a3f9eea 100644 --- a/Core/HLE/proAdhoc.h +++ b/Core/HLE/proAdhoc.h @@ -114,6 +114,7 @@ inline bool isDisconnected(int errcode) { return (errcode == EPIPE || errcode == #define ADHOC_GAMEMODE_PORT 31000 #define GAMEMODE_UPDATE_INTERVAL 500 // 12000 usec on JPCSP, but lower value works better on BattleZone (in order to get full speed 60 FPS) #define GAMEMODE_INIT_DELAY 10000 +#define GAMEMODE_SYNC_TIMEOUT 250000 // GameMode Type #define ADHOCCTL_GAMETYPE_1A 1 @@ -326,6 +327,7 @@ typedef struct GameModeArea { //int socket; // PDP socket? u64 updateTimestamp; int dataUpdated; + int dataSent; SceNetEtherAddr mac; u8* data; // upto "size" bytes started from "addr" ? } PACK GameModeArea; diff --git a/Core/HLE/sceNetAdhoc.cpp b/Core/HLE/sceNetAdhoc.cpp index 65501c38ca..ccfff8378a 100644 --- a/Core/HLE/sceNetAdhoc.cpp +++ b/Core/HLE/sceNetAdhoc.cpp @@ -66,6 +66,7 @@ bool netAdhocctlInited; bool networkInited = false; bool netAdhocGameModeEntered = false; +int netAdhocEnterGameModeTimeout = 15000000; // 15 sec as default timeout, to wait for all players to join bool netAdhocMatchingInited; int netAdhocMatchingStarted = 0; @@ -147,37 +148,79 @@ static void __GameModeNotify(u64 userdata, int cyclesLate) { SceUID threadID = userdata >> 32; int uid = (int)(userdata & 0xFFFFFFFF); - // TODO: May be we should check for timeout too? since EnterGammeMode have timeout arg if (IsGameModeActive()) { auto sock = adhocSockets[gameModeSocket - 1]; - // Send Master data - if (masterGameModeArea.dataUpdated) { - for (auto& gma : replicaGameModeAreas) { - if (IsGameModeActive() && IsSocketReady(sock->data.pdp.id, false, true) > 0) { - int sent = sceNetAdhocPdpSend(gameModeSocket, (const char*)&gma.mac, ADHOC_GAMEMODE_PORT, masterGameModeArea.data, masterGameModeArea.size, 0, ADHOC_F_NONBLOCK); - if (sent >= 0) { - masterGameModeArea.dataUpdated = 0; - DEBUG_LOG(SCENET, "GameMode Sent %d bytes to %s", masterGameModeArea.size, mac2str(&gma.mac).c_str()); + // Need to make sure all replicas have been created before we start syncing data + if (replicaGameModeAreas.size() == (gameModeMacs.size() - 1)) { + // Send Master data + if (masterGameModeArea.dataUpdated) { + int sentcount = 0; + for (auto& gma : replicaGameModeAreas) { + if (!gma.dataSent && IsSocketReady(sock->data.pdp.id, false, true) > 0) { + int sent = sceNetAdhocPdpSend(gameModeSocket, (const char*)&gma.mac, ADHOC_GAMEMODE_PORT, masterGameModeArea.data, masterGameModeArea.size, 0, ADHOC_F_NONBLOCK); + if (sent != ERROR_NET_ADHOC_WOULD_BLOCK) { + gma.dataSent = 1; + DEBUG_LOG(SCENET, "GameMode: Master data Sent %d bytes to Area #%d [%s]", masterGameModeArea.size, gma.id, mac2str(&gma.mac).c_str()); + sentcount++; + } + } + else if (gma.dataSent) sentcount++; + } + if (sentcount == replicaGameModeAreas.size()) + masterGameModeArea.dataUpdated = 0; + } + // Need to sync (send + recv) all players initial data (data from CreateMaster) after Master + All Replicas are created, and before the first UpdateMaster / UpdateReplica is called for Star Wars The Force Unleashed to show the correct players color on minimap (also prevent Starting issue on other GameMode games) + else { + u32 error; + SceUID waitID = __KernelGetWaitID(threadID, WAITTYPE_NET, error); + if (error == 0 && waitID == sock->data.pdp.id) { + // Resume thread after all replicas data have been received + int recvd = 0; + for (auto& gma : replicaGameModeAreas) { + // Either replicas new data has been received or that player has been disconnected + if (gma.dataUpdated || gma.updateTimestamp == 0) + recvd++; + } + // Resume blocked thread + u64 now = CoreTiming::GetGlobalTimeUsScaled(); + if (recvd == replicaGameModeAreas.size()) { + u32 waitVal = __KernelGetWaitValue(threadID, error); + if (error == 0) { + DEBUG_LOG(SCENET, "GameMode: Resuming Thread %d after Master data Synced (Result = %08x)", threadID, waitVal); + __KernelResumeThreadFromWait(threadID, waitVal); + } + else + ERROR_LOG(SCENET, "GameMode: Error (%08x) on WaitValue %d ThreadID %d", error, waitVal, threadID); + } + // Attempt to Re-Send initial Master data (in case previous packets were lost) + else if (static_cast(now - masterGameModeArea.updateTimestamp) > GAMEMODE_SYNC_TIMEOUT) { + DEBUG_LOG(SCENET, "GameMode: Attempt to Re-Send Master data after Sync Timeout (%d us)", GAMEMODE_SYNC_TIMEOUT); + // Reset Sent marker on players who haven't replied yet (except disconnected players) + for (auto& gma : replicaGameModeAreas) + if (!gma.dataUpdated && gma.updateTimestamp != 0) + gma.dataSent = 0; + masterGameModeArea.updateTimestamp = now; + masterGameModeArea.dataUpdated = 1; } } } - } - // Recv new Replica data. We shouldn't do too much activity on a single event and just try again later after a short delay (1ms or lower, to prevent long sync with max players) - if (IsGameModeActive() && IsSocketReady(sock->data.pdp.id, true, false) > 0) { - SceNetEtherAddr sendermac; - s32_le senderport = ADHOC_GAMEMODE_PORT; - s32_le bufsz = uid; // GAMEMODE_BUFFER_SIZE; - int ret = sceNetAdhocPdpRecv(gameModeSocket, &sendermac, &senderport, gameModeBuffer, &bufsz, 0, ADHOC_F_NONBLOCK); - if (ret >= 0 && bufsz > 0) { - for (auto& gma : replicaGameModeAreas) { - if (IsMatch(gma.mac, sendermac)) { - DEBUG_LOG(SCENET, "GameMode Received %d bytes of new Data for Area [%s]", bufsz, mac2str(&sendermac).c_str()); - memcpy(gma.data, gameModeBuffer, std::min(gma.size, bufsz)); - gma.dataUpdated = 1; - gma.updateTimestamp = CoreTiming::GetGlobalTimeUsScaled(); - break; + // Recv new Replica data when available + if (IsSocketReady(sock->data.pdp.id, true, false) > 0) { + SceNetEtherAddr sendermac; + s32_le senderport = ADHOC_GAMEMODE_PORT; + s32_le bufsz = uid; // GAMEMODE_BUFFER_SIZE; + int ret = sceNetAdhocPdpRecv(gameModeSocket, &sendermac, &senderport, gameModeBuffer, &bufsz, 0, ADHOC_F_NONBLOCK); + if (ret >= 0 && bufsz > 0) { + for (auto& gma : replicaGameModeAreas) { + if (IsMatch(gma.mac, sendermac)) { + DEBUG_LOG(SCENET, "GameMode: Replica data Received %d bytes for Area #%d [%s]", bufsz, gma.id, mac2str(&sendermac).c_str()); + memcpy(gma.data, gameModeBuffer, std::min(gma.size, bufsz)); + gma.dataUpdated = 1; + gma.updateTimestamp = CoreTiming::GetGlobalTimeUsScaled(); + break; + } } } } @@ -969,10 +1012,12 @@ void __NetAdhocDoState(PointerWrap &p) { if (s >= 8) { Do(p, isAdhocctlBusy); Do(p, netAdhocGameModeEntered); + Do(p, netAdhocEnterGameModeTimeout); } else { isAdhocctlBusy = false; netAdhocGameModeEntered = false; + netAdhocEnterGameModeTimeout = 15000000; } if (p.mode == p.MODE_READ) { @@ -2534,6 +2579,7 @@ int NetAdhocctl_Create(const char* groupName) { // Send Packet int iResult = send(metasocket, (const char*)&packet, sizeof(packet), MSG_NOSIGNAL); int error = errno; + adhocctlStartTime = (u64)(time_now_d() * 1000000.0); if (iResult == SOCKET_ERROR && error != EAGAIN && error != EWOULDBLOCK) { ERROR_LOG(SCENET, "Socket error (%i) when sending", error); @@ -2681,6 +2727,7 @@ int NetAdhocctl_CreateEnterGameMode(const char* group_name, int game_type, int n adhocctlCurrentMode = ADHOCCTL_MODE_GAMEMODE; adhocConnectionType = ADHOC_CREATE; netAdhocGameModeEntered = true; + netAdhocEnterGameModeTimeout = timeout; return NetAdhocctl_Create(group_name); } @@ -2742,6 +2789,7 @@ static int sceNetAdhocctlJoinEnterGameMode(const char * group_name, const char * adhocctlCurrentMode = ADHOCCTL_MODE_GAMEMODE; adhocConnectionType = ADHOC_JOIN; netAdhocGameModeEntered = true; + netAdhocEnterGameModeTimeout = timeout; return hleLogDebug(SCENET, NetAdhocctl_Create(group_name), ""); } @@ -4007,6 +4055,7 @@ static int sceNetAdhocGameModeCreateMaster(u32 dataAddr, int size) { if (size < 0 || !Memory::IsValidAddress(dataAddr)) return hleLogError(SCENET, ERROR_NET_ADHOCCTL_INVALID_ARG, "invalid arg"); + hleEatMicro(1000); SceNetEtherAddr localMac; getLocalMac(&localMac); u8* buf = (u8*)realloc(gameModeBuffer, size); @@ -4016,14 +4065,21 @@ static int sceNetAdhocGameModeCreateMaster(u32 dataAddr, int size) { u8* data = (u8*)malloc(size); if (data) { Memory::Memcpy(data, dataAddr, size); - masterGameModeArea = { 0, size, dataAddr, CoreTiming::GetGlobalTimeUsScaled(), 1, localMac, data }; + masterGameModeArea = { 0, size, dataAddr, CoreTiming::GetGlobalTimeUsScaled(), 1, 0, localMac, data }; // Socket's buffer size should fit the largest size from master/replicas, should we waited until master & all replicas to be created first before creating the socket? (ie. the first time UpdateMaster being called?) gameModeSocket = sceNetAdhocPdpCreate((const char*)&localMac, ADHOC_GAMEMODE_PORT, size, 0); StartGameModeScheduler(size); - } - hleEatMicro(GAMEMODE_INIT_DELAY); - return hleLogDebug(SCENET, 0, "success"); // returned an id just like CreateReplica? always return 0? + // Block current thread to sync initial master data + if (gameModeSocket > 0 && replicaGameModeAreas.size() == (gameModeMacs.size() - 1)) { + auto sock = adhocSockets[gameModeSocket - 1]; + __KernelWaitCurThread(WAITTYPE_NET, sock->data.pdp.id, 0, 0, false, "syncing master data"); + DEBUG_LOG(SCENET, "GameMode: Blocking Thread %d to Sync initial Master data", __KernelGetCurThread()); + } + return hleLogDebug(SCENET, 0, "success"); // returned an id just like CreateReplica? always return 0? + } + + return hleLogError(SCENET, ERROR_NET_ADHOC_NOT_CREATED, "not created"); } /** @@ -4059,7 +4115,7 @@ static int sceNetAdhocGameModeCreateReplica(const char *mac, u32 dataAddr, int s // MAC address already existed! if (it != replicaGameModeAreas.end()) { WARN_LOG(SCENET, "sceNetAdhocGameModeCreateReplica - [%s] is already existed (id: %d)", mac2str((SceNetEtherAddr*)mac).c_str(), it->id); - return it->id; + return it->id; // ERROR_NET_ADHOC_ALREADY_CREATED } int ret = 0; @@ -4067,11 +4123,20 @@ static int sceNetAdhocGameModeCreateReplica(const char *mac, u32 dataAddr, int s if (data) { Memory::Memcpy(data, dataAddr, size); //int sock = sceNetAdhocPdpCreate(mac, ADHOC_GAMEMODE_PORT, size, 0); - GameModeArea gma = { maxid + 1, size, dataAddr, CoreTiming::GetGlobalTimeUsScaled(), 0, *(SceNetEtherAddr*)mac, data }; + GameModeArea gma = { maxid + 1, size, dataAddr, CoreTiming::GetGlobalTimeUsScaled(), 0, 0, *(SceNetEtherAddr*)mac, data }; replicaGameModeAreas.push_back(gma); - ret = gma.id; + ret = gma.id; // Valid id for replica is higher than 0? + + // Block current thread to sync initial master data + if (gameModeSocket > 0 && replicaGameModeAreas.size() == (gameModeMacs.size() - 1)) { + auto sock = adhocSockets[gameModeSocket - 1]; + __KernelWaitCurThread(WAITTYPE_NET, sock->data.pdp.id, ret, 0, false, "syncing master data"); + DEBUG_LOG(SCENET, "GameMode: Blocking Thread %d to Sync initial Master data", __KernelGetCurThread()); + } + return hleLogSuccessInfoI(SCENET, ret, "success"); } - return hleLogSuccessInfoI(SCENET, ret, "success"); // valid id for replica started from 1? + + return hleLogError(SCENET, ERROR_NET_ADHOC_NOT_CREATED, "not created"); } static int sceNetAdhocGameModeUpdateMaster() { @@ -4089,8 +4154,11 @@ static int sceNetAdhocGameModeUpdateMaster() { Memory::Memcpy(masterGameModeArea.data, masterGameModeArea.addr, masterGameModeArea.size); masterGameModeArea.dataUpdated = 1; masterGameModeArea.updateTimestamp = CoreTiming::GetGlobalTimeUsScaled(); + // Reset sent marker + for (auto& gma : replicaGameModeAreas) + gma.dataSent = 0; } - + hleEatMicro(1000); return 0; } @@ -4143,7 +4211,7 @@ static int sceNetAdhocGameModeUpdateReplica(int id, u32 infoAddr) { GameModeUpdateInfo* gmuinfo = (GameModeUpdateInfo*)Memory::GetPointer(infoAddr); gmuinfo->length = sizeof(GameModeUpdateInfo); if (gma.data && gma.dataUpdated) { - memcpy(Memory::GetPointer(gma.addr), gma.data, gma.size); + Memory::Memcpy(gma.addr, gma.data, gma.size); gma.dataUpdated = 0; gmuinfo->updated = 1; gmuinfo->timeStamp = std::max(gma.updateTimestamp, CoreTiming::GetGlobalTimeUsScaled() - defaultLastRecvDelta); @@ -5314,10 +5382,10 @@ void __NetTriggerCallbacks() u32_le args[3] = { 0, 0, 0 }; args[0] = flags; args[1] = error; + u64 now = (u64)(time_now_d() * 1000000.0); // FIXME: When Joining a group, Do we need to wait for group creator's peer data before triggering the callback to make sure the game not to thinks we're the group creator? - u64 now = (u64)(time_now_d() * 1000000.0); - if ((flags != ADHOCCTL_EVENT_CONNECT && flags != ADHOCCTL_EVENT_GAME) || adhocConnectionType != ADHOC_JOIN || getActivePeerCount() > 0 || now - adhocctlStartTime > adhocDefaultTimeout) + if ((flags != ADHOCCTL_EVENT_CONNECT && flags != ADHOCCTL_EVENT_GAME) || adhocConnectionType != ADHOC_JOIN || getActivePeerCount() > 0 || static_cast(now - adhocctlStartTime) > adhocDefaultTimeout) { // Since 0 is a valid index to types_ we use -1 to detects if it was loaded from an old save state if (actionAfterAdhocMipsCall < 0) { diff --git a/Core/HLE/sceNetAdhoc.h b/Core/HLE/sceNetAdhoc.h index b0d2f36fe7..73016cc20d 100644 --- a/Core/HLE/sceNetAdhoc.h +++ b/Core/HLE/sceNetAdhoc.h @@ -99,6 +99,7 @@ extern bool netAdhocInited; extern bool netAdhocctlInited; extern bool networkInited; extern bool netAdhocGameModeEntered; +extern int netAdhocEnterGameModeTimeout; extern int adhocDefaultTimeout; //3000000 usec extern int adhocDefaultDelay; //10000 extern int adhocExtraDelay; //20000 From 5ee9cfef0d07bfcb31e752869f1801e978717005 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Mon, 19 Oct 2020 23:28:40 +0200 Subject: [PATCH 125/275] Remove support for D3D11_level_9 (previously only really used for Windows Phone, probably). Can always fall back to D3D9, which is not going away anytime soon and still needs to be there. One less HLSL variant to care about. --- Common/GPU/D3D11/thin3d_d3d11.cpp | 3 +++ GPU/Common/DepalettizeShaderCommon.cpp | 1 - GPU/Common/PresentationCommon.cpp | 3 +-- GPU/Common/ShaderCommon.h | 1 - GPU/D3D11/ShaderManagerD3D11.cpp | 4 ++-- GPU/Directx9/FragmentShaderGeneratorHLSL.cpp | 9 ++++----- GPU/Directx9/VertexShaderGeneratorHLSL.cpp | 8 ++++---- Windows/GPU/D3D11Context.cpp | 3 --- libretro/LibretroD3D11Context.cpp | 6 ++++++ 9 files changed, 20 insertions(+), 18 deletions(-) diff --git a/Common/GPU/D3D11/thin3d_d3d11.cpp b/Common/GPU/D3D11/thin3d_d3d11.cpp index 3827b79052..2c1aaeb1f6 100644 --- a/Common/GPU/D3D11/thin3d_d3d11.cpp +++ b/Common/GPU/D3D11/thin3d_d3d11.cpp @@ -233,6 +233,9 @@ D3D11DrawContext::D3D11DrawContext(ID3D11Device *device, ID3D11DeviceContext *de hWnd_(hWnd), deviceList_(deviceList) { + // We no longer support Windows Phone. + _assert_(featureLevel_ >= D3D_FEATURE_LEVEL_9_3); + // Seems like a fair approximation... caps_.dualSourceBlend = featureLevel_ >= D3D_FEATURE_LEVEL_10_0; caps_.depthClampSupported = featureLevel_ >= D3D_FEATURE_LEVEL_10_0; diff --git a/GPU/Common/DepalettizeShaderCommon.cpp b/GPU/Common/DepalettizeShaderCommon.cpp index 28449d69b9..5a0c7c6e4a 100644 --- a/GPU/Common/DepalettizeShaderCommon.cpp +++ b/GPU/Common/DepalettizeShaderCommon.cpp @@ -329,7 +329,6 @@ void GenerateDepalShader(char *buffer, GEBufferFormat pixelFormat, ShaderLanguag case HLSL_DX9: GenerateDepalShaderFloat(buffer, pixelFormat, language); break; - case HLSL_D3D11_LEVEL9: default: _assert_msg_(false, "Depal shader language not supported: %d", (int)language); } diff --git a/GPU/Common/PresentationCommon.cpp b/GPU/Common/PresentationCommon.cpp index 5d62f1a7fe..e969e390e4 100644 --- a/GPU/Common/PresentationCommon.cpp +++ b/GPU/Common/PresentationCommon.cpp @@ -372,7 +372,7 @@ Draw::Pipeline *PresentationCommon::CreatePipeline(std::vectorfeatureLevel < D3D_FEATURE_LEVEL_10_0) { + ERROR_LOG(G3D, "D3D11 featureLevel not high enough - rejecting!\n"); + return; + } + ptr_D3DCompile = d3d11_->D3DCompile; ID3D11Device1 *device1 = nullptr; From 2432c51f0126b8e1a159adf2fa8df9a5286b94f7 Mon Sep 17 00:00:00 2001 From: ANR2ME Date: Sat, 31 Oct 2020 13:15:24 +0700 Subject: [PATCH 126/275] Updated Minimum Timeout workaround settings to use 0 as default (no override) --- Core/Config.cpp | 2 +- UI/GameSettingsScreen.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Core/Config.cpp b/Core/Config.cpp index c986c6848a..2ef04d1cb8 100644 --- a/Core/Config.cpp +++ b/Core/Config.cpp @@ -972,7 +972,7 @@ static ConfigSetting networkSettings[] = { ConfigSetting("EnableAdhocServer", &g_Config.bEnableAdhocServer, false, true, true), ConfigSetting("proAdhocServer", &g_Config.proAdhocServer, "myneighborsushicat.com", true, true), ConfigSetting("PortOffset", &g_Config.iPortOffset, 0, true, true), - ConfigSetting("MinTimeout", &g_Config.iMinTimeout, 1, true, true), + ConfigSetting("MinTimeout", &g_Config.iMinTimeout, 0, true, true), ConfigSetting("TCPNoDelay", &g_Config.bTCPNoDelay, false, true, true), ConfigSetting("ForcedFirstConnect", &g_Config.bForcedFirstConnect, false, true, true), ConfigSetting("EnableUPnP", &g_Config.bEnableUPnP, false, true, true), diff --git a/UI/GameSettingsScreen.cpp b/UI/GameSettingsScreen.cpp index 6e2da8a3a0..5ae07fd530 100644 --- a/UI/GameSettingsScreen.cpp +++ b/UI/GameSettingsScreen.cpp @@ -842,7 +842,7 @@ void GameSettingsScreen::CreateViews() { networkingSettings->Add(new ItemHeader(n->T("Misc (default = compatiblity)"))); networkingSettings->Add(new PopupSliderChoice(&g_Config.iPortOffset, 0, 60000, n->T("Port offset", "Port offset (0 = PSP compatibility)"), 100, screenManager())); - networkingSettings->Add(new PopupSliderChoice(&g_Config.iMinTimeout, 1, 15000, n->T("Minimum Timeout", "Minimum Timeout (override low latency in ms)"), 100, screenManager())); + networkingSettings->Add(new PopupSliderChoice(&g_Config.iMinTimeout, 0, 15000, n->T("Minimum Timeout", "Minimum Timeout (override in ms, 0 = default)"), 50, screenManager())); networkingSettings->Add(new CheckBox(&g_Config.bTCPNoDelay, n->T("TCP No Delay", "TCP No Delay (faster TCP)"))); networkingSettings->Add(new CheckBox(&g_Config.bForcedFirstConnect, n->T("Forced First Connect", "Forced First Connect (faster Connect)"))); From 47f27ed184393df5fe92d434dafdf9c80429e5cf Mon Sep 17 00:00:00 2001 From: ANR2ME Date: Sat, 31 Oct 2020 13:18:17 +0700 Subject: [PATCH 127/275] Updated Blocking simulation of AdhocSocket (especially PdpRecv) --- Core/HLE/sceNetAdhoc.cpp | 27 +++++++++++++++++++++++++-- 1 file changed, 25 insertions(+), 2 deletions(-) diff --git a/Core/HLE/sceNetAdhoc.cpp b/Core/HLE/sceNetAdhoc.cpp index ccfff8378a..c314e18b6f 100644 --- a/Core/HLE/sceNetAdhoc.cpp +++ b/Core/HLE/sceNetAdhoc.cpp @@ -411,6 +411,7 @@ int DoBlockingPdpRecv(int uid, AdhocSocketRequest& req, s64& result) { if (ret >= 0 && ret <= *req.length) { ret = recvfrom(uid, (char*)req.buffer, *req.length, MSG_NOSIGNAL, (sockaddr*)&sin, &sinlen); // UDP can also receives 0 data, while on TCP receiving 0 data = connection gracefully closed, but not sure whether PDP can send/recv 0 data or not tho + *req.length = 0; if (ret >= 0) { DEBUG_LOG(SCENET, "sceNetAdhocPdpRecv[%i:%u]: Received %u bytes from %s:%u\n", req.id, getLocalPort(uid), ret, inet_ntoa(sin.sin_addr), ntohs(sin.sin_port)); @@ -452,6 +453,28 @@ int DoBlockingPdpRecv(int uid, AdhocSocketRequest& req, s64& result) { else result = ERROR_NET_ADHOC_TIMEOUT; } + // Returning required buffer size when available data in recv buffer is larger than provided buffer size + else if (ret > *req.length) { + WARN_LOG(SCENET, "sceNetAdhocPdpRecv[%i:%u]: Peeked %u/%u bytes from %s:%u\n", req.id, getLocalPort(uid), ret, *req.length, inet_ntoa(sin.sin_addr), ntohs(sin.sin_port)); + *req.length = ret; + + // Peer MAC + SceNetEtherAddr mac; + + // Find Peer MAC + if (resolveIP(sin.sin_addr.s_addr, &mac)) { + // Provide Sender Information + *req.remoteMAC = mac; + *req.remotePort = ntohs(sin.sin_port) - portOffset; + + // FIXME: Do we need to update last recv timestamp? eventhough data hasn't been retrieved yet (ie. peeked) + peerlock.lock(); + auto peer = findFriend(&mac); + if (peer != NULL) peer->last_recv = CoreTiming::GetGlobalTimeUsScaled(); + peerlock.unlock(); + } + result = ERROR_NET_ADHOC_NOT_ENOUGH_SPACE; + } else result = ERROR_NET_ADHOC_TIMEOUT; // ERROR_NET_ADHOC_INVALID_ARG; // ERROR_NET_ADHOC_DISCONNECTED @@ -890,8 +913,8 @@ int WaitBlockingAdhocSocket(u64 threadSocketId, int type, int pspSocketId, void* u64 startTime = (u64)(time_now_d() * 1000000.0); adhocSocketRequests[threadSocketId] = { type, pspSocketId, buffer, len, tmout, startTime, remoteMAC, remotePort }; - // Some games (ie. Power Stone Collection) are using as small as 100 usec timeout - CoreTiming::ScheduleEvent(usToCycles(100), adhocSocketNotifyEvent, threadSocketId); + // Some games (ie. Hitman Reborn Battle Arena 2) are using as small as 50 usec timeout + CoreTiming::ScheduleEvent(usToCycles(1), adhocSocketNotifyEvent, threadSocketId); __KernelWaitCurThread(WAITTYPE_NET, uid, 0, 0, false, reason); // Fallback return value From e56b5592bf253d0f04ff90dbe8206483bb00b44c Mon Sep 17 00:00:00 2001 From: ANR2ME Date: Sat, 31 Oct 2020 13:19:32 +0700 Subject: [PATCH 128/275] Fix significant FPS drops on Hitman Reborn Battle Arena 2 --- Core/HLE/sceNetAdhoc.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Core/HLE/sceNetAdhoc.cpp b/Core/HLE/sceNetAdhoc.cpp index c314e18b6f..2e58a25ead 100644 --- a/Core/HLE/sceNetAdhoc.cpp +++ b/Core/HLE/sceNetAdhoc.cpp @@ -2553,7 +2553,7 @@ int sceNetAdhocctlGetPeerInfo(const char *mac, int size, u32 peerInfoAddr) { // Multithreading Unlock peerlock.unlock(); } - hleEatMicro(1000); + hleEatMicro(100); return retval; } From f5afd98226f67b07c276db7102b3eeae312c62cc Mon Sep 17 00:00:00 2001 From: shenweip <1037567878@qq.com> Date: Sat, 31 Oct 2020 23:25:52 +0800 Subject: [PATCH 129/275] When stops and unloads self module, make sure that the thread is properly deleted. --- Core/HLE/sceKernelModule.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Core/HLE/sceKernelModule.cpp b/Core/HLE/sceKernelModule.cpp index 26d5ef0dce..287eb44f0a 100644 --- a/Core/HLE/sceKernelModule.cpp +++ b/Core/HLE/sceKernelModule.cpp @@ -2362,7 +2362,7 @@ void __KernelReturnFromModuleFunc() { if (module->nm.status == MODULE_STATUS_UNLOADING) { // TODO: Maybe should maintain the exitCode? - sceKernelDeleteThread(it->threadID); + sceKernelTerminateDeleteThread(it->threadID); } else { if (it->statusPtr != 0) Memory::Write_U32(exitStatus, it->statusPtr); From 06b0e33839b4260caa7f950df7e7a19961395e70 Mon Sep 17 00:00:00 2001 From: nassau-tk Date: Sun, 1 Nov 2020 01:02:35 +0900 Subject: [PATCH 130/275] Modified "ltn0/2/4/6 .pgf" I tried made "ltn0.pgf/ltn2.pgf/ltn4.pgf/ltn6.pgf" files. --- assets/flash0/font/ltn0.pgf | Bin 67660 -> 54496 bytes assets/flash0/font/ltn2.pgf | Bin 76692 -> 58456 bytes assets/flash0/font/ltn4.pgf | Bin 78920 -> 55012 bytes assets/flash0/font/ltn6.pgf | Bin 88716 -> 58456 bytes 4 files changed, 0 insertions(+), 0 deletions(-) diff --git a/assets/flash0/font/ltn0.pgf b/assets/flash0/font/ltn0.pgf index bf710feef03fbcfbc4427772971bd2ba423dddc6..73c44c04b425842ef85ba9e3f50860827c8b32e3 100644 GIT binary patch literal 54496 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 JWI9;Y0Dy2fu?0&8^uxFDCqd= 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 diff --git a/assets/flash0/font/ltn2.pgf b/assets/flash0/font/ltn2.pgf index 9ee2763f85fdf5538b35f85ca900e545c16f7982..9b200342639e8c9b636a26d66f5d5e615d7c5f0f 100644 GIT binary patch literal 58456 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 +x%b zwTPQDYmAMq@ss&6JxMnALqbmy(_n8)6?&7@m<|#w^d&)O>&C5ce%z}LL=jESlas9a*J$#>v#41Dd9Pu%X}DI|D+})>CUbLOPa7b?4u0}E5#D5 zp%=%6+^rVF6&!cw9A9QRvKFNC=*C{qW1&DJ|0{hemj&KQtR4pZ2N?31+((e{N21IXTM3i-7Z(uqXpAp+_ZaKK7}Wtas!i0F2GfgkQcZ%&g8-C^0@Juw&= zUo+a?X@e1v24c6jTDvG-h;2Ht2I>|D&Ydf{G0YT1!aG`yZcnU8O|eq{{;hrx-v|g z`}~Q(*rsAK#yN2n;~)rmko&1^y!&hehU zKhAv?dsVfh87H(I#{;GfXm{TO;=&ZEmRH|v`Dlu!)@gOruuI%)qs(8Kj2447QtG~JxOTw+UqQs$XQkU9YE!xs`o(-aXZu4MXw&yYZjMFW4iL0;5S+$Et-ctA!47Obk+X-T()gD#W9(q&V^F0l7;+GUXaOnAnriU z0Kg$J1864g@=>)0*)AK+8i5n0eelfjIo5qlVNLd$Ax(cwql+I@KUyp%iI>9* znv#+mQlGGt6s!MixRu&G+-!K`KWimt_ZDWR@pbgL;LK~GhJ{>)M3iZ2s@!J;eid3P zaxy8d1JIHJZDkbW@AY_b)EBca=n_CAFON-&hjACY|&*6`DcOV2VHZ}wPR-)?4GK3h=C zPj6o@T}NNqoWYsHA!h~)+22`*?gKe;r+5h?<1&8U!i$UtHX~w%lT=o5Mk?iJ(s7{{ zSU;jn@*ssM4`#Vgno{5jG0!cDOk!TRnAG0!D4S((nF8F+!W0H;O?Fom!;H36}L1r^Mq`MIpgi19L=1=T`R8M=yP_2Hg$pbcLEAALjV!VHOs84 z&?l^Uxt%HfXIH2d-*WXpT+6jtnz?50(E#QQLOX&bssgJ0DCotd!EcY}>{LH^2U$%lkP?ZBvo+b zYuzzeh&J57&|0o_F-3YC*3&cg(&U2LmNna2>7|;YDp|bm(rpqV7*CYtK<^lioG6jN zdX$N`a*HxuB_j2D17KT$H$1nY=j-Vd?9Y?)UkysshE+{Nw`HbPa((-Job;D9t|~!i z;>Y%GL)|TpTRObSe$r2HB`^^o?fg;Al3`nwFeZ~{K&V8Z%fXqNtPy2)pCl>*3a?*5dWBLlCaDvN9-s(as3?E@ zV<6fq~&<@VfVYW&IeULj-ztCAf%O*}>4W?Du3$#)oF! zV}3dc_Vnp{-U?d8Ys0PD$yQ^l_TJWtTJ00Hjpf?6%f&41cUcu#?a9_>-?o%AX*V~S zYqYK3ZVqf zY=8aJl{BLw{h>6twN|Fa(fZ=GT4y15?gS=OSmX&6;EinrM5TSFYmK?@&2s;_-&i7h zTl}QgzBoSznW*X$-)MJODsm=X|0*9Fcy$mjNc}REbTDOr1>fUK&B@2#BglL3%(A1w zi+JA9=e$u+J9~4h*#s%NWm_f`F*L3oC z4YG4-59DN9aWRCD-~-l^EGXR#)KUST1EWD~S+qsVkr3z>*oRBYOZw}dDWrKB$f3H_ z2(Np_UF^9roX*$*h_NjOu!Rp9fSj}$q+(6_V1mvw`5$jZSd-X>-j3DMGcWE7L?!ET zr%7G{JPY_?irtWF7;vO=R}__ZeHlKILIor-VhI>=L~%~Y{)f_(K~eXfKEbin+)LqgK14CEl_5~YYV z{}kZUcSuq;Z zk;vn3r8aHa$UE{Bg2Dg-aPe+0eo>huiZpW+O^;DweqjpE{j)n0f(*R+Saq^6gqNOe zYM-N7);_Q4@ZbIuu8a_#lY5y)=W*QHdZJ&lso(5pcgW`b*S^y^Y=891*|!(*kOTSL>ghkD^Bj zJ~k)(f{&QkhiR+txh#CKy{jI2A%b(hI?Va9wp2-jozpm{ll8$JP6-!0hmLkcd$!OBtoF{EV57qB1=aM`RNtaxZ z;S@H`)UJZ6?nrJ95mTVbI2NdbP)QN3byO9Bi$Nr~oTd%pDJ6%5y1}GIkU;K`5H5Pr zNKMq|`$C>mW=#}>e;Le$4Fb7m=DNpRv!CnFR~Jq9ESBDNz06*&mEL!hBObuS4fr3l zE~=-K?^7@44+q}{SqdpZQK?>K4zul`hHoXwo%XIC|6?#A6$KPGkTyj*49;8b?jcY{OG!9ZO z{K$pCq?j*>k1EG!G7LaEhs%v4hX@4*@PWymh5TaP?}CiHI{k2%XPWI%&qVXt%>lO> zcp&fN@CRR%^MwZfd^g1a+ta z<3>OH{=fLu8$laKW(s|_`Bux-ICXW6SfTtWHn05Fu;b)DeQnF8ryGDTjr`N=`sNj< zGCa%R?psm~tq&qasfsszJ`@Wkv?B28`%B)f@0- zA-_EJdhllW^m#O!N)OJ^i6=b_4N@z@$?f6UqMGKEKLUL?m9Mwux1M+oR|?&N@;~6; zwekC}6Q>0Dj=2MaW$xU**;t$3e}Z#4!4Nh=%;Ac`c01^I3dy| zySx&zvny2_X`i0|kA|R4BiHQP&3%ZEO$;Did!Xb(?a=on=bnU8=Jn}U?zPSJ8<@oA zM@w1SkiNFrw!oI>X=45CMn^EF6dv6oxXO@3n6!Jl9u}(4Y2J!(t$S~KcYySR^JKP| zo2#0A`znAK6eN?g37|u4j2TN2(YbP!A_jkf5(-2V5hmcFSxz&`Tp=&4NDfNomi@EZ zlhpif`y*fVVJ0)Q3u{>rxyBB}H4hYS5QkH3yRwR*G5hzPWn%9Zx=A4@+JCp$zguVq zZ?%DE5R7HsKEz(ggSrwZD&0T{=ItlBsz@ddY&4%-r&hJjsLlbu`Gqp-k+xg8-&-T? zt=z?SqrH~1AFY6~HlWpphcHJ=j`>o}OBN0-2iT@Qfa;_Abooqm2d6_SBKWkdkSNO`cT`Q{Czg>Y!|<2WbNu3HnBscj2x zg-SQn7w&L8BKDS|-)NHb-3<2T9$kiXj5*klecHrgyO%L(Kc6ZlS0t1!O9aD|C*hO4 z`(R-xJTUM^=NjcXT!#uUUrd{IW^KX6$<1F|XL+Ux{ijoI8f-yewf6=JS50i^%L7-f zPbUxWD}cx>YVkjNH@Or+KOI8z#Na~gR|2gn<+q~!!@MKR`3b3g9bXflmgXd~NLM+M zw+Su1qX&cjoOiaYSs}D+=GAfL5neFqHj;p)QgH?jK>dRBb2S)KCG(AIb?kiY*z8Ay z6{k8KcV-_iY;D_IfTnQ`N!360*4|{n@;tAeCioiZ<%tt;brjD~z(L_TKo4)20pB)T zwSjaH>&7TE7|}XcT_GB4D$tX!L-{|^vsl=F5fjN)v%kDJq3!v?0BzTS9VIG*G52=c z24Q#VNqhj}7k`-_PgM~Am=O{v^?I6&m}PafzHS$6@`u2}Cj=ef$EENSzTn5*;`3VA zsa4l4m(DuBUrR$7bAEfa=y;;F?b5lnnJl^qP3pW3rvKoF?je6$aN9c=_%dI>Xf)Y0 z%M52~7@>?9_cpq_!gH7BAx54{?Ovqs0NN#BHaIJ!W|6oi%Z->eiIJ{@#NyF8%)M=*Uj|S6N`d7t}nqTy_@$)eT@5V;i-1U{)MB> zzwYaf-P?`mx5W%Gua^RCfa1oH4s<8tNiWM8>5-SVi*N@?j5kkHFEkV1yZ*&zIaSqRKMI6saE5iiN`Eywk=I64HKN_#p@Edb z2x+)nlaZx4W@`SiHC8xN&hBcTF?2epcbeEgQ~J@qHC@^YU7v|+ca?30l*ms=F^)96 z69VVeP{-u~?-q92pXhz~{rwdujmQ{l*kCM0KUUqZb|s`6*zkC+I!<(gW;jD^4-mgv zDqV3l@P-t8D~dM#Ge8>6YvPU?m~JS!n;L60OKN(`8tpf-ct-<&*H8ph;CBjQlDg+d{mLw1dyg*G!aPkF*wh71}02A0IJM-(R_R_@g->9>Y9Gt zuk(;cV-EWT=#E|NVR|m?UPWPEj^O$hsG$QoRW*QBTxiRBDT^u=dRrk4Ta+gs(FO9x z|8oD3e3y9nS&;Rl;tgdW6bmEa!WmV3x(4|x_~fp-U$1FfyqG_kWb8c6TA`5?-jHix zz`@+7*B+~uKH}Y*MaRRUt5oa*63KV$k!rO`)XJ))97uskQUhQgSpXUOBh8cTR-x z@flw^0ay|he#wU@KVX8NYJ+aEtK>Jyca90?dmCmMCaYr3ETVIV7-=GK2S4v96P)YG z#to{)SES#V@%1iTzcFK;;V1NYW@k+{dS3&+GtD`~Yh<(nwlG2vB=glxhu_8buZAJN zkTQPUd-mzy1X))wPwIn&4N;rCdl>*^Un%ww#)8*Hny*|v+>Ec+;B_xeAO8ikAMG#L z1FjY@!5GD%G~prZqnCO2Lw=nu_{yf=((CT0*J+g3{lfnA9Y4sgGss5ezrD_UrqS%W z`rEN9QUb?J(M<_AKe{J*g1ypNX^--Y3Ws$Yy-q!D@7t@@o6kg=U7KDWzic{kuqgRO z@rJsPU@; z8d$%(dRV`P-c40IihrC9jya~cX+6A0o2b`-a6UE06?OSny_<4NO_$?X`5$~qE2r`oN|Fm)CH3K-j*pDe;|8dmC`5nZ)n@{q4M_w&FbAtNa&f;@ z-}QIxGX{+Pny_BGo<4(TfuW{;cZ8^7mD?KM%+Z9jQHHWk*vOjuOI{gToA!)4F^1P9 zO}9?x)o1gfKG)=Z#JXc8yZXW5GWNr=RUa{1hSzZs@eT1mwO8qM?_O=42x;QUmL+Ju z#2`@1G~GvmuNkD*?1vyN!G>os)2p-VF0THxI$3(r(YC!nTv1gZodIz-nZB_mS^g%T z{cztyUA!7Y$I?O3)tJEF_Np6@tsl`8keMtwIR2ziAH7_6CU-#!HjxAZX$a0rlo+Ui z#w(BI#Z60~*KPb5yfo>R-~$1nT9dY|NbJfL2S@&_6bClapF#X76^BZtE^RnB#dzEE z!P+3gR6H;Y5i>Uz6xMlUaS14Nt@T8Eo{L22ri?AOKemAXu88R z`O8()M*VOG{4z43WS~(VAP??~W@)aG($9JI$k+2`R{c-tvB8?*dV_nm}vv(&?W zpTH$vWakWbeAi*gHJ3j3NGXcldX$8!wM$3p@MQTZAW(Q*GCd08{r(gBO<}ncKV5)N zIr1mD1ViB>d1ydjN+yR;K0@`Hs-pkLqi55mZg$75@We{#to_oO>tp`deTV&00#3dR zw}CE8J+2X?okgj+9Ej66MuIF5e8vyf1t& zvwQd$iUanxIP9JtIFrY6!Lf5*Y$Q<)>^EmJm2%!gm3M%tl&6yy}t; zwyp7Zg%j7V>qs+~_r)ccAYjpiYi$cY#4oP|(}?~@rN_OXgyzVD$#CL^Am8kDnD|*4 z#@ADD#v6ZM7_*i?1henLc-(VPSt(ZcIa}{3tj#q5$cvPYYVf~lH`h9&#U3=yo`5bx z0%R~ov0l8)zmU`!=n9hSbW~bL8W4a&CV(^2B^U)`Mxw@!dk@$6)!NnZt9b3PrNWtF zb$UlCi4WYmU+mu`TnW=m?}m+eM0%6VZ;zFkHDTK58;<7yfJDI;0qdZ>gLy{y;l15d zY0&P+oUB*tcH-y1s#(^SEu6{J94*&?%6PPx4eN@*JFxp2xM~3H1tp&KPE~^H_U#M^ Y5W`v!kJ1m1)??R*BFK8R0T3wvU&Nl|mjD0& literal 76692 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 diff --git a/assets/flash0/font/ltn4.pgf b/assets/flash0/font/ltn4.pgf index 12b075101d98d46b4972bb6b911a6980b68a6f2b..b67b3c1d2abe0f1cccac0ae9eeef4f4f6e879f71 100644 GIT binary patch literal 55012 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

U5=Vtqy)A$h9+m!2y|} zA(^qE$gv>}%%@Zs-JL9yLdx~MK22b|BO&qxehhPVzn>|JM4-7Kw_yyRRbc4*-N5~0 zGro7q=$*<6O2xB<888ZZL-|hY`MPK;;FG*t+8~} zm`_J3w8yo=(YmD-o{rnPFD4Kh#D~N|kmBt#QZvv2qS%~4lQts(`!ThGdU!DAQMx%+ zR(atQBC36p4|_c#G$);rkr`5tAd z?82Y)t`M_3-{b86@%iC~mkt(@T*pm85lk2iAu-Gc4|hQ-4J4>LXsIj+%?y_qg~aT} zZ!?<7m#>Lk`h3!4LGZYDrh6-{v~tr{*}mtFEwgzz?^4?}&b!QZo;$8MFvi?DN|xL? z-m%j6VEsFnKMZBYz*Qo}9R*1pje&O*?%ALOQOzPZIBCIEAOY4xpehzqNYqPty?G&9 z>~4r%ygE9Eot9*uD|^nm?7P<9SEn}Jd|l5cRd_{*j92J)bA}`4TpRzKw#gp;ZPx$< z8Q>boG~t~|<)c6=^&gohJh%mv8PP4uk$M$`BRx#m|GuPe$1PozG+Dkg#lD3iDy}xZ zrZvud*ob$$GR9V?*r~S}6|3~NMn$dOW>>t{-{U?|InBGi4D;evoE65o7-tPAaaB3W zNxg){C~5)2iKAjn%Hcs3q%o-=U;INVyl>p{>gYVbpYllCw(h@|HFG}{b!E1=FBTnl z)!41h2}iYxEk^#iUftQdUTRd1ve$A^1#x)vVgLKmSR>B?butuOaBjapo;<^7X-MFV zIIUcrhLDGUj^Vx2nbU|hYvL1zWFa6U^KQ_YtJ=0bpI)PHwludcU8S^oHYladwe=3j z>iApzO8%liRf1YHZ6IEAf}|8z~J&r4OUGI@U9wC>N| z=wDnXA7n>@bNM55a3-;8gl8$df%%>)nspFkWZj9<4DwBMPl$cZGnpoFTqjIuNtzJ2 z?UCBbQlIV{&*tG4PgS~Yx4?VXrdynA4VKobbjL<*k?s5QBk-&qVFV{7>=kIomAZ^VFL&;Zo73U*41yUoUg;ZZ zKGVv1XIT#F9qVlMBMd!Hfel3()-Cg259Wbc?AL5Ci!t3Kw>NoXVj0-`7c>JO!t*K5 z!jdF-uI{WEeaS2EtBl1CR(C6eE8SRhY(UCObA#w+784H~=-LM5YQM`1EuJ;X8jFLTZMLNdMzGj# z&krYdBbrVj)P1}P?g~5tx_*W^wm^JPCb_EM9)UCp6SOqYT9mg(629Ik- zGQwZVTI0>HR~%P-(Y@3W=38p^990}#(HhtEVre}NH_8@7Sr3H3N#4WNrBo7%@5MqJ z>KTs|B7p-KbDhEg;DqS^7txNI!SntUJ;ihFCuh5Ng{_+f|L$bL$vv$10oz6PC=|GT z>^%Db^I^TL`C0|PKy&i>Oor?Sk)aAbHgwuhGPEe;0n-4S1r{{)A_paoIC~;r2DsDc znGJ*IEsL7MKJbfu3f$gymr+(z7i&IO#GaaKacRI$_r+jSs|9<-#;Q1=tt>K53!r$5 z|DliyaEd~k7H5bU|AE>n@-sgL)BQHoEk9F~shr+*Nc`)X7?1n>FZL>19qA4IrwV}s z&4-TrZ;N0C3|&zykVOqKA<13Qo}I!hA{jKKs7Ra1u1ZG8&UAg#y6>)pDvK;9LR)UG zs&Wjm?ptD6t??x)Gt7q|e+wY!7I&2Sv=wnfy(|Sjf<$(t`S5=KBS|75H~@bx z1Q5LfM&B^e`XY~N99gjtOOnbU$cGq2UX?f~b3hb^j8BmJ1Qw#Wvb4xybo3Ns87XqN z;u7*((dI08x12#R-XU}{A^YKD!P9B<;gf87h@I2fkT~wS@Noj~=}N9V<=w2b-4xiJ zMy2h0fxWV^rC48?=BrE%$U;~2@Wvu9JgU*X5CXHxvz7n(3vU#^SWZ z(ZFx<2r^PKgJ{gbxtXCZ@pHCx_`l6B(R(DhHDMe2?i(lsq_*t|kthE#)w+9$Wnp5e zx#W8n8}-|iw%sAD>x+pcI((6j`C}?U)Nhk3ERQ6oSsor^eNdHd-7(YLIuJ4WNeusb zPuNRNmJ;cIBs$4X!nnh6?9@UioTdC!Z>VpGBfL(2qV4tWWUkRwCvS8$bA!8+Zl2^qeS;j~ZJu0yiZ@ab zQ=?-tZjT?*ZE5g`B3>Q?dkuY?g(fL+!8U`R3LhOJ9OAr7-k27aacZqjX`io1j*PI+ z=ZsD^RnxZekh7Ib9c`b=r)p>uflUlH3g@vk7V{b%IZmaiC%~-ICWviMSxS;`mI@hSWG=%ezZbxSHD29wbVoKf-cyG|O&<1(3O#KEO%orxcM7c&6QaEE)U!g)^SLLMYuk2=vuAcnq z>K|HC1@3Qwdjx)pzCwUkd$2j~R_2}}4AO8QO>H=`sq!=gZ4gTE6(`o-c_c2zs z;li?Xiba!5t_VZ!BPBlSed?IX+*+80cfLKT?%<7T($PgVN;0##nPeZhPp99%dSH$M zk;b?A1vz#N`<#7tb6x7ynBu*a%{N0#_bH$E%C2PC?Ci8DO0Dey{&TG@ujN{HvdPuA zYlmuHcd%o!eX1-sxdT&MLE#s_%>X_Lt5+q!x=yW99?wLuL4nDKtSE}{mx~VDDr8Om zdajk3&p6k+mt~j>hb`u#zjL09kVkb#eR?C6-`&W~U&)`;3f$2&A!vSc2-qk)uD!HC zScyU7U7?G$dFA$weZhL$2hN(c(Y{2BGpcUcpW2$M{!#RX^Wv!DDC<-P{*#_oht(|- z$f{C<)K&0Dz>tv?-Wc_pP?NbymoyX|L3AZ*;tQ#_F`5<(=|3 zoo|hGj^mwz%>O@6o@c(pP7q-11Rxgx21veMg>2J=uM?<+rWcB~!(3#bYU9w;i1->D z;tX(LcrpMrbYfS5bIdLuJ-6P;>>o^r-pDOgpcr3|2L{JPqUuyGJr<*$Zec3!e zh>OVlq*ONL-OKKae+^~sH6`@;vI4^(f5AaSzXZg_Sj>H5cu>?}Iw72g5j2*xsrJlq z7&I|)S^mUQe^h)JWtbH#CSVTSmgKsy@>{_3Bv zEVJDF67nAIA8MVKxEAx3(&sKu=AX9?e(Ol9%5o{e5$gzgzAVO&>>Fa*vZA4cJmL;E`Xn834)b=?1 z4snmxO|}^{V#J{+dQ5Ww8V|gTl&gfHP?UjC91^F%087+J)ABRFGW@**rd_weZ5!Gr zCp9oY<Mk2Lv`(Ea z47pD^NAZNFGD3duRKpZ`%B!juwDKnkD+}e5b{lpJ6JN`Jt=eR2tZLK>gKrMHvEEkP zKKH8yLa)w3PxqSo*M%2)r{8)R2mg z6hpr_?V$LW&3b$8gnVypI^r%I!G{CPi}w5N1sU0En3RZ0sS&Ot)z9w%5d{1u{UXN% zciHe63wmb{iiiKOAlejvP)wph8V;o_`i(}lLR7ez73A}D|1|v6JxO=;?{@U>?_N`x zFY+DlvY!@v)eh}9e~L6OUm^3UQod%#bj2Ec2}*rS(Yc|Pws?ou_KIv?O|m1+Hj({K z_&}Cz4*ff;=~^E2`Xk3OY~Q#~t!v2`nujP%PY;Vx81yhKD!7T2?FG}P##12roIh|B z9O4$!(z5))Vzd{WP|)VZzLGN`rp2~8ciD)L6DiSy2E}?j&IuFpVhsuV{pPkD(pwGX zgCsZ*!koGo$xNvR8EbOeMg%1%2Xb0|RZ88|O6xrvy+3JXDRw9C+}kL7+NzlhaTK{E zgiSF>{ycIA_2k`?-Vbw0+=`Y`sAMP2Vg?Z3$ksoq%0?n!rPAhwJs^Ey!>$d#liK8GbiK+7Ml25!k<^OcoirVaS(8r6f<0+(t~7*n7E-Z z1HcKg5U^;^gqA0sBM(Eg5AsI(Ab%{}%;5c-vbCd!g~5P!Ix&nsSsAAcU18K!n^+3ei3CN;sQabwU*7jlxvGnVpjB)2DZ7RQ8{ zwx)yEjO4%1k7oB;`Rn19cdH%bxjZhp`FNQBe&d!BQ&M4HOzbQhHKi$htf%9=@3aE3 z9CjyCK0JQ-Q0V6lDU0#Nz#+m6hfe4p+b}VC@^{0ORR^7j2cJMDj+iuy9muys97PHp z8JG!%MXqg~wow_iX-RC<-t}dU6kmI;6x6;zSrV`Nw=jrGNx}qYM^Xc#rAGxonzFfwEkTDt-gkj8cJO>d<76cYG|Rb z-tjgDEVg=tcxcYBok8jMh8K?(*zk?YhAL(KTm08+l@68W_~(#_UkP7rP?~lX?kW_* ze+d3zas7GW{4ny-@Ns9#)SIxl!46u;M)#t4C#w>SoPB;2E+5QOjzLLC9o8ALuM z5W&XxXYQk^W*WHD#?Gdk6Aj6m*lAS;OUF7xS*hiXvRw0vg%tl=uWZ@XT%|O17Agzn zHQq493%Liq8g|NxNnm;XFO6kJv+e-9D)3)PflMY@ zLO~{SQe!LX+z=4tX5~b?9X85h1JTlyYtPHv)Sn{Mg0K8lWf4EPuknDzm0;Rh=-7Fw zO3$v`DRag|H3u9{;w}h>S6(bc;CIVT*?|S-bC@e1=9mvpla1bEk?pSIa+))&8PQ36 z#WjJq3W`S7V7~3~45Yvo+CtRC>#-!E3WhGm88w?4?FUf^y-tbr5_FxPO4&HG%w=>h z)4x3}bUx>_3-~WOp}e&e6uLgAWxpLpz|K6&wM{m!qRYFW$$3=IKW98$_txT@8q3yb z>w#eSxO$8Mw5#9`_mhl7R9BY=2LSmubr`aeZ<$t3Ej1UM-qzWmzYtmYAkCkCPp>oB zp!Ntd1QC!;`mytJ7+Wewmi?vS$_Ud|?@rmV;UbE+kjA(Uh4Cf=KJ}8g!!bz?s-)>u#ix#y7rJ>D3z?`)`kxdy>YK}+WH{_j*ob({)&bhA z@Q1?@!;+Hp;Il%GZC(jL4AmehftE8tJ*W5^Wr#_^R|t@0{`Snj7+L%vuiy1rsL)#v zgD4>M`-at(m1gB;for7PxJYZGz-}tKQC)BA=h|qw7Gk-v&~{mt(kP#A za)r&~UV{ahCQoT(Q`&_0(wa(zd5y|7N+s66+&P)3>tQqyV-}ZNX$r;#Nwdh3k?{4< z5=%yK2wGJf2dY?UH5%o&7cwumSDbCgr@sYEf6GRZ{0O8-sRv;^f!p3@)H&4l4ng*} zI)}g(TG?yd$s*P#1k5&CT)7UT<;HMFg~dG;o9=?Lz;VpkTMNJtk)@PeF{%Q84RtCx z{zwt<=TF1eKbDpXEu_e*e~}IG1q{k14DYINYYIL^o-kAkw(w%d(J(G1%D$Qe$*)D4Dhuyh+&c%)c z>ukE?wY9ny_kkJsV=oDZ{LV_z+=2`x=b0)si`>2$v1luGP^LK3Dd7;I8Uc<}KgUK> zOCLEi&QRdOm@Ihw)1nz%(JsBfmbPor6EA?nJ^M`HEz92j#p7cCc~3{+(nSW-9i0g| zkBmE7v5|l%0rKqN;>jcD9>$)STn2MMbiChM=0$4=^oDp>om(@O=zzDg6mz!UscK8v z#>(`{(KnSw-GA}FQXfbZNNf*MlNIx&)5KIh$O=kt(Z!+(_+auQr)QjqhYTSvQn6o) zD~7)o@)hks&!5i0H9CsVzESwPeY9-;7H6?UL=1JK5GcyoA*Pi=8h4tUb?{}1RAW+8P?;*vhO`Q$nHEdCDcGc=) z%T)wxJ8Fu}UYW=JV-X00Ls+qAO(oK~6PepGu!po*Qg>l-lkAX|E{eh0c;uRxIyDni z@=3j+RLM~kTK4=|kSJEC33Bp__E6Y!J9<+Xr?e}0GZ1)fDjCb3!*ger~=B&hxciy8ulBiFfHi>I9cN0Uv^}~NfBWTb7r9# zW2{p%aqs7oEBkI}@pQ~>#O7GEQZs9d*QF9UpEOk7s^Gfm+$rSu-Zu_9y2L>e`d zh(@`7YpKxZbX%3#+$^xWjWnI$i-xm}%l7VE7ugu8^iDJ#w$|4P@BfNO7l`~b);00T zH=|p=w1#^k?NL|&;5<25M(Z)8fk$p<=$PW_9<(HKSZFbxnwSi7w#Wn&m2<@5SUS&d z!C=ZU<^Fc`)3{*0uI0wja?^=v`*Y=6Qe?Y`%6?U2>@{3&j4xu_cUHE&Tf;wKt#1^b zBr36r#^03A=Z(TfW4lql(#nqR-dFX9?q3lpX~p0qXh}H5VB~@KP&7Jbx)|-uL@q9} zQ7C##dGF-H_h%{SK;v>#f$VX&W^$Wp@;U_nWTU%Mgz&aUn@?1w*tW`YQ+*qimL=8b zceC6Lw0} z&ak`{W8Ig)jJ?evp>l9)=tsfu!fF%HdSHkYfr`!a2i37fucM)Z(5QhyXjEtf_`sN7 zPIJiJF!`8i(mGBhQwiQwc=_^Vd1!ortsP_CHx$neKlct6J6gK$Go5X#Y!!xhKgMFJ zYZr~m7H4;@js_^JX}eifU)*?Yy~$E!E|MpAX<80iBhJ6;Y~<%(a-AFri>hY?zzOMJ z0s`4ifzd26t!Du83(&AM-!mw*oEcBj9}%lNR^{-_Ji{ZDCqAWMvod@B7(q6*FvPds zRBz`Fc1Q6^T^g>&J^;GL{iZJ)Uuc7FhqxrPJXfQ@W_L$i?_Ol~ERfCfj%Yd5npc0Y zO&01~kIBE{<7%DdF!CL-_)M}l@Y4`hI!ryRya(`&BrYyK3VQCDyVv)_mJfE+cy~mCNobY>%=TWs%oc$&f9u zhh5>FXuH7vxuQ$M7dB&|8aTl9nBoP#Tzd-pS$NqGu9Ju=BchwoGlL*VDf3Viio|MQ z0*PMs4DzxgCk|P!a8V=7OD3Bn#t>ige*&4wCXsJWJt|@kC zuCFt+eEV}%ddt-_Sd`*sn<;0f%yv#t)Yg>Q{vhzlommK}Pp&+L3_1PnF$hK?6a67% z@(UzFk@hJMh1MBNCN_K{5a2i>I!*k(X7VLX5ou}oXIkb%bnP4B*r;pzM){N=o1b=E z;HEU{;jCy}Z?K$OTa3&f#j%YB^Fw;h<7(#5BcbZQLktl`jQrmcGt1vDg}-VS*|c>^ z%h_PtF+sMgUuU(h<(rQ6>E^3P1b%AW7DJ2MxgovjT%}&X8b;euL3SX*wpi%Wqz00~FwX^iD^aiN-&kU%<7z8JS{n6~Sqlrs2Z9RB~)GAdi=IdXsVsQ21} z7FYKwtXu(lbFpq@V{4;hnmZ1R&A$j1Ds~Sqf)YfU6lFyql8CuO_GKExx|k9MI|If> zeHqGAdJb!w7Yn9G+8Npbr@d?Fmp16hq zMp~|pXu0-_n$pp>81Wk~N7G~<1dOSRZey=Dv%mKyRXXiXI3CWo@ncN?oTLU{L66u$ z&L#Pi{dNZwZ^#{RqA<)ln%8i3FeTt*QQ6GA(QIa#A~)JsZMj}!HteA@xcL`5 zj)hwG4mk8t9j{KYvJ2)m26%Q3c-d~#^4$SWEf;QYvVXTN(idYx+I6$C8fbVP^T;N2G^KUF`_BM{;w#11=A+d=h7Sj;O+lN0F+@ z{~fAYcfaxPs3P~?uc^Wk3bYZg7TZWp%h-BiZ5(ocWV8mMq;zJ^Xm)qA;+S^FROKg4 zTGrUnC{Np(2BK<{PuT}6M_8_pw){>Lsl{w#u^>sQRr)fqDN<@JH^OaiI`!k~i<3KE#@uR<^$Ezb>uZRJai`-Nm%Lw$x5k#XgM9Vl0S4!iaRscFt)wO-7x+7+?Yo= zP%V!cX$?uTC&`Z1l{{x(x#UWkBF$N(E^Lrr zMwy&_Z|5~G#A``t?4YD?Ef^NH4~?OoxPt*Q2Tto{}cB(Eq$H>UPzBruZK7Q+ED zT!c7U+{3Hs_fsh3>=zMY+!?>sgZv`RtQFOx^8#J64k{w&%R!#!Xtv1J?pkhcQ?=}} zD}7TVK}NNo3OJ9$%nu)6b1u3rC+2|)zoLwF!IZTglaDM)nCO@+u#9NV5Kz7lNTQ|B z{%{bMn2GUkD1L(sEONLSW|42^Q}{ZCJOz9)8_H~Toad&=DD(K()XnKk40&cmiwvm} z;y)r*`jAaHz<~Vn3z~b#FGKgaH%|fKz}MEMTe=5UTCFg((#34BJG>r2l&}zwwgE4` z?ezdnW^rxzJrPWvqW@Nb-&d1vxmulWTL2|_CFkinz20DZM&O1px8xA{cu0NFCeYm| z{D#)<33CU=nh(3% z5dAT;jVp(ZR}8sm59cE1wY#m{q~^{A><*)BdFka0<@VQ~)*AW8+baGFC&31N+X7o1 zzdbMl=~kJ_sFv=5Va@Wbbu7}ouc$2V*ZSg3$;I#e_#x7!0>_y_h1kZTpBRBMRbl~{ zUVDB?q2y&Jo2-ClSr&35VER(hmH0Cbx7G$tVz8F3Q!{7M-kh<>Bm7+85hL;3v}t9Y zE}PzRZK35_tZk(b_=3z^WmcBLZ!Pmi*@}dI&L~HX)^at(_T@G9*d~K0y!?HIr7dJE zKsUrMAc=FW+(f_lCuXa{ckS2K$X$S?vBjjALCP0_4x_ta&f2QHaclvSd^Pq|VM=!{ zt@tK)3xZ!ct@}9Dl?fTs!rNXdlFx1R3RoQZi@l=Bxvy0IT=VJXu*Z(r*{#-&AH$ik zx8@tV6)R#$Wu~r%IZde-1Mpo`oC(DrnDDQG0O2rtAW`t)p(_$intO>RK3}h>a~>$c zdhh$qoyp=zmVrAT3v;LsOehF%?R#UaBh-4n)S(Xj9^^P8C;`PDD8{r%M=&cem!gHB~v| zA}=&5+8=**-+(XsjI^DBF`tt_@k)8jWcyB#bnpMF>`TC#D$}-emgL|FZIZThO?O$k zr7Z|bX_FS&p{0O|NLO$~S=s^$vL&L9jzWvuj9(R6)N%fq5n5&(mup5E)bSt3fu=6M zGoz3L;)7JxN;lhX0x`P0}=Ndd_*@=Y7`ux!=+im&W3h2Cg}!7IsQq zoGExpp>>9o4rxv3OXzPs9Uh7*{c8*lppX{IlQ0Ck5qT0MRDv@IvxeFXom1<|%}qtK zp)=L5bUqyus5NTy7P^Z#vvO?wqtDlL+O$;-iZtZk?eP0`3Eh`hIId*Eun)wcSMFsH zXBpvjj5;5XIk3|~VMaY2_(YH?3(X*y2Owu6oleZi$rRexP+#WV%eP0*kRmoUI)``F zIVaOEhxFsUG^xZv1Aw#te5Nga&8T-ViJa&Ank@k}9saAgEH!3hN{A zA6oC;)RaD3;*PD*8=Srj=PP-x;hP-3os}KRKZO2Cjw7B=hzQhP?DJMOJNyJH;h{9QS}Bh9ltRa0a~BY~>WSsxNStlsD-AnM3wgq~HV z6pThCaPlg(1sV0}R@lEI;w z2rsE>sRjhFUq$LQR;kx`(kQ>i|MT*Vy$|X;FZXOu?HuT903MqtZ*1%CEW384ltkY^|F2LeXq^rtnU=fs@97p)rscXmYlrY27P{ zDCk!w;m0$v_=TB%XYCEP8jsZFQV72oU;J8{8nnP`a zRP(-Fvl>{Cgz6pU(gKJc+FPVZVE9wz@x+k2NXScc4irEu{WUtidx=X|z1TetrTM(c z@P+)#<==acO!3T-zx5tOgS4x;X$edW7UT@atng{!XK_4ao{|iNyY{51L^y_YFvt?E zUn(;lP(6)EEkJvn_H~dJHqz@e#ZOgyKPg0C9~ctq>e8qky?V+pyZf{EnK- zJ8yoJTlJTcwv&_cOU&h6pS7%R-|VtUpj5%r_BLC6`=$=N*Zqmxdqh99%k4hy^ZnaO zQRq#vxzI5%LE`gtb2XuMew-k=Jv2y+qzN8%DOLM}fnl;SGv-|A2WW3foQ)0=muYTO zD*6&?2Y;IS2oHZ#EYIssJf|QY?2UcH=TH2_W!;xTi()qRj5{U{ocAo0-LuDaiT(}p zS5Qo=!EN+TY$=UM)0n$+tQNg+t=rstwLdn;Vx<5OPfXq`B^={x4Dl6FkBl z-7(t9|JS`hm;G(74(We!a`)hlx|TCDYjfPYIFPo5bH9K?t6mX}0elX!66sV4r7~@( z1j`aa^R09a33Zhf*1~ab@_F&jfp~c@ztHxMSbP%e0vE-XEbhu4j{D&GE=9b2plzxA z{}hz>Cq3$a_11Rfg2lL_?epFXV_5sBniwbKs~HJ!7;tzS3>1x{llMcGN*fJpABqNr zQfry_{_hffOT#lE}K*u$lX^^Cy-J5IWvwh_S>77q^&+=qaqA7#9Q!XvhG#(>#@`2K6fNd1`ACI%1ywTlS%b z&TqQJ6#J|ozF2~jOcsq)36%uctVU=aZk*S*e>LG;eZCZX88?qCF3B%>6pV%k9tM0e zybB$y{=I%p;_piS7k|Hh4Po~G7ytjB3FEWk|C7H5b}t=k=N`fi2nuimp~o5i4Dy(7 zy+NHXtdmfSXJ0QLeoa62MK02yQo?);*aEf4jOKCJ9wfVvEMZ;-H7$@+jJk6=tW^P0 z)s0LTWcL_h9gJAPj*yrS|$ANLd-8T@a2uF74EpmyjTM+`1SMV>D z743;^A@@sd4dUn;U3n2$f~Cj;I3VG089D-;hoRC8EM_73e+Z_~SP?AI;4qp}*r6x;P|~6qw5E+)Je*Yk2Jds>+H*Oj)1@2@V&a zvS_DAG2H-XgatMv+v-ibz=1yNzJz-}1m=fpE^$|J@3z&qC^P%#$^(Z2xHd;oivI3~Q)fc}Ts(siOdr)uYSE`))!2 zU_dWGX^1LOgP7!N>hr$$DENaU{$i&5fpYq0eT()p@nL^q=inPt_(?J~_z!XvG8Kwr4PH`=D zV5mWS8diuFDaxR~4QDu3bDYLwEpfhK#MzBgBGarPN^k`0$O4dgphX4QVckf&2@Z~M z9%~7Yfe=%`LyFjuV(IC$rv`RY$eODODHtt0D4^;Ar6Gg?aXo}!HEdnuxLTw# z&ZIRCCfxTF@y3bO4_VPOE+&Ih4e12SabJIhulHRs-x{J5!bdQ@254raoe|u?6NITk za#5_0>A4}TZ=-H3{U<$tPfVD zXCzcjsFjRI&nERQx86UTlJ%H^24mcWU3pqXxOk7=;;~`rBh%#aY0EdDf4L~U$YH98 zo{IXFk*P!_f@M#Tox`LeS6P`#x`=Fe$m^fyAUsgQy0(uiR%(4--1!ces$#z`fVjUw zySrQ;m?M9I%>n$=>}NY>b(^^c@k9bY(|?br#&Ns@Lvzg5=(%CWXfFYFffBWh3Jxd3 zsx(k`(0>pB*iN-yiMhR09I4h2ZlQJEmoW=hN9^z<$|c(JWameP&U5jO9@o+Ht^)b3 zo?}~Uo$uV<{$#BiU9sG$20$eFDi;{hgpV2;Ys3XE?>bOm)FW586)0&(r$u}8RE@4o zikv>8j37R-Xe9t(3&0tI&j58wjQ(C~M@m&j8F4x-O(Dhx^1lA}?`CcK_8Tyh^Aj@z zl7ze8wA-2w!B0tpVDR6b3$S0_#FrwaAFSfTZA0TpN+x+GU`aNcvjp{iRt+`ylxkct^vn0p842*4=2F%I*rnZe|y zs!~F5eoPvwS5QhsDoX_|(5_Q?Qb&u3=!?luQ2k8yK|npzpr1DU><^P`$Sg7Y6n+LG zDi&+kq)6PN;RM7EQ*8P9wp3?tqD}9K@o%!Y4s1f&1^Y#OqGkapr%NSK91IxSsd!FK zN7oyn{=l#U03_P|5#J$z#kXlxm0SvW0u-i+)gGw#LZtEA@B(;l(Twc95D#n3&G;8@ zOYKy~+Vb^okHjZ-1I3#70}yW(nDehh{O)%RHncc^Si>s`Ie@!@!NJ#iAqy(|4m+BU zREv%V#E3dVjp4}5deiwaW=2XS7!@P?xz|XB4NPsb*thhkLi%YF4d29|dWKZO&wy-g zyz^w11?M>s`9B9QJc^+gP^h^MA;^m#WW~f%C%q2|3Kp%{tgt6>nI;p*Xx(^mZq^P- z>}5JE>5Cfu!?S)qd?dj4et+W0XE?W=3-O^N>5lgrxUaglI0kOSKTY1= zi0-SfT%n&mXv7JLfP6C{5b9tamVzDzvFNI)6y+JAKA<}xfFoT~7(L`MtX~&k4K}`v zy$EjHb6z>WHyu@+SVwa-m$2EtRqrv{^iJ=__JVIKgx;@qlv>^EwFBK!!s_8|=ti>X z?cRu;QC$3HV5t=wSNv!1`Mt;!I!5d`Mq*^Q84>hX42>Iw>L2P*NS`KOS<7?v3ZvqCoVQayu3K=GW)EvTh-u`_|}jMMg9&I0Z%EC zXF=s|fa?ZD&vF~go_H`2q0Ek^!YWgonHJ%4;3ElEgrg z^YTK^q`)nXOG#Xt(p+i3lq=i7rw4Qdc&8zXLW?BLbO>jI>yLG%(8fAgPmpa`_c~}v z;uA`bjv@)ijDUW%kuuwKgI})^N#|_(SU-7#gfLSCTf4XcAghIbK!z?Xymr}*UT`>X zDe@N5(?O6Lt3FXSX+;0PhEaqu`YlxvK^~Ud(N8|ux=8^~F6p})hl(X}mH(k7j=^$? zz;lvVgScEwy0l}7+%JjyToSNyXi|H>Yg4=aQZ| zh=?v4jiFfROEDOQm?)SJ)TJ3;7`<&opOvT5h$4hi7Tyeo#svf+cC4Slgv~*2=YHMj znC`0AI=Er|k`Cl-XRi*b7@sq)ocNrv2@UB$mD7+EBwXMil9a(7fgS!Dest^R6X3xW zHiD7pcKH(!`?j^uE_Wyoos^i^eiQnr7-C`^VeC5I865q40 zLK@?X^RI3nNVX~mqnwqAflT@9fz!+Ozjop9&B%?07O#LaVL>|bTSy5qR$MF?B2=1) z2PIArjA%Zz*zyH6$n3u~OHUltrrj-tr>2 zcxm~900_Fj21a~LrC)%d?hP67B9}+Hq0%qAkKzud~kQTf`tST(7(>AN~@|Jw;|6

94*odE&8Dg57qA-p6PtE z+`XPFqB&w`hximVJEW@F{G`x%L?d2V3gsGAM%=69;M7r)$x4ek6{n<`s>;vFM>=#@!h?U00S_oxS`o@CocG9PpnjfB zcI_%~_Ls}AdS4gg0{1%WX1cLo*q@Y>56I7Y57s;DOz!m(=RLSNA1#5}o9#ll$pObj z_LS zLBK7R2wS2NhyzGrKygybAv~2?@Ym&nQ1>BYO@Zo%9)S}R)FBio)RGT8n6Opla)m#T zIFuxf`MSlu+7sO&ovXoiG?|X~TKLzym+rrmHMAW(t~QBl0Wf&daKh!GQmpFxum?A8Y!YX7j0OV^pGxim(Pa)h6{7V9=s9&`u;AVg z5El(_k88*VZS8p{dn-mC5iI#mSTomo;MXI6(JSfT_zAa>;}=x@D9=p87<6ugL5mwZLw=sT!tdx4r&i)_O@daB_L0+X7njq3!w3-rZJpm@XKF7k<1OR6j~!8DtOc?;NY_+XQD?uN5Kj8C<2bSD5DMp**GI0 z-bRwpkd51{x20nZJ>>s=_LB(CY2YJljk0Itn+2OQUHb-m&y#Okk`IOi;FL2%5eTLX zC=ayB!K5uCVVwr6fAteTU4}2Z-^$m5I5j0KGA0q`%iC!>7Ap2NCw3LmxZacEmF-rvNK-|rC zM!@fh5ec3_$WzjkXx@iE(7OHEKW5dz5v1K7a5`5#=#WB7;3lVc zrQ@3#090s|I0qlZYAI^$@#cCqr38u_KkEllNZFp>-miN}8Z*T8--SqnU+<>&2b*a6 zv-i{_e#9LhtWQc>j7p9_kx&qn2xZSSW5ntIKiz><;Mm4^?C`yL>rd42Kp=)Hp|r8s z)m-4&;m+fJ_8;7x4re%z&OIHY`eOScpWst-k_f8)S(jL-+(8^M9{$c&<3iA4to0?`1{ ztll7gVF|EFc77?wV%OHD$+HF2Q{6kojy@3d^7Cz%VnIC|+xd6-KKV=T>y7^a5@sgj}smvE5zaT&hb7N5HFA$@>+MI!YB2c zD)KGpEGJK*K=Zy5=AEP#ou#3xrD848K~z&fYB_}2fa*nS<(^XT>g~=t8k^?pl~BvM z=1bzH*xx^+j;2ayiIhC^22tKb%#e;MHS8&jy*_m$jM7-)m#i3U-Mw%A_;M)LNc2Vb zN@IW5(3$pFuEpAM^2t8Pec-Bx&x;64(z3slz|(d%$l!;n8E=G!Ho}0`p(Gwf&Dn+Q zxxTlOWlyYWjHJP;r!ydTLo?I52QrjkTerznih6T(vb&m_=elF)gH8)tp=3+XP@~IJ z^_geAd_i}hf`45yc5NGqmETt`j@L}ZII71cP%CgzjEk2920}!g#YWNt5G(2`MpT6x ze~;r;;)t|;niN}46oJx<`WoGl6vw+a3-5Mwc?ey5h8FDK(>1)+;VVaoeS7}r1Gjvm zN0W0#aYKeSw?*P!_ph)&>tEA?GI+Dm>6@ev%-Zj}LAkemP+uXnaR`!%tRYe)1W8nh zAU+Y=x&{f5vJ%?V6NUsfgfb+|#qk7nXQO6;^^pRMhyB*t)I8Cs-FLq4)B^6iC+}GP z;h%BnT$ixtz+aHS?mM+o>_0gt^|J@SU9Wfc?$Yn~jyo3b8}Ezn(!O2Xb#jshRM0_j zki=M&ETSO27TTWB*b7sluCCx3qj95-6?Jp8$O6Zn0*sNp_*b!IaIw5dJV-N#*Et5O zwb^JqSns~Q^JrHka-I(mC#X3{IrX!-hpHC$<@?l=BaQDRBQ9hICP!-HagO4qzx6E z`uCB5^9GkNh4N&l(xZTe(i`CQVl^#0hoXU{v<8_w73_#i4CEqIp@4eTOt-&W3cSk0 zMTcT@alIUJEdk^bsV~UcWOB!gD_j#l4NRAJgC{K-)BxvFz!Y#uGu8fna92D5Em=fi ziDT1fCa2?4nWk5NrsfJ_iF%fCl&~B>nV~g~Wi?8iMp-z~($cYktq( zUyNTBoZlP$GbQkTW=nZV?s%!1HdD4MQgsrDZImNZ@YG!97~X&!G{y#5tIIfmfMsqGq<{5$Md;N1DK^ETV4peedasj^TBs zYlm(eT-ko*bF+4FhoVb#xg~!xP^%}*+Lax?mG)tAXkXo4|77_K?}fWj@(jr~3Z4Xc zL~@u4iqzXAU_Sx&0HL$$ZQxf7L%?dl)N_%iuIEP=9f+F?uO0gJx_9`m7Dwn{|6YZ& z-FBEV56&`FJT~|W<|;{_PSKpL!`wbvMcmHhfsP%#Q~r~xzs=e_OQ*le;3yr&4sZVX z&R6qX$L266FCrq1=mBH zrZOz6>cd(wh8og|t&gpq6qiN*D?<0{-lfQ_uym?y>hKZStl-pRm|%pS#0slWRy&yR zlLxb7&Er;4LI9*dI)y6%Ly%DA7V@&X7uuCJZSq}#opNn&iI}) z9SD7S>?NKrXOq0m2-h>{2v;QrusWc7m`hd1OcJ((F$Bw&Y94K?J=2J~@lT2{u(f#H zm;Hpe_#fCFQtAK%qD#BCV~XR02Jzx{`GjDqkx;g6kakyK`2J$Va4a|t84Cp$jkAgA`pn&+0>;}F?Grt1wA}b5K0*?ZoMXELERd}FZ_Eatz zOn97lj*rwif2()L@yYQm`B!!~D#tS9m%T@pVne6}cC;3|%-FS}hHp^Td2+;}VLNCf ztf=IFt%Twquq*;0kCB5P3d>GlJBpT}x*<5YQGRc_~5sa>CaqL2p&B25x zX8bzVDhd5<;y?pnzB~2u*AkbEA|dYJx%&h}#bDHal8ouhuzbSZG6I4P?}S{-bgB(d z0-P#rOYsDc0Rs#_D!A_$r9a@TLwEMIKJm<}v1=%x_5KGBWY2W7t)UG;Y1Eigk_MB2 zVgxf81uBdClnNH@GRK=HnnKPDG`a?X7&yMgevWkaPv3qe?mn37(L+iDd-Wg(-(iUg z)m<#RYRu77!#J6VF9%38JVE6Yq~Lirg-6C&5!UnhU= zJw4t2{doQ79bA=3`=xf3?(Q2?qzfMD#>mCG1rc9V%75hkypbzCU%_|x+r;g|$1+h6 zIu~?^p!T7=;NC%Bz~M98x}4cE1l=r4ORfsl+TfF?fHf*yYSw5LIbOlqO4z$JKQdMyx+o1MF*G>%N?$rD>e$MPiY^xX?LJCO;*K zZ${Ld^Puo~^;d;1$59r7y9Ob95C{bBELBE18L&~2z~d%P)9m3e=gs$RO)BOMLUmr( z4ZVrKANplpr}u}Ia$9s{|9Q`X&*Z!0ANZ`UUehm!wI3*_bR)d=SGzA|6m3xKPQ5rm zD-o=5XzEF4H7~&)5)l)-bF6)TaGJR)U>~pSZ_wU9ysyAfcSO550zc#ZbrJ7*FX#$2 zp+yz+1}VRVG?E&=m7-q}@&q>&DWkA&pJcZhpE#G$@(SjR@MqX(=4k&J?kEy}rJ2^U zPl8-fk-^L>YSA<<6T*4bWP2K6?OODF5pv}KS|HEsjpDvNi&v7iKoi1GqtJkZ$3T}9 zWFXpD3YP%6g(-xGT-p>$FnBbY3D!eAYS{b7sQcDPx_2v(_x)={wku*sh5NVO3!SKW zX(v1CLo0M}%gh!jFW8EFf`nFO=$@aan&dz6~*TK8{*k3{>YN5(#dS!{;ERX`Up z)^{Nu05fl7+Tn(b-MRW2kJ;gm<4oUS`wj2;MFa#0wgclNSf$E<3MULKMithbJ+qt_ z=}3g@q^d#yAr3KOJ-6b!gs08HW4|2xln?e-g^mhH@Ny{RInyPsnA+e8 zG#U0Yc<9EF4L?Xh!K1>lp%kDQ;7CDu@(m~*<HbCf_tDNqs`}bVvD3Ei74cT1I@K&T2 z_qx_lNNj6FL|hma5rR~c>m7y*&!Q@WN)Ry$A1G*+TK7Ok_CK>Nd!~78cZ_pglirhJ zAJjhE-MkEY(&TmvYljYspAAjc*T~QIwF!z?{Jnxr7mK^O+%ND#n{Y);a;!Ag(fldm&d>ELUAYJ$b-9)qfEVp7%|LkJKYIiOrSLUsE zFEi)GAN@e8+;J3oPq?$HkNxJi0oI<*N1yr`yBq`Sg?v8o5s z9JG(q{%2R5oHq|9cQgPS`3A2fWIE0UYkAiXUocOpj^pUB(La}cH1j5!CTL_abmzSi zkDjuTe*;I4GI0z{L>HX~EU9|ULX5)>o45Zt!sIFplna%F4XH+KDJhq0LMRlHBQ^E< zd409d=l^JoX`*j#ye3FU4%TQW1so)XLGXomYrSUPIr(`z*334X_n0w{PBi-hb1O_B zr=LrahZf9@pyI|-)8acLO#xmt+2N4w=hpu0C_Zy1j`xp(h%rAq^YSHqz!b>k$J^@* z*0Kr-3UUY_)r-MrQtjuy`&lPGvjU%aE+?X=OK~ZGlkXk-4Hsjr57JZP9Pve;5$QPk zxN~cNPM^7hKBEnNX4}|rczou#nH^{JXH53v?e@X%em-_-LG-u}m9OqK_;*@m^~KmY zN4;TfFrvcM(AB9&LN9{-cbfLLD+r^L$z4riLD z&Aml1*|fzqB6bb)My2+p_{P8SSpWDfHnWn_A9Zx8H!4kT(B=Z+Nq;4nrfYL2a(SZ< zY=B2fyyz2=O+zTeUcd+#)g&&>o54|=zof6W)%0ORYC7iFWe8DhOF`ms@N3&wr_LLc zThD*0d(^C$&j2+Le#WjTDkC>0hb#d~(ZOm9r+Lb{2KuP>#i5l`9_60|vspfN2u%)b zkV|=gmeV)I@r;`vOwjwH+Fx{ZU$|FEeB5_k&z5Ac&;duf8WHu8h6EzVl={>pdmFOvs!anHX#O$H-Y!t-B&x2!VP z8YU7&41&pzMx-1C+d%LMs#anNX+yPn^gTFgVISm!#DD)uf3&r1g#R9$6u5!AVukfK z^wrh2-G0N|41ke0$v9lGZMM|ByB6CoYI8xoxf?HELVU{d;UIPSr^Fq0bH^Ui@6T!Q zY{_^09q_sw_x2?~CoPfTq7qIL{c@S3+g4GFMRp|xiwE28focWu1|yq*cp?5JOc|~O zR|IvZ-XJF6dCxS|_Q`F%x0`nIuy9HSk96JR|JL8W@4UD?-_@kCAE=4RanlQn8O#N0-stiy9nDRsTJ7`L{bQvr`5(P(}_`*@-IR{q~($+K@@ubHg zp=WrS-$N~TW-ZrQw5IdoqSJ*=-va05xz3^Gj&n)coC|B5m)AN6)`1U15+-m1+?>cs zaI3Dp}wF#`Oy9cvzCKJ=3j*lIQIu^VpW@1+`*fn t$rc~uceU{c8ieXCjj6Tu4I*t09Qx;!p^c&5Ps#*Pg)S{7R1xAe{|#er;t~J= literal 78920 zcmeFa33wFM)-GJ#UEPHf=^^vf-5Cgwq&sQCOlBq(5<((Tfeerc4v=&vKmrMaAPR&* z1yKno9zm3VGb$v&IS$7o35tRPbOYjXg6gVHXdJNayQ(WVoOAyB-0%DE^F7afKsIlU zU3*-6t#_@xWtaz5lg5orQ8NsqLmC^yFr!rra~+QRBC#yXJcyf=7>kl7+&!bRro8U% zs=1cJ^0~FR`hWH(r|Q0n|Fbv#^t6SkL_Qe?8NK@Fx8qU`!;F$7=?Lz<#4^l)E0Scy zaViQp7UykRhIt1V!UQrbBYj!Wa`i|4uO3jn>hT2@`LF;fbs(>ldjC9#gGX@Q27Dgr z7o=IpYarfz7stbaBat$Y?#A^@V7`I{3f==O!u49D+mPy!<{%X#%|)7`;Oz?T#rLXk z+>5n%zZ&N&@I88W9@2ay%GdqC5?tR5r2G&*fxbcbq=N6_IXZs~zwr1VjYQ~D@Fec9#xdn*Ez-TH zmq&qHkse2){y}v?=g%Nfdk~Jpb;3u0yMUh{5q_%RV|b3vseK8l-xE?k2~Q{pkt3g% z1E0rr$~WOj1wT`8CZ4D3&nfsJa1YMu{>w=8T|#<~@Br=;QvDDf2U1(S38cEE@)Noh zoS|GlqTojgeh#F%S*qY)6np^rrMy!85>_bZ3xNl4PVaOeh2uW8A&t-X=sM23fb?xb zYR`{=)c%zB*O3V6Iw6hsuYh!)klKTg#@j!Y>)!z>UxZXY-vjCQc_cH=e+JU;{R*4~ zlzxXa&a_DMd>9l}FM1C?_^`aQx0c%N`NFcCWO9fF-y-5=iw+NcEeEL}kcAqI{1=qW8uqI2PE3 zM7S336Yc}%0V)5}kX}bBN1}Qor1z2DvbE?zVkajBPg!ElP>hFZ}72KfUMg?gc z(0!WYUjWi~_9D@IN^L{m|0_}`?!N=vj`SW9eV>r>a}?=al=~AP13V8TSwTqe3rN&n zKO)g@LXnW=s1f)%o(lo)!}SOtJs%0A=cAPKWFXb^ap);&NM9)UHSlJnfBp`gIOdge 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 diff --git a/assets/flash0/font/ltn6.pgf b/assets/flash0/font/ltn6.pgf index 0f626ddff23fd9bc986f96efca91f07bd8a79fca..9b200342639e8c9b636a26d66f5d5e615d7c5f0f 100644 GIT binary patch literal 58456 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 +x%b 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 Y5W`v!kJ1m1)??R*BFK8R0T3wvU&Nl|mjD0& literal 88716 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 D2&*EF From 2f4dfedaa9477c16294832c644b42ee91a9d45e5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Sat, 31 Oct 2020 18:27:26 +0100 Subject: [PATCH 131/275] Fix loading old savestates. Was broken in #13592 --- Core/HLE/sceKernelModule.cpp | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/Core/HLE/sceKernelModule.cpp b/Core/HLE/sceKernelModule.cpp index 26d5ef0dce..9929fc19a1 100644 --- a/Core/HLE/sceKernelModule.cpp +++ b/Core/HLE/sceKernelModule.cpp @@ -282,10 +282,9 @@ public: DoArray(p, ptemp, 0xC0); memcpy(pnm, ptemp, 0x2C); pnm->modid = GetUID(); - pnm += 0x30; - ptemp += 0x2C; - memcpy(pnm, ptemp, 0xC0 - 0x2C); + memcpy(((uint8_t *)pnm) + 0x30, ((uint8_t *)ptemp) + 0x2C, 0xC0 - 0x2C); } + Do(p, memoryBlockAddr); Do(p, memoryBlockSize); Do(p, isFake); @@ -424,7 +423,7 @@ public: return impExpModuleNames.find(moduleName) != impExpModuleNames.end(); } - NativeModule nm; + NativeModule nm{}; std::vector waitingThreads; std::vector exportedFuncs; From 92d73e3b0397573a47092ede8e2f68c7c9ff73d2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Sun, 25 Oct 2020 09:42:00 +0100 Subject: [PATCH 132/275] HLSL: Use #define to switch to glsl-like vector types. --- GPU/Directx9/VertexShaderGeneratorHLSL.cpp | 228 +++++++++++---------- 1 file changed, 115 insertions(+), 113 deletions(-) diff --git a/GPU/Directx9/VertexShaderGeneratorHLSL.cpp b/GPU/Directx9/VertexShaderGeneratorHLSL.cpp index 4908be5240..05bc0b41c7 100644 --- a/GPU/Directx9/VertexShaderGeneratorHLSL.cpp +++ b/GPU/Directx9/VertexShaderGeneratorHLSL.cpp @@ -34,13 +34,13 @@ static const char * const boneWeightAttrDecl[9] = { "#ERROR#", "float a_w1:TEXCOORD1;\n", - "float2 a_w1:TEXCOORD1;\n", - "float3 a_w1:TEXCOORD1;\n", - "float4 a_w1:TEXCOORD1;\n", - "float4 a_w1:TEXCOORD1;\n float a_w2:TEXCOORD2;\n", - "float4 a_w1:TEXCOORD1;\n float2 a_w2:TEXCOORD2;\n", - "float4 a_w1:TEXCOORD1;\n float3 a_w2:TEXCOORD2;\n", - "float4 a_w1:TEXCOORD1;\n float4 a_w2:TEXCOORD2;\n", + "vec2 a_w1:TEXCOORD1;\n", + "vec3 a_w1:TEXCOORD1;\n", + "vec4 a_w1:TEXCOORD1;\n", + "vec4 a_w1:TEXCOORD1;\n float a_w2:TEXCOORD2;\n", + "vec4 a_w1:TEXCOORD1;\n vec2 a_w2:TEXCOORD2;\n", + "vec4 a_w1:TEXCOORD1;\n vec3 a_w2:TEXCOORD2;\n", + "vec4 a_w1:TEXCOORD1;\n vec4 a_w2:TEXCOORD2;\n", }; bool GenerateVertexShaderHLSL(const VShaderID &id, char *buffer, ShaderLanguage lang, std::string *errorString) { @@ -104,7 +104,9 @@ bool GenerateVertexShaderHLSL(const VShaderID &id, char *buffer, ShaderLanguage WRITE(p, "#define vec2 float2\n"); WRITE(p, "#define vec3 float3\n"); WRITE(p, "#define vec4 float4\n"); - WRITE(p, "#define splat3(x) float3(x, x, x)\n"); + WRITE(p, "#define mat4 float4x4\n"); + WRITE(p, "#define mat3x4 float4x3\n"); // note how the conventions are backwards + WRITE(p, "#define splat3(x) vec3(x, x, x)\n"); if (lang == HLSL_DX9) { WRITE(p, "#pragma warning( disable : 3571 )\n"); @@ -116,69 +118,69 @@ bool GenerateVertexShaderHLSL(const VShaderID &id, char *buffer, ShaderLanguage } if (enableFog) { - WRITE(p, "float2 u_fogcoef : register(c%i);\n", CONST_VS_FOGCOEF); + WRITE(p, "vec2 u_fogcoef : register(c%i);\n", CONST_VS_FOGCOEF); } if (useHWTransform || !hasColor) - WRITE(p, "float4 u_matambientalpha : register(c%i);\n", CONST_VS_MATAMBIENTALPHA); // matambient + matalpha + WRITE(p, "vec4 u_matambientalpha : register(c%i);\n", CONST_VS_MATAMBIENTALPHA); // matambient + matalpha if (useHWTransform) { // When transforming by hardware, we need a great deal more uniforms... - WRITE(p, "float4x3 u_world : register(c%i);\n", CONST_VS_WORLD); - WRITE(p, "float4x3 u_view : register(c%i);\n", CONST_VS_VIEW); + WRITE(p, "mat3x4 u_world : register(c%i);\n", CONST_VS_WORLD); + WRITE(p, "mat3x4 u_view : register(c%i);\n", CONST_VS_VIEW); if (doTextureTransform) - WRITE(p, "float4x3 u_texmtx : register(c%i);\n", CONST_VS_TEXMTX); + WRITE(p, "mat3x4 u_texmtx : register(c%i);\n", CONST_VS_TEXMTX); if (enableBones) { #ifdef USE_BONE_ARRAY - WRITE(p, "float4x3 u_bone[%i] : register(c%i);\n", numBones, CONST_VS_BONE0); + WRITE(p, "mat3x4 u_bone[%i] : register(c%i);\n", numBones, CONST_VS_BONE0); #else for (int i = 0; i < numBoneWeights; i++) { - WRITE(p, "float4x3 u_bone%i : register(c%i);\n", i, CONST_VS_BONE0 + i * 3); + WRITE(p, "mat3x4 u_bone%i : register(c%i);\n", i, CONST_VS_BONE0 + i * 3); } #endif } if (doTexture) { - WRITE(p, "float4 u_uvscaleoffset : register(c%i);\n", CONST_VS_UVSCALEOFFSET); + WRITE(p, "vec4 u_uvscaleoffset : register(c%i);\n", CONST_VS_UVSCALEOFFSET); } for (int i = 0; i < 4; i++) { if (doLight[i] != LIGHT_OFF) { // This is needed for shade mapping - WRITE(p, "float3 u_lightpos%i : register(c%i);\n", i, CONST_VS_LIGHTPOS + i); + WRITE(p, "vec3 u_lightpos%i : register(c%i);\n", i, CONST_VS_LIGHTPOS + i); } if (doLight[i] == LIGHT_FULL) { GELightType type = static_cast(id.Bits(VS_BIT_LIGHT0_TYPE + 4 * i, 2)); GELightComputation comp = static_cast(id.Bits(VS_BIT_LIGHT0_COMP + 4 * i, 2)); if (type != GE_LIGHTTYPE_DIRECTIONAL) - WRITE(p, "float3 u_lightatt%i : register(c%i);\n", i, CONST_VS_LIGHTATT + i); + WRITE(p, "vec3 u_lightatt%i : register(c%i);\n", i, CONST_VS_LIGHTATT + i); if (type == GE_LIGHTTYPE_SPOT || type == GE_LIGHTTYPE_UNKNOWN) { - WRITE(p, "float3 u_lightdir%i : register(c%i);\n", i, CONST_VS_LIGHTDIR + i); - WRITE(p, "float4 u_lightangle_spotCoef%i : register(c%i);\n", i, CONST_VS_LIGHTANGLE_SPOTCOEF + i); + WRITE(p, "vec3 u_lightdir%i : register(c%i);\n", i, CONST_VS_LIGHTDIR + i); + WRITE(p, "vec4 u_lightangle_spotCoef%i : register(c%i);\n", i, CONST_VS_LIGHTANGLE_SPOTCOEF + i); } - WRITE(p, "float3 u_lightambient%i : register(c%i);\n", i, CONST_VS_LIGHTAMBIENT + i); - WRITE(p, "float3 u_lightdiffuse%i : register(c%i);\n", i, CONST_VS_LIGHTDIFFUSE + i); + WRITE(p, "vec3 u_lightambient%i : register(c%i);\n", i, CONST_VS_LIGHTAMBIENT + i); + WRITE(p, "vec3 u_lightdiffuse%i : register(c%i);\n", i, CONST_VS_LIGHTDIFFUSE + i); if (comp == GE_LIGHTCOMP_BOTH) { - WRITE(p, "float3 u_lightspecular%i : register(c%i);\n", i, CONST_VS_LIGHTSPECULAR + i); + WRITE(p, "vec3 u_lightspecular%i : register(c%i);\n", i, CONST_VS_LIGHTSPECULAR + i); } } } if (enableLighting) { - WRITE(p, "float4 u_ambient : register(c%i);\n", CONST_VS_AMBIENT); + WRITE(p, "vec4 u_ambient : register(c%i);\n", CONST_VS_AMBIENT); if ((matUpdate & 2) == 0 || !hasColor) - WRITE(p, "float3 u_matdiffuse : register(c%i);\n", CONST_VS_MATDIFFUSE); + WRITE(p, "vec3 u_matdiffuse : register(c%i);\n", CONST_VS_MATDIFFUSE); // if ((matUpdate & 4) == 0) - WRITE(p, "float4 u_matspecular : register(c%i);\n", CONST_VS_MATSPECULAR); // Specular coef is contained in alpha - WRITE(p, "float3 u_matemissive : register(c%i);\n", CONST_VS_MATEMISSIVE); + WRITE(p, "vec4 u_matspecular : register(c%i);\n", CONST_VS_MATSPECULAR); // Specular coef is contained in alpha + WRITE(p, "vec3 u_matemissive : register(c%i);\n", CONST_VS_MATEMISSIVE); } } if (!isModeThrough && gstate_c.Supports(GPU_ROUND_DEPTH_TO_16BIT)) { - WRITE(p, "float4 u_depthRange : register(c%i);\n", CONST_VS_DEPTHRANGE); + WRITE(p, "vec4 u_depthRange : register(c%i);\n", CONST_VS_DEPTHRANGE); } if (!isModeThrough) { - WRITE(p, "float4 u_cullRangeMin : register(c%i);\n", CONST_VS_CULLRANGEMIN); - WRITE(p, "float4 u_cullRangeMax : register(c%i);\n", CONST_VS_CULLRANGEMAX); + WRITE(p, "vec4 u_cullRangeMin : register(c%i);\n", CONST_VS_CULLRANGEMIN); + WRITE(p, "vec4 u_cullRangeMax : register(c%i);\n", CONST_VS_CULLRANGEMAX); } } else { WRITE(p, "cbuffer base : register(b0) {\n%s};\n", cb_baseStr); @@ -199,54 +201,54 @@ bool GenerateVertexShaderHLSL(const VShaderID &id, char *buffer, ShaderLanguage WRITE(p, " %s", boneWeightAttrDecl[numBoneWeights]); } if (doTexture && hasTexcoord) { - WRITE(p, " float2 texcoord : TEXCOORD0;\n"); + WRITE(p, " vec2 texcoord : TEXCOORD0;\n"); } if (hasColor) { - WRITE(p, " float4 color0 : COLOR0;\n"); + WRITE(p, " vec4 color0 : COLOR0;\n"); } if (hasNormal) { - WRITE(p, " float3 normal : NORMAL;\n"); + WRITE(p, " vec3 normal : NORMAL;\n"); } - WRITE(p, " float3 position : POSITION;\n"); + WRITE(p, " vec3 position : POSITION;\n"); WRITE(p, "};\n"); } else { WRITE(p, "struct VS_IN {\n"); - WRITE(p, " float4 position : POSITION;\n"); + WRITE(p, " vec4 position : POSITION;\n"); if (doTexture && hasTexcoord) { if (doTextureTransform && !isModeThrough) { texCoordInVec3 = true; - WRITE(p, " float3 texcoord : TEXCOORD0;\n"); + WRITE(p, " vec3 texcoord : TEXCOORD0;\n"); } else - WRITE(p, " float2 texcoord : TEXCOORD0;\n"); + WRITE(p, " vec2 texcoord : TEXCOORD0;\n"); } if (hasColor) { - WRITE(p, " float4 color0 : COLOR0;\n"); + WRITE(p, " vec4 color0 : COLOR0;\n"); } // only software transform supplies color1 as vertex data if (lmode) { - WRITE(p, " float4 color1 : COLOR1;\n"); + WRITE(p, " vec4 color1 : COLOR1;\n"); } WRITE(p, "};\n"); } WRITE(p, "struct VS_OUT {\n"); if (doTexture) { - WRITE(p, " float3 v_texcoord : TEXCOORD0;\n"); + WRITE(p, " vec3 v_texcoord : TEXCOORD0;\n"); } const char *colorInterpolation = doFlatShading && lang == HLSL_D3D11 ? "nointerpolation " : ""; - WRITE(p, " %sfloat4 v_color0 : COLOR0;\n", colorInterpolation); + WRITE(p, " %svec4 v_color0 : COLOR0;\n", colorInterpolation); if (lmode) - WRITE(p, " float3 v_color1 : COLOR1;\n"); + WRITE(p, " vec3 v_color1 : COLOR1;\n"); if (enableFog) { WRITE(p, " float v_fogdepth: TEXCOORD1;\n"); } if (lang == HLSL_DX9) { - WRITE(p, " float4 gl_Position : POSITION;\n"); + WRITE(p, " vec4 gl_Position : POSITION;\n"); } else { - WRITE(p, " float4 gl_Position : SV_Position;\n"); + WRITE(p, " vec4 gl_Position : SV_Position;\n"); } WRITE(p, "};\n"); @@ -255,12 +257,12 @@ bool GenerateVertexShaderHLSL(const VShaderID &id, char *buffer, ShaderLanguage if (!isModeThrough && gstate_c.Supports(GPU_ROUND_DEPTH_TO_16BIT)) { // Apply the projection and viewport to get the Z buffer value, floor to integer, undo the viewport and projection. // The Z range in D3D is different but we compensate for that using parameters. - WRITE(p, "\nfloat4 depthRoundZVP(float4 v) {\n"); + WRITE(p, "\nvec4 depthRoundZVP(vec4 v) {\n"); WRITE(p, " float z = v.z / v.w;\n"); WRITE(p, " z = (z * u_depthRange.x + u_depthRange.y);\n"); WRITE(p, " z = floor(z);\n"); WRITE(p, " z = (z - u_depthRange.z) * u_depthRange.w;\n"); - WRITE(p, " return float4(v.x, v.y, z * v.w, v.w);\n"); + WRITE(p, " return vec4(v.x, v.y, z * v.w, v.w);\n"); WRITE(p, "}\n\n"); } @@ -268,15 +270,15 @@ bool GenerateVertexShaderHLSL(const VShaderID &id, char *buffer, ShaderLanguage if (doSpline || doBezier) { if (lang == HLSL_D3D11) { WRITE(p, "struct TessData {\n"); - WRITE(p, " float3 pos; float pad1;\n"); - WRITE(p, " float2 tex; float2 pad2;\n"); - WRITE(p, " float4 col;\n"); + WRITE(p, " vec3 pos; float pad1;\n"); + WRITE(p, " vec2 tex; vec2 pad2;\n"); + WRITE(p, " vec4 col;\n"); WRITE(p, "};\n"); WRITE(p, "StructuredBuffer tess_data : register(t0);\n"); WRITE(p, "struct TessWeight {\n"); - WRITE(p, " float4 basis;\n"); - WRITE(p, " float4 deriv;\n"); + WRITE(p, " vec4 basis;\n"); + WRITE(p, " vec4 deriv;\n"); WRITE(p, "};\n"); WRITE(p, "StructuredBuffer tess_weights_u : register(t1);\n"); WRITE(p, "StructuredBuffer tess_weights_v : register(t2);\n"); @@ -284,7 +286,7 @@ bool GenerateVertexShaderHLSL(const VShaderID &id, char *buffer, ShaderLanguage const char *init[3] = { "0.0, 0.0", "0.0, 0.0, 0.0", "0.0, 0.0, 0.0, 0.0" }; for (int i = 2; i <= 4; i++) { - // Define 3 types float2, float3, float4 + // Define 3 types vec2, vec3, vec4 WRITE(p, "float%d tess_sample(in float%d points[16], float4x4 weights) {\n", i, i); WRITE(p, " float%d pos = float%d(%s);\n", i, i, init[i - 2]); for (int v = 0; v < 4; ++v) { @@ -296,26 +298,26 @@ bool GenerateVertexShaderHLSL(const VShaderID &id, char *buffer, ShaderLanguage WRITE(p, "}\n"); } - WRITE(p, "float4x4 outerProduct(float4 u, float4 v) {\n"); + WRITE(p, "float4x4 outerProduct(vec4 u, vec4 v) {\n"); WRITE(p, " return mul((float4x1)v, (float1x4)u);\n"); WRITE(p, "}\n"); WRITE(p, "struct Tess {\n"); - WRITE(p, " float3 pos;\n"); + WRITE(p, " vec3 pos;\n"); if (doTexture) - WRITE(p, " float2 tex;\n"); - WRITE(p, " float4 col;\n"); + WRITE(p, " vec2 tex;\n"); + WRITE(p, " vec4 col;\n"); if (hasNormalTess) - WRITE(p, " float3 nrm;\n"); + WRITE(p, " vec3 nrm;\n"); WRITE(p, "};\n"); WRITE(p, "void tessellate(in VS_IN In, out Tess tess) {\n"); WRITE(p, " int2 point_pos = int2(In.position.z, In.normal.z)%s;\n", doBezier ? " * 3" : ""); WRITE(p, " int2 weight_idx = int2(In.position.xy);\n"); // Load 4x4 control points - WRITE(p, " float3 _pos[16];\n"); - WRITE(p, " float2 _tex[16];\n"); - WRITE(p, " float4 _col[16];\n"); + WRITE(p, " vec3 _pos[16];\n"); + WRITE(p, " vec2 _tex[16];\n"); + WRITE(p, " vec4 _col[16];\n"); WRITE(p, " int index;\n"); for (int i = 0; i < 4; i++) { for (int j = 0; j < 4; j++) { @@ -329,8 +331,8 @@ bool GenerateVertexShaderHLSL(const VShaderID &id, char *buffer, ShaderLanguage } // Basis polynomials as weight coefficients - WRITE(p, " float4 basis_u = tess_weights_u[weight_idx.x].basis;\n"); - WRITE(p, " float4 basis_v = tess_weights_v[weight_idx.y].basis;\n"); + WRITE(p, " vec4 basis_u = tess_weights_u[weight_idx.x].basis;\n"); + WRITE(p, " vec4 basis_v = tess_weights_v[weight_idx.y].basis;\n"); WRITE(p, " float4x4 basis = outerProduct(basis_u, basis_v);\n"); // Tessellate @@ -347,11 +349,11 @@ bool GenerateVertexShaderHLSL(const VShaderID &id, char *buffer, ShaderLanguage WRITE(p, " tess.col = u_matambientalpha;\n"); if (hasNormalTess) { // Derivatives as weight coefficients - WRITE(p, " float4 deriv_u = tess_weights_u[weight_idx.x].deriv;\n"); - WRITE(p, " float4 deriv_v = tess_weights_v[weight_idx.y].deriv;\n"); + WRITE(p, " vec4 deriv_u = tess_weights_u[weight_idx.x].deriv;\n"); + WRITE(p, " vec4 deriv_v = tess_weights_v[weight_idx.y].deriv;\n"); - WRITE(p, " float3 du = tess_sample(_pos, outerProduct(deriv_u, basis_v));\n"); - WRITE(p, " float3 dv = tess_sample(_pos, outerProduct(basis_u, deriv_v));\n"); + WRITE(p, " vec3 du = tess_sample(_pos, outerProduct(deriv_u, basis_v));\n"); + WRITE(p, " vec3 dv = tess_sample(_pos, outerProduct(basis_u, deriv_v));\n"); WRITE(p, " tess.nrm = normalize(cross(du, dv));\n"); } WRITE(p, "}\n"); @@ -365,7 +367,7 @@ bool GenerateVertexShaderHLSL(const VShaderID &id, char *buffer, ShaderLanguage if (texCoordInVec3) { WRITE(p, " Out.v_texcoord = In.texcoord;\n"); } else { - WRITE(p, " Out.v_texcoord = float3(In.texcoord, 1.0);\n"); + WRITE(p, " Out.v_texcoord = vec3(In.texcoord, 1.0);\n"); } } if (hasColor) { @@ -375,29 +377,29 @@ bool GenerateVertexShaderHLSL(const VShaderID &id, char *buffer, ShaderLanguage } else { WRITE(p, " Out.v_color0 = In.u_matambientalpha;\n"); if (lmode) - WRITE(p, " Out.v_color1 = float3(0.0);\n"); + WRITE(p, " Out.v_color1 = vec3(0.0);\n"); } if (enableFog) { WRITE(p, " Out.v_fogdepth = In.position.w;\n"); } if (lang == HLSL_D3D11) { if (isModeThrough) { - WRITE(p, " float4 outPos = mul(u_proj_through, float4(In.position.xyz, 1.0));\n"); + WRITE(p, " float4 outPos = mul(u_proj_through, vec4(In.position.xyz, 1.0));\n"); } else { if (gstate_c.Supports(GPU_ROUND_DEPTH_TO_16BIT)) { - WRITE(p, " float4 outPos = depthRoundZVP(mul(u_proj, float4(In.position.xyz, 1.0)));\n"); + WRITE(p, " vec4 outPos = depthRoundZVP(mul(u_proj, vec4(In.position.xyz, 1.0)));\n"); } else { - WRITE(p, " float4 outPos = mul(u_proj, float4(In.position.xyz, 1.0));\n"); + WRITE(p, " vec4 outPos = mul(u_proj, vec4(In.position.xyz, 1.0));\n"); } } } else { if (isModeThrough) { - WRITE(p, " float4 outPos = mul(float4(In.position.xyz, 1.0), u_proj_through);\n"); + WRITE(p, " vec4 outPos = mul(vec4(In.position.xyz, 1.0), u_proj_through);\n"); } else { if (gstate_c.Supports(GPU_ROUND_DEPTH_TO_16BIT)) { - WRITE(p, " float4 outPos = depthRoundZVP(mul(float4(In.position.xyz, 1.0), u_proj));\n"); + WRITE(p, " vec4 outPos = depthRoundZVP(mul(vec4(In.position.xyz, 1.0), u_proj));\n"); } else { - WRITE(p, " float4 outPos = mul(float4(In.position.xyz, 1.0), u_proj);\n"); + WRITE(p, " vec4 outPos = mul(vec4(In.position.xyz, 1.0), u_proj);\n"); } } } @@ -409,18 +411,18 @@ bool GenerateVertexShaderHLSL(const VShaderID &id, char *buffer, ShaderLanguage WRITE(p, " Tess tess;\n"); WRITE(p, " tessellate(In, tess);\n"); - WRITE(p, " float3 worldpos = mul(float4(tess.pos.xyz, 1.0), u_world);\n"); + WRITE(p, " vec3 worldpos = mul(vec4(tess.pos.xyz, 1.0), u_world);\n"); if (hasNormalTess) - WRITE(p, " float3 worldnormal = normalize(mul(float4(%stess.nrm, 0.0), u_world));\n", flipNormalTess ? "-" : ""); + WRITE(p, " vec3 worldnormal = normalize(mul(vec4(%stess.nrm, 0.0), u_world));\n", flipNormalTess ? "-" : ""); else - WRITE(p, " float3 worldnormal = float3(0.0, 0.0, 1.0);\n"); + WRITE(p, " vec3 worldnormal = vec3(0.0, 0.0, 1.0);\n"); } else { // No skinning, just standard T&L. - WRITE(p, " float3 worldpos = mul(float4(In.position.xyz, 1.0), u_world);\n"); + WRITE(p, " vec3 worldpos = mul(vec4(In.position.xyz, 1.0), u_world);\n"); if (hasNormal) - WRITE(p, " float3 worldnormal = normalize(mul(float4(%sIn.normal, 0.0), u_world));\n", flipNormal ? "-" : ""); + WRITE(p, " vec3 worldnormal = normalize(mul(vec4(%sIn.normal, 0.0), u_world));\n", flipNormal ? "-" : ""); else - WRITE(p, " float3 worldnormal = float3(0.0, 0.0, 1.0);\n"); + WRITE(p, " vec3 worldnormal = vec3(0.0, 0.0, 1.0);\n"); } } else { static const char * const boneWeightAttr[8] = { @@ -430,7 +432,7 @@ bool GenerateVertexShaderHLSL(const VShaderID &id, char *buffer, ShaderLanguage if (lang == HLSL_D3D11) { if (numBoneWeights == 1) - WRITE(p, " float4x3 skinMatrix = mul(In.a_w1, u_bone[0])"); + WRITE(p, " mat3x4 skinMatrix = mul(In.a_w1, u_bone[0])"); else WRITE(p, " float4x3 skinMatrix = mul(In.a_w1.x, u_bone[0])"); for (int i = 1; i < numBoneWeights; i++) { @@ -457,32 +459,32 @@ bool GenerateVertexShaderHLSL(const VShaderID &id, char *buffer, ShaderLanguage WRITE(p, ";\n"); // Trying to simplify this results in bugs in LBP... - WRITE(p, " float3 skinnedpos = mul(float4(In.position.xyz, 1.0), skinMatrix);\n"); - WRITE(p, " float3 worldpos = mul(float4(skinnedpos, 1.0), u_world);\n"); + WRITE(p, " vec3 skinnedpos = mul(float4(In.position.xyz, 1.0), skinMatrix);\n"); + WRITE(p, " vec3 worldpos = mul(float4(skinnedpos, 1.0), u_world);\n"); if (hasNormal) { - WRITE(p, " float3 skinnednormal = mul(float4(%sIn.normal, 0.0), skinMatrix);\n", flipNormal ? "-" : ""); + WRITE(p, " vec3 skinnednormal = mul(float4(%sIn.normal, 0.0), skinMatrix);\n", flipNormal ? "-" : ""); } else { - WRITE(p, " float3 skinnednormal = mul(float4(0.0, 0.0, %s1.0, 0.0), skinMatrix);\n", flipNormal ? "-" : ""); + WRITE(p, " vec3 skinnednormal = mul(float4(0.0, 0.0, %s1.0, 0.0), skinMatrix);\n", flipNormal ? "-" : ""); } - WRITE(p, " float3 worldnormal = normalize(mul(float4(skinnednormal, 0.0), u_world));\n"); + WRITE(p, " vec3 worldnormal = normalize(mul(float4(skinnednormal, 0.0), u_world));\n"); } - WRITE(p, " float4 viewPos = float4(mul(float4(worldpos, 1.0), u_view), 1.0);\n"); + WRITE(p, " vec4 viewPos = vec4(mul(vec4(worldpos, 1.0), u_view), 1.0);\n"); if (lang == HLSL_D3D11) { // Final view and projection transforms. if (gstate_c.Supports(GPU_ROUND_DEPTH_TO_16BIT)) { - WRITE(p, " float4 outPos = depthRoundZVP(mul(u_proj, viewPos));\n"); + WRITE(p, " vec4 outPos = depthRoundZVP(mul(u_proj, viewPos));\n"); } else { - WRITE(p, " float4 outPos = mul(u_proj, viewPos);\n"); + WRITE(p, " vec4 outPos = mul(u_proj, viewPos);\n"); } } else { // Final view and projection transforms. if (gstate_c.Supports(GPU_ROUND_DEPTH_TO_16BIT)) { - WRITE(p, " float4 outPos = depthRoundZVP(mul(viewPos, u_proj));\n"); + WRITE(p, " vec4 outPos = depthRoundZVP(mul(viewPos, u_proj));\n"); } else { - WRITE(p, " float4 outPos = mul(viewPos, u_proj);\n"); + WRITE(p, " vec4 outPos = mul(viewPos, u_proj);\n"); } } @@ -503,7 +505,7 @@ bool GenerateVertexShaderHLSL(const VShaderID &id, char *buffer, ShaderLanguage bool distanceNeeded = false; bool anySpots = false; if (enableLighting) { - WRITE(p, " float4 lightSum0 = u_ambient * %s + float4(u_matemissive, 0.0);\n", ambientStr); + WRITE(p, " vec4 lightSum0 = u_ambient * %s + float4(u_matemissive, 0.0);\n", ambientStr); for (int i = 0; i < 4; i++) { GELightType type = static_cast(id.Bits(VS_BIT_LIGHT0_TYPE + 4 * i, 2)); @@ -520,11 +522,11 @@ bool GenerateVertexShaderHLSL(const VShaderID &id, char *buffer, ShaderLanguage } if (!specularIsZero) { - WRITE(p, " float3 lightSum1 = 0;\n"); + WRITE(p, " vec3 lightSum1 = 0;\n"); } if (!diffuseIsZero) { - WRITE(p, " float3 toLight;\n"); - WRITE(p, " float3 diffuse;\n"); + WRITE(p, " vec3 toLight;\n"); + WRITE(p, " vec3 diffuse;\n"); } if (distanceNeeded) { WRITE(p, " float distance;\n"); @@ -576,13 +578,13 @@ bool GenerateVertexShaderHLSL(const VShaderID &id, char *buffer, ShaderLanguage timesLightScale = ""; break; case GE_LIGHTTYPE_POINT: - WRITE(p, " lightScale = clamp(1.0 / dot(u_lightatt%i, float3(1.0, distance, distance*distance)), 0.0, 1.0);\n", i); + WRITE(p, " lightScale = clamp(1.0 / dot(u_lightatt%i, vec3(1.0, distance, distance*distance)), 0.0, 1.0);\n", i); break; case GE_LIGHTTYPE_SPOT: case GE_LIGHTTYPE_UNKNOWN: WRITE(p, " angle = length(u_lightdir%i) == 0.0 ? 0.0 : dot(normalize(u_lightdir%i), toLight);\n", i, i); WRITE(p, " if (angle >= u_lightangle_spotCoef%i.x) {\n", i); - WRITE(p, " lightScale = clamp(1.0 / dot(u_lightatt%i, float3(1.0, distance, distance*distance)), 0.0, 1.0) * (u_lightangle_spotCoef%i.y <= 0.0 ? 1.0 : pow(angle, u_lightangle_spotCoef%i.y));\n", i, i, i); + WRITE(p, " lightScale = clamp(1.0 / dot(u_lightatt%i, vec3(1.0, distance, distance*distance)), 0.0, 1.0) * (u_lightangle_spotCoef%i.y <= 0.0 ? 1.0 : pow(angle, u_lightangle_spotCoef%i.y));\n", i, i, i); WRITE(p, " } else {\n"); WRITE(p, " lightScale = 0.0;\n"); WRITE(p, " }\n"); @@ -595,7 +597,7 @@ bool GenerateVertexShaderHLSL(const VShaderID &id, char *buffer, ShaderLanguage WRITE(p, " diffuse = (u_lightdiffuse%i * %s) * max(ldot, 0.0);\n", i, diffuseStr); if (doSpecular) { WRITE(p, " if (ldot >= 0.0) {\n"); - WRITE(p, " ldot = dot(normalize(toLight + float3(0.0, 0.0, 1.0)), worldnormal);\n"); + WRITE(p, " ldot = dot(normalize(toLight + vec3(0.0, 0.0, 1.0)), worldnormal);\n"); WRITE(p, " if (u_matspecular.a <= 0.0) {\n"); WRITE(p, " ldot = 1.0;\n"); WRITE(p, " } else {\n"); @@ -614,7 +616,7 @@ bool GenerateVertexShaderHLSL(const VShaderID &id, char *buffer, ShaderLanguage WRITE(p, " Out.v_color0 = clamp(lightSum0, 0.0, 1.0);\n"); // v_color1 only exists when lmode = 1. if (specularIsZero) { - WRITE(p, " Out.v_color1 = float3(0, 0, 0);\n"); + WRITE(p, " Out.v_color1 = splat3(0.0);\n"); } else { WRITE(p, " Out.v_color1 = clamp(lightSum1, 0.0, 1.0);\n"); } @@ -647,17 +649,17 @@ bool GenerateVertexShaderHLSL(const VShaderID &id, char *buffer, ShaderLanguage if (scaleUV) { if (hasTexcoord) { if (doBezier || doSpline) - WRITE(p, " Out.v_texcoord = float3(tess.tex.xy * u_uvscaleoffset.xy + u_uvscaleoffset.zw, 0.0);\n"); + WRITE(p, " Out.v_texcoord = vec3(tess.tex.xy * u_uvscaleoffset.xy + u_uvscaleoffset.zw, 0.0);\n"); else - WRITE(p, " Out.v_texcoord = float3(In.texcoord.xy * u_uvscaleoffset.xy, 0.0);\n"); + WRITE(p, " Out.v_texcoord = vec3(In.texcoord.xy * u_uvscaleoffset.xy, 0.0);\n"); } else { WRITE(p, " Out.v_texcoord = splat3(0.0);\n"); } } else { if (hasTexcoord) { - WRITE(p, " Out.v_texcoord = float3(In.texcoord.xy * u_uvscaleoffset.xy + u_uvscaleoffset.zw, 0.0);\n"); + WRITE(p, " Out.v_texcoord = vec3(In.texcoord.xy * u_uvscaleoffset.xy + u_uvscaleoffset.zw, 0.0);\n"); } else { - WRITE(p, " Out.v_texcoord = float3(u_uvscaleoffset.zw, 0.0);\n"); + WRITE(p, " Out.v_texcoord = vec3(u_uvscaleoffset.zw, 0.0);\n"); } } break; @@ -667,32 +669,32 @@ bool GenerateVertexShaderHLSL(const VShaderID &id, char *buffer, ShaderLanguage std::string temp_tc; switch (uvProjMode) { case GE_PROJMAP_POSITION: // Use model space XYZ as source - temp_tc = "float4(In.position.xyz, 1.0)"; + temp_tc = "vec4(In.position.xyz, 1.0)"; break; case GE_PROJMAP_UV: // Use unscaled UV as source { if (hasTexcoord) { - temp_tc = StringFromFormat("float4(In.texcoord.xy, 0.0, 1.0)"); + temp_tc = StringFromFormat("vec4(In.texcoord.xy, 0.0, 1.0)"); } else { - temp_tc = "float4(0.0, 0.0, 0.0, 1.0)"; + temp_tc = "vec4(0.0, 0.0, 0.0, 1.0)"; } } break; case GE_PROJMAP_NORMALIZED_NORMAL: // Use normalized transformed normal as source if (hasNormal) - temp_tc = flipNormal ? "float4(normalize(-In.normal), 1.0)" : "float4(normalize(In.normal), 1.0)"; + temp_tc = flipNormal ? "vec4(normalize(-In.normal), 1.0)" : "vec4(normalize(In.normal), 1.0)"; else - temp_tc = "float4(0.0, 0.0, 1.0, 1.0)"; + temp_tc = "vec4(0.0, 0.0, 1.0, 1.0)"; break; case GE_PROJMAP_NORMAL: // Use non-normalized transformed normal as source if (hasNormal) - temp_tc = flipNormal ? "float4(-In.normal, 1.0)" : "float4(In.normal, 1.0)"; + temp_tc = flipNormal ? "vec4(-In.normal, 1.0)" : "vec4(In.normal, 1.0)"; else - temp_tc = "float4(0.0, 0.0, 1.0, 1.0)"; + temp_tc = "vec4(0.0, 0.0, 1.0, 1.0)"; break; } // Transform by texture matrix. XYZ as we are doing projection mapping. - WRITE(p, " Out.v_texcoord.xyz = mul(%s, u_texmtx) * float3(u_uvscaleoffset.xy, 1.0);\n", temp_tc.c_str()); + WRITE(p, " Out.v_texcoord.xyz = mul(%s, u_texmtx) * vec3(u_uvscaleoffset.xy, 1.0);\n", temp_tc.c_str()); } break; @@ -700,7 +702,7 @@ bool GenerateVertexShaderHLSL(const VShaderID &id, char *buffer, ShaderLanguage { std::string lightFactor0 = StringFromFormat("(length(u_lightpos%i) == 0.0 ? worldnormal.z : dot(normalize(u_lightpos%i), worldnormal))", ls0, ls0); std::string lightFactor1 = StringFromFormat("(length(u_lightpos%i) == 0.0 ? worldnormal.z : dot(normalize(u_lightpos%i), worldnormal))", ls1, ls1); - WRITE(p, " Out.v_texcoord = float3(u_uvscaleoffset.xy * float2(1.0 + %s, 1.0 + %s) * 0.5, 1.0);\n", lightFactor0.c_str(), lightFactor1.c_str()); + WRITE(p, " Out.v_texcoord = vec3(u_uvscaleoffset.xy * vec2(1.0 + %s, 1.0 + %s) * 0.5, 1.0);\n", lightFactor0.c_str(), lightFactor1.c_str()); } break; @@ -718,7 +720,7 @@ bool GenerateVertexShaderHLSL(const VShaderID &id, char *buffer, ShaderLanguage } if (!isModeThrough && gstate_c.Supports(GPU_SUPPORTS_VS_RANGE_CULLING)) { - WRITE(p, " float3 projPos = outPos.xyz / outPos.w;\n"); + WRITE(p, " vec3 projPos = outPos.xyz / outPos.w;\n"); // Vertex range culling doesn't happen when depth is clamped, so only do this if in range. WRITE(p, " if (u_cullRangeMin.w <= 0.0 || (projPos.z >= u_cullRangeMin.z && projPos.z <= u_cullRangeMax.z)) {\n"); const char *outMin = "projPos.x < u_cullRangeMin.x || projPos.y < u_cullRangeMin.y || projPos.z < u_cullRangeMin.z"; From 200c25bcc962095c087d149b9621c9bfc51f3902 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Mon, 26 Oct 2020 09:29:47 +0100 Subject: [PATCH 133/275] wip --- GPU/Common/ShaderCommon.cpp | 20 ++++++++++++++++++++ GPU/Common/ShaderCommon.h | 4 ++++ unittest/TestShaderGenerators.cpp | 19 ++++++++++++++++++- 3 files changed, 42 insertions(+), 1 deletion(-) diff --git a/GPU/Common/ShaderCommon.cpp b/GPU/Common/ShaderCommon.cpp index 04c4a12d4d..5aca2bc8fd 100644 --- a/GPU/Common/ShaderCommon.cpp +++ b/GPU/Common/ShaderCommon.cpp @@ -120,3 +120,23 @@ void GLSLShaderCompat::SetupForVulkan() { forceMatrix4x4 = false; coefsFromBuffers = true; } + + +void GLSLShaderCompat::SetupForD3D11() { + fragColor0 = "fragColor0"; + fragColor1 = "fragColor1"; + varying_fs = "in"; + varying_vs = "out"; + attribute = "in"; + bitwiseOps = true; + framebufferFetchExtension = nullptr; + gles = false; + glslES30 = true; + glslVersionNumber = 450; + lastFragData = nullptr; + texture = "texture"; + texelFetch = "texelFetch"; + d3d11 = true; + forceMatrix4x4 = false; + coefsFromBuffers = true; +} diff --git a/GPU/Common/ShaderCommon.h b/GPU/Common/ShaderCommon.h index fd2703809f..230424b0e8 100644 --- a/GPU/Common/ShaderCommon.h +++ b/GPU/Common/ShaderCommon.h @@ -30,6 +30,8 @@ enum ShaderLanguage { GLSL_VULKAN, HLSL_DX9, HLSL_D3D11, + + HLSL_D3D11_TEST, // temporary }; enum DebugShaderType { @@ -155,8 +157,10 @@ struct GLSLShaderCompat { bool bitwiseOps; bool forceMatrix4x4; bool coefsFromBuffers; + bool d3d11; void SetupForVulkan(); + void SetupForD3D11(); }; // PSP vertex format. diff --git a/unittest/TestShaderGenerators.cpp b/unittest/TestShaderGenerators.cpp index 29e9b98c87..97ca5b0618 100644 --- a/unittest/TestShaderGenerators.cpp +++ b/unittest/TestShaderGenerators.cpp @@ -40,6 +40,13 @@ bool GenerateFShader(FShaderID id, char *buffer, ShaderLanguage lang, std::strin case ShaderLanguage::GLSL_300: // TODO: Need a device - except that maybe glslang could be used to verify these .... return false; + case ShaderLanguage::HLSL_D3D11_TEST: + { + GLSLShaderCompat compat{}; + compat.SetupForVulkan(); + uint64_t uniformMask; + return GenerateFragmentShaderGLSL(id, buffer, compat, &uniformMask, errorString); + } default: return false; } @@ -62,6 +69,14 @@ bool GenerateVShader(VShaderID id, char *buffer, ShaderLanguage lang, std::strin uint64_t uniformMask; return GenerateVertexShaderGLSL(id, buffer, compat, &attrMask, &uniformMask, errorString); } + case ShaderLanguage::HLSL_D3D11_TEST: + { + GLSLShaderCompat compat{}; + compat.SetupForD3D11(); + uint32_t attrMask; + uint64_t uniformMask; + return GenerateVertexShaderGLSL(id, buffer, compat, &attrMask, &uniformMask, errorString); + } default: return false; } @@ -70,6 +85,7 @@ bool GenerateVShader(VShaderID id, char *buffer, ShaderLanguage lang, std::strin bool TestCompileShader(const char *buffer, ShaderLanguage lang, bool vertex) { switch (lang) { case ShaderLanguage::HLSL_D3D11: + case ShaderLanguage::HLSL_D3D11_TEST: { auto output = CompileShaderToBytecodeD3D11(buffer, strlen(buffer), vertex ? "vs_4_0" : "ps_4_0", 0); return !output.empty(); @@ -128,8 +144,9 @@ bool TestShaderGenerators() { LoadD3DCompilerDynamic(); ShaderLanguage languages[] = { - ShaderLanguage::GLSL_VULKAN, + ShaderLanguage::HLSL_D3D11_TEST, ShaderLanguage::HLSL_D3D11, + ShaderLanguage::GLSL_VULKAN, ShaderLanguage::GLSL_140, ShaderLanguage::GLSL_300, ShaderLanguage::HLSL_DX9, From 984a4d2641dff980dd45d291f20cfae170743a9a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Wed, 28 Oct 2020 23:19:40 +0100 Subject: [PATCH 134/275] Start adding HLSL support to the GLSL shader generator. --- GPU/Common/ShaderCommon.cpp | 6 +- GPU/Common/ShaderCommon.h | 4 +- GPU/Directx9/FragmentShaderGeneratorHLSL.cpp | 115 ++++++++++-------- GPU/GLES/FragmentShaderGeneratorGLES.cpp | 120 +++++++++++++++---- unittest/TestShaderGenerators.cpp | 111 ++++++++--------- 5 files changed, 228 insertions(+), 128 deletions(-) diff --git a/GPU/Common/ShaderCommon.cpp b/GPU/Common/ShaderCommon.cpp index 5aca2bc8fd..797f96a361 100644 --- a/GPU/Common/ShaderCommon.cpp +++ b/GPU/Common/ShaderCommon.cpp @@ -119,12 +119,13 @@ void GLSLShaderCompat::SetupForVulkan() { vulkan = true; forceMatrix4x4 = false; coefsFromBuffers = true; + inPrefix = ""; } void GLSLShaderCompat::SetupForD3D11() { - fragColor0 = "fragColor0"; - fragColor1 = "fragColor1"; + fragColor0 = "outfragment.target"; + fragColor1 = "outfragment.target1"; varying_fs = "in"; varying_vs = "out"; attribute = "in"; @@ -139,4 +140,5 @@ void GLSLShaderCompat::SetupForD3D11() { d3d11 = true; forceMatrix4x4 = false; coefsFromBuffers = true; + inPrefix = "In."; } diff --git a/GPU/Common/ShaderCommon.h b/GPU/Common/ShaderCommon.h index 230424b0e8..eafa99da2d 100644 --- a/GPU/Common/ShaderCommon.h +++ b/GPU/Common/ShaderCommon.h @@ -144,6 +144,8 @@ struct GLSLShaderCompat { int glslVersionNumber; bool gles; bool vulkan; + bool d3d11; + bool d3d9; const char *varying_fs; const char *varying_vs; const char *attribute; @@ -153,11 +155,11 @@ struct GLSLShaderCompat { const char *texelFetch; const char *lastFragData; const char *framebufferFetchExtension; + const char *inPrefix; bool glslES30; bool bitwiseOps; bool forceMatrix4x4; bool coefsFromBuffers; - bool d3d11; void SetupForVulkan(); void SetupForD3D11(); diff --git a/GPU/Directx9/FragmentShaderGeneratorHLSL.cpp b/GPU/Directx9/FragmentShaderGeneratorHLSL.cpp index 9b28695e1b..0105bb6e71 100644 --- a/GPU/Directx9/FragmentShaderGeneratorHLSL.cpp +++ b/GPU/Directx9/FragmentShaderGeneratorHLSL.cpp @@ -29,6 +29,23 @@ // #define DEBUG_SHADER +const char *hlsl_preamble = +"#define vec2 float2\n" +"#define vec3 float3\n" +"#define vec4 float4\n" +"#define uvec3 uint\n" +"#define ivec3 int3\n" +"#define splat3(x) float3(x, x, x)\n"; + +const char *hlsl_d3d11_preamble = +"#define DISCARD discard\n" +"#define DISCARD_BELOW(x) clip(x);\n"; +const char *hlsl_d3d9_preamble = +"#define DISCARD clip(-1)\n" +"#define DISCARD_BELOW(x) clip(x)\n"; + +const char *hlsl_late_preamble = ""; + // Missing: Z depth range // Also, logic ops etc, of course, as they are not supported in DX9. bool GenerateFragmentShaderHLSL(const FShaderID &id, char *buffer, ShaderLanguage lang, std::string *errorString) { @@ -66,26 +83,24 @@ bool GenerateFragmentShaderHLSL(const FShaderID &id, char *buffer, ShaderLanguag StencilValueType replaceAlphaWithStencilType = (StencilValueType)id.Bits(FS_BIT_REPLACE_ALPHA_WITH_STENCIL_TYPE, 4); + WRITE(p, "%s", hlsl_preamble); + // Output some compatibility defines switch (lang) { case ShaderLanguage::HLSL_DX9: - WRITE(p, "#define DISCARD clip(-1)\n"); + WRITE(p, hlsl_d3d9_preamble); break; case ShaderLanguage::HLSL_D3D11: - WRITE(p, "#define DISCARD discard\n"); + WRITE(p, hlsl_d3d11_preamble); break; } - WRITE(p, "#define vec2 float2\n"); - WRITE(p, "#define vec3 float3\n"); - WRITE(p, "#define vec4 float4\n"); - WRITE(p, "#define splat3(x) float3(x, x, x)\n"); if (lang == HLSL_DX9) { if (doTexture) WRITE(p, "sampler tex : register(s0);\n"); if (!isModeClear && replaceBlend > REPLACE_BLEND_STANDARD) { if (replaceBlend == REPLACE_BLEND_COPY_FBO) { - WRITE(p, "float2 u_fbotexSize : register(c%i);\n", CONST_PS_FBOTEXSIZE); + WRITE(p, "vec2 u_fbotexSize : register(c%i);\n", CONST_PS_FBOTEXSIZE); WRITE(p, "sampler fbotex : register(s1);\n"); } if (replaceBlendFuncA >= GE_SRCBLEND_FIXA) { @@ -96,15 +111,15 @@ bool GenerateFragmentShaderHLSL(const FShaderID &id, char *buffer, ShaderLanguag } } if (gstate_c.needShaderTexClamp && doTexture) { - WRITE(p, "float4 u_texclamp : register(c%i);\n", CONST_PS_TEXCLAMP); + WRITE(p, "vec4 u_texclamp : register(c%i);\n", CONST_PS_TEXCLAMP); if (textureAtOffset) { - WRITE(p, "float2 u_texclampoff : register(c%i);\n", CONST_PS_TEXCLAMPOFF); + WRITE(p, "vec2 u_texclampoff : register(c%i);\n", CONST_PS_TEXCLAMPOFF); } } if (enableAlphaTest || enableColorTest) { - WRITE(p, "float4 u_alphacolorref : register(c%i);\n", CONST_PS_ALPHACOLORREF); - WRITE(p, "float4 u_alphacolormask : register(c%i);\n", CONST_PS_ALPHACOLORMASK); + WRITE(p, "vec4 u_alphacolorref : register(c%i);\n", CONST_PS_ALPHACOLORREF); + WRITE(p, "vec4 u_alphacolormask : register(c%i);\n", CONST_PS_ALPHACOLORMASK); } if (stencilToAlpha && replaceAlphaWithStencilType == STENCIL_VALUE_UNIFORM) { WRITE(p, "float u_stencilReplaceValue : register(c%i);\n", CONST_PS_STENCILREPLACE); @@ -117,11 +132,11 @@ bool GenerateFragmentShaderHLSL(const FShaderID &id, char *buffer, ShaderLanguag } } else { WRITE(p, "SamplerState samp : register(s0);\n"); - WRITE(p, "Texture2D tex : register(t0);\n"); + WRITE(p, "Texture2D tex : register(t0);\n"); if (!isModeClear && replaceBlend > REPLACE_BLEND_STANDARD) { if (replaceBlend == REPLACE_BLEND_COPY_FBO) { // No sampler required, we Load - WRITE(p, "Texture2D fboTex : register(t1);\n"); + WRITE(p, "Texture2D fboTex : register(t1);\n"); } } WRITE(p, "cbuffer base : register(b0) {\n%s};\n", cb_baseStr); @@ -139,54 +154,56 @@ bool GenerateFragmentShaderHLSL(const FShaderID &id, char *buffer, ShaderLanguag if (lang == HLSL_D3D11) { WRITE(p, "uint3 roundAndScaleTo255iv(float3 x) { return uint3(floor(x * 255.0f + 0.5f)); }\n"); } else { - WRITE(p, "float3 roundAndScaleTo255v(float3 x) { return floor(x * 255.0f + 0.5f); }\n"); + WRITE(p, "vec3 roundAndScaleTo255v(float3 x) { return floor(x * 255.0f + 0.5f); }\n"); } } WRITE(p, "struct PS_IN {\n"); if (doTexture) { - WRITE(p, " float3 v_texcoord: TEXCOORD0;\n"); + WRITE(p, " vec3 v_texcoord: TEXCOORD0;\n"); } const char *colorInterpolation = doFlatShading && lang == HLSL_D3D11 ? "nointerpolation " : ""; - WRITE(p, " %sfloat4 v_color0: COLOR0;\n", colorInterpolation); + WRITE(p, " %svec4 v_color0: COLOR0;\n", colorInterpolation); if (lmode) { - WRITE(p, " float3 v_color1: COLOR1;\n"); + WRITE(p, " vec3 v_color1: COLOR1;\n"); } if (enableFog) { WRITE(p, " float v_fogdepth: TEXCOORD1;\n"); } if (lang == HLSL_D3D11 && ((replaceBlend == REPLACE_BLEND_COPY_FBO) || gstate_c.Supports(GPU_ROUND_FRAGMENT_DEPTH_TO_16BIT))) { - WRITE(p, " float4 pixelPos : SV_POSITION;\n"); + WRITE(p, " vec4 pixelPos : SV_POSITION;\n"); } WRITE(p, "};\n"); if (lang == HLSL_DX9) { - WRITE(p, "float4 main( PS_IN In ) : COLOR {\n"); + WRITE(p, "%s", hlsl_late_preamble); + WRITE(p, "vec4 main( PS_IN In ) : COLOR {\n"); } else { WRITE(p, "struct PS_OUT {\n"); if (stencilToAlpha == REPLACE_ALPHA_DUALSOURCE) { - WRITE(p, " float4 target : SV_Target0;\n"); - WRITE(p, " float4 target1 : SV_Target1;\n"); + WRITE(p, " vec4 target : SV_Target0;\n"); + WRITE(p, " vec4 target1 : SV_Target1;\n"); } else { - WRITE(p, " float4 target : SV_Target;\n"); + WRITE(p, " vec4 target : SV_Target;\n"); } if (gstate_c.Supports(GPU_ROUND_FRAGMENT_DEPTH_TO_16BIT)) { WRITE(p, " float depth : SV_DEPTH;\n"); } WRITE(p, "};\n"); + WRITE(p, "%s", hlsl_late_preamble); WRITE(p, "PS_OUT main( PS_IN In ) {\n"); WRITE(p, " PS_OUT outfragment;\n"); } if (isModeClear) { // Clear mode does not allow any fancy shading. - WRITE(p, " float4 v = In.v_color0;\n"); + WRITE(p, " vec4 v = In.v_color0;\n"); } else { const char *secondary = ""; // Secondary color for specular on top of texture if (lmode) { - WRITE(p, " float4 s = float4(In.v_color1, 0);\n"); + WRITE(p, " vec4 s = vec4(In.v_color1, 0.0);\n"); secondary = " + s"; } else { secondary = ""; @@ -221,7 +238,7 @@ bool GenerateFragmentShaderHLSL(const FShaderID &id, char *buffer, ShaderLanguag vcoord = "(" + vcoord + " + u_texclampoff.y)"; } - WRITE(p, " float2 fixedcoord = float2(%s, %s);\n", ucoord.c_str(), vcoord.c_str()); + WRITE(p, " vec2 fixedcoord = vec2(%s, %s);\n", ucoord.c_str(), vcoord.c_str()); texcoord = "fixedcoord"; // We already projected it. doTextureProjection = false; @@ -229,55 +246,55 @@ bool GenerateFragmentShaderHLSL(const FShaderID &id, char *buffer, ShaderLanguag if (lang == HLSL_D3D11) { if (doTextureProjection) { - WRITE(p, " float4 t = tex.Sample(samp, In.v_texcoord.xy / In.v_texcoord.z)%s;\n", bgraTexture ? ".bgra" : ""); + WRITE(p, " vec4 t = tex.Sample(samp, In.v_texcoord.xy / In.v_texcoord.z)%s;\n", bgraTexture ? ".bgra" : ""); } else { - WRITE(p, " float4 t = tex.Sample(samp, %s.xy)%s;\n", texcoord, bgraTexture ? ".bgra" : ""); + WRITE(p, " vec4 t = tex.Sample(samp, %s.xy)%s;\n", texcoord, bgraTexture ? ".bgra" : ""); } } else { if (doTextureProjection) { - WRITE(p, " float4 t = tex2Dproj(tex, float4(In.v_texcoord.x, In.v_texcoord.y, 0, In.v_texcoord.z))%s;\n", bgraTexture ? ".bgra" : ""); + WRITE(p, " vec4 t = tex2Dproj(tex, vec4(v_texcoord.x, v_texcoord.y, 0, v_texcoord.z))%s;\n", bgraTexture ? ".bgra" : ""); } else { - WRITE(p, " float4 t = tex2D(tex, %s.xy)%s;\n", texcoord, bgraTexture ? ".bgra" : ""); + WRITE(p, " vec4 t = tex2D(tex, %s.xy)%s;\n", texcoord, bgraTexture ? ".bgra" : ""); } } - WRITE(p, " float4 p = In.v_color0;\n"); + WRITE(p, " vec4 p = In.v_color0;\n"); if (doTextureAlpha) { // texfmt == RGBA switch (texFunc) { case GE_TEXFUNC_MODULATE: - WRITE(p, " float4 v = p * t%s;\n", secondary); break; + WRITE(p, " vec4 v = p * t%s;\n", secondary); break; case GE_TEXFUNC_DECAL: - WRITE(p, " float4 v = float4(lerp(p.rgb, t.rgb, t.a), p.a)%s;\n", secondary); break; + WRITE(p, " vec4 v = vec4(lerp(p.rgb, t.rgb, t.a), p.a)%s;\n", secondary); break; case GE_TEXFUNC_BLEND: - WRITE(p, " float4 v = float4(lerp(p.rgb, u_texenv.rgb, t.rgb), p.a * t.a)%s;\n", secondary); break; + WRITE(p, " vec4 v = vec4(lerp(p.rgb, u_texenv.rgb, t.rgb), p.a * t.a)%s;\n", secondary); break; case GE_TEXFUNC_REPLACE: - WRITE(p, " float4 v = t%s;\n", secondary); break; + WRITE(p, " vec4 v = t%s;\n", secondary); break; case GE_TEXFUNC_ADD: case GE_TEXFUNC_UNKNOWN1: case GE_TEXFUNC_UNKNOWN2: case GE_TEXFUNC_UNKNOWN3: - WRITE(p, " float4 v = float4(p.rgb + t.rgb, p.a * t.a)%s;\n", secondary); break; + WRITE(p, " vec4 v = vec4(p.rgb + t.rgb, p.a * t.a)%s;\n", secondary); break; default: - WRITE(p, " float4 v = p;\n"); break; + WRITE(p, " vec4 v = p;\n"); break; } } else { // texfmt == RGB switch (texFunc) { case GE_TEXFUNC_MODULATE: - WRITE(p, " float4 v = float4(t.rgb * p.rgb, p.a)%s;\n", secondary); break; + WRITE(p, " vec4 v = vec4(t.rgb * p.rgb, p.a)%s;\n", secondary); break; case GE_TEXFUNC_DECAL: - WRITE(p, " float4 v = float4(t.rgb, p.a)%s;\n", secondary); break; + WRITE(p, " vec4 v = vec4(t.rgb, p.a)%s;\n", secondary); break; case GE_TEXFUNC_BLEND: - WRITE(p, " float4 v = float4(lerp(p.rgb, u_texenv.rgb, t.rgb), p.a)%s;\n", secondary); break; + WRITE(p, " vec4 v = vec4(lerp(p.rgb, u_texenv.rgb, t.rgb), p.a)%s;\n", secondary); break; case GE_TEXFUNC_REPLACE: - WRITE(p, " float4 v = float4(t.rgb, p.a)%s;\n", secondary); break; + WRITE(p, " vec4 v = vec4(t.rgb, p.a)%s;\n", secondary); break; case GE_TEXFUNC_ADD: case GE_TEXFUNC_UNKNOWN1: case GE_TEXFUNC_UNKNOWN2: case GE_TEXFUNC_UNKNOWN3: - WRITE(p, " float4 v = float4(p.rgb + t.rgb, p.a)%s;\n", secondary); break; + WRITE(p, " vec4 v = vec4(p.rgb + t.rgb, p.a)%s;\n", secondary); break; default: - WRITE(p, " float4 v = p;\n"); break; + WRITE(p, " vec4 v = p;\n"); break; } } @@ -287,12 +304,12 @@ bool GenerateFragmentShaderHLSL(const FShaderID &id, char *buffer, ShaderLanguag } } else { // No texture mapping - WRITE(p, " float4 v = In.v_color0 %s;\n", secondary); + WRITE(p, " vec4 v = In.v_color0 %s;\n", secondary); } if (enableFog) { WRITE(p, " float fogCoef = clamp(In.v_fogdepth, 0.0, 1.0);\n"); - WRITE(p, " v = lerp(float4(u_fogcolor, v.a), v, fogCoef);\n"); + WRITE(p, " v = lerp(vec4(u_fogcolor, v.a), v, fogCoef);\n"); } if (enableAlphaTest) { @@ -352,7 +369,7 @@ bool GenerateFragmentShaderHLSL(const FShaderID &id, char *buffer, ShaderLanguag WRITE(p, " if (v_masked.r %s colorTestRef.r && v_masked.g %s colorTestRef.g && v_masked.b %s colorTestRef.b) DISCARD;\n", test, test, test); } else { // TODO: Use a texture to lookup bitwise ops instead? - WRITE(p, " float3 colortest = roundAndScaleTo255v(v.rgb);\n"); + WRITE(p, " vec3 colortest = roundAndScaleTo255v(v.rgb);\n"); WRITE(p, " if ((colortest.r %s u_alphacolorref.r) && (colortest.g %s u_alphacolorref.g) && (colortest.b %s u_alphacolorref.b)) DISCARD;\n", test, test, test); } } @@ -393,7 +410,7 @@ bool GenerateFragmentShaderHLSL(const FShaderID &id, char *buffer, ShaderLanguag } if (lang == HLSL_D3D11 && replaceBlend == REPLACE_BLEND_COPY_FBO) { - WRITE(p, " float4 destColor = fboTex.Load(int3((int)In.pixelPos.x, (int)In.pixelPos.y, 0));\n"); + WRITE(p, " vec4 destColor = fboTex.Load(int3((int)In.pixelPos.x, (int)In.pixelPos.y, 0));\n"); const char *srcFactor = nullptr; const char *dstFactor = nullptr; @@ -403,7 +420,7 @@ bool GenerateFragmentShaderHLSL(const FShaderID &id, char *buffer, ShaderLanguag case GE_SRCBLEND_INVDSTCOLOR: srcFactor = "(splat3(1.0) - destColor.rgb)"; break; case GE_SRCBLEND_SRCALPHA: srcFactor = "v.aaa"; break; case GE_SRCBLEND_INVSRCALPHA: srcFactor = "splat3(1.0) - v.aaa"; break; - case GE_SRCBLEND_DSTALPHA: srcFactor = "float3(destColor.aaa)"; break; + case GE_SRCBLEND_DSTALPHA: srcFactor = "destColor.aaa"; break; case GE_SRCBLEND_INVDSTALPHA: srcFactor = "splat3(1.0) - destColor.aaa"; break; case GE_SRCBLEND_DOUBLESRCALPHA: srcFactor = "v.aaa * 2.0"; break; case GE_SRCBLEND_DOUBLEINVSRCALPHA: srcFactor = "splat3(1.0) - v.aaa * 2.0"; break; @@ -540,8 +557,8 @@ bool GenerateFragmentShaderHLSL(const FShaderID &id, char *buffer, ShaderLanguag if (lang == HLSL_D3D11) { if (stencilToAlpha == REPLACE_ALPHA_DUALSOURCE) { - WRITE(p, " outfragment.target = float4(v.rgb, %s);\n", replacedAlpha.c_str()); - WRITE(p, " outfragment.target1 = float4(0.0, 0.0, 0.0, v.a);\n"); + WRITE(p, " outfragment.target = vec4(v.rgb, %s);\n", replacedAlpha.c_str()); + WRITE(p, " outfragment.target1 = vec4(0.0, 0.0, 0.0, v.a);\n"); WRITE(p, " return outfragment;\n"); } else { diff --git a/GPU/GLES/FragmentShaderGeneratorGLES.cpp b/GPU/GLES/FragmentShaderGeneratorGLES.cpp index bbd6aee489..a5a24e044b 100644 --- a/GPU/GLES/FragmentShaderGeneratorGLES.cpp +++ b/GPU/GLES/FragmentShaderGeneratorGLES.cpp @@ -40,7 +40,16 @@ static const char *vulkan_glsl_preamble = "#extension GL_ARB_shading_language_420pack : enable\n" "#extension GL_ARB_conservative_depth : enable\n" "#extension GL_ARB_shader_image_load_store : enable\n" -"#define splat3(x) vec3(x)\n\n"; +"#define splat3(x) vec3(x)\n" +"#define lowp\n" +"#define mediump\n" +"#define highp\n" +"#define DISCARD discard\n" +"\n"; +extern const char *hlsl_preamble; +extern const char *hlsl_d3d9_preamble; +extern const char *hlsl_d3d11_preamble; +extern const char *hlsl_late_preamble; bool GenerateFragmentShaderGLSL(const FShaderID &id, char *buffer, const GLSLShaderCompat &compat, uint64_t *uniformMask, std::string *errorString) { *uniformMask = 0; @@ -62,11 +71,15 @@ bool GenerateFragmentShaderGLSL(const FShaderID &id, char *buffer, const GLSLSha if (compat.vulkan) { WRITE(p, "%s", vulkan_glsl_preamble); - WRITE(p, "#define lowp\n"); - WRITE(p, "#define mediump\n"); - WRITE(p, "#define highp\n"); + } else if (compat.d3d11) { + WRITE(p, "%s", hlsl_preamble); + WRITE(p, "%s", hlsl_d3d11_preamble); + } else if (compat.d3d9) { + WRITE(p, "%s", hlsl_preamble); + WRITE(p, "%s", hlsl_d3d9_preamble); } else { WRITE(p, "#version %d%s\n", compat.glslVersionNumber, compat.gles ? " es" : ""); + WRITE(p, "#define DISCARD discard\n"); if (stencilToAlpha == REPLACE_ALPHA_DUALSOURCE && gl_extensions.EXT_blend_func_extended) { WRITE(p, "#extension GL_EXT_blend_func_extended : require\n"); @@ -102,6 +115,7 @@ bool GenerateFragmentShaderGLSL(const FShaderID &id, char *buffer, const GLSLSha bool doTextureAlpha = id.Bit(FS_BIT_TEXALPHA); bool doFlatShading = id.Bit(FS_BIT_FLATSHADE); bool shaderDepal = id.Bit(FS_BIT_SHADER_DEPAL); + bool bgraTexture = id.Bit(FS_BIT_BGRA_TEXTURE); GEComparison alphaTestFunc = (GEComparison)id.Bits(FS_BIT_ALPHA_TEST_FUNC, 3); GEComparison colorTestFunc = (GEComparison)id.Bits(FS_BIT_COLOR_TEST_FUNC, 2); @@ -169,6 +183,52 @@ bool GenerateFragmentShaderGLSL(const FShaderID &id, char *buffer, const GLSLSha if (stencilToAlpha == REPLACE_ALPHA_DUALSOURCE) { WRITE(p, "layout (location = 0, index = 1) out vec4 fragColor1;\n"); } + } else if (compat.d3d11) { + WRITE(p, "SamplerState samp : register(s0);\n"); + WRITE(p, "Texture2D tex : register(t0);\n"); + if (!isModeClear && replaceBlend > REPLACE_BLEND_STANDARD) { + if (replaceBlend == REPLACE_BLEND_COPY_FBO) { + // No sampler required, we Load + WRITE(p, "Texture2D fboTex : register(t1);\n"); + } + } + WRITE(p, "cbuffer base : register(b0) {\n%s};\n", cb_baseStr); + + if (enableAlphaTest) { + WRITE(p, "int roundAndScaleTo255i(float x) { return int(floor(x * 255.0f + 0.5f)); }\n"); + } + if (enableColorTest) { + WRITE(p, "uvec3 roundAndScaleTo255iv(float3 x) { return uvec3(floor(x * 255.0f + 0.5f)); }\n"); + } + + WRITE(p, "struct PS_IN {\n"); + if (doTexture) { + WRITE(p, " vec3 v_texcoord: TEXCOORD0;\n"); + } + const char *colorInterpolation = doFlatShading ? "nointerpolation " : ""; + WRITE(p, " %svec4 v_color0: COLOR0;\n", colorInterpolation); + if (lmode) { + WRITE(p, " vec3 v_color1: COLOR1;\n"); + } + if (enableFog) { + WRITE(p, " float v_fogdepth: TEXCOORD1;\n"); + } + if ((replaceBlend == REPLACE_BLEND_COPY_FBO) || gstate_c.Supports(GPU_ROUND_FRAGMENT_DEPTH_TO_16BIT)) { + WRITE(p, " vec4 pixelPos : SV_POSITION;\n"); + } + WRITE(p, "};\n"); + + WRITE(p, "struct PS_OUT {\n"); + if (stencilToAlpha == REPLACE_ALPHA_DUALSOURCE) { + WRITE(p, " vec4 target : SV_Target0;\n"); + WRITE(p, " vec4 target1 : SV_Target1;\n"); + } else { + WRITE(p, " vec4 target : SV_Target;\n"); + } + if (gstate_c.Supports(GPU_ROUND_FRAGMENT_DEPTH_TO_16BIT)) { + WRITE(p, " float depth : SV_DEPTH;\n"); + } + WRITE(p, "};\n"); } else { if (shaderDepal && gl_extensions.IsGLES) { WRITE(p, "precision highp int;\n"); @@ -283,22 +343,28 @@ bool GenerateFragmentShaderGLSL(const FShaderID &id, char *buffer, const GLSLSha WRITE(p, "float mymod(float a, float b) { return a - b * floor(a / b); }\n"); } - WRITE(p, "void main() {\n"); + if (compat.d3d11) { + WRITE(p, "%s", hlsl_late_preamble); + WRITE(p, "PS_OUT main( PS_IN In ) {\n"); + WRITE(p, " PS_OUT outfragment;\n"); + } else { + WRITE(p, "void main() {\n"); + } if (isModeClear) { // Clear mode does not allow any fancy shading. - WRITE(p, " vec4 v = v_color0;\n"); + WRITE(p, " vec4 v = %sv_color0;\n", compat.inPrefix); } else { const char *secondary = ""; // Secondary color for specular on top of texture if (lmode) { - WRITE(p, " vec4 s = vec4(v_color1, 0.0);\n"); + WRITE(p, " vec4 s = vec4(%sv_color1, 0.0);\n", compat.inPrefix); secondary = " + s"; } else { secondary = ""; } if (doTexture) { - const char *texcoord = "v_texcoord"; + std::string texcoord = std::string(compat.inPrefix) + "v_texcoord"; // TODO: Not sure the right way to do this for projection. // This path destroys resolution on older PowerVR no matter what I do if projection is needed, // so we disable it on SGX 540 and lesser, and live with the consequences. @@ -312,11 +378,11 @@ bool GenerateFragmentShaderGLSL(const FShaderID &id, char *buffer, const GLSLSha // We may be clamping inside a larger surface (tex = 64x64, buffer=480x272). // We may also be wrapping in such a surface, or either one in a too-small surface. // Obviously, clamping to a smaller surface won't work. But better to clamp to something. - std::string ucoord = "v_texcoord.x"; - std::string vcoord = "v_texcoord.y"; + std::string ucoord = std::string(compat.inPrefix) + "v_texcoord.x"; + std::string vcoord = std::string(compat.inPrefix) + "v_texcoord.y"; if (doTextureProjection) { - ucoord = "(v_texcoord.x / v_texcoord.z)"; - vcoord = "(v_texcoord.y / v_texcoord.z)"; + ucoord = StringFromFormat("(%sv_texcoord.x / %sv_texcoord.z)", compat.inPrefix, compat.inPrefix); + vcoord = StringFromFormat("(%sv_texcoord.y / %sv_texcoord.z)", compat.inPrefix, compat.inPrefix); } std::string modulo = (gl_extensions.bugs & BUG_PVR_SHADER_PRECISION_BAD) ? "mymod" : "mod"; @@ -343,18 +409,26 @@ bool GenerateFragmentShaderGLSL(const FShaderID &id, char *buffer, const GLSLSha } if (!shaderDepal) { - if (doTextureProjection) { - WRITE(p, " vec4 t = %sProj(tex, %s);\n", compat.texture, texcoord); + if (compat.d3d11) { + if (doTextureProjection) { + WRITE(p, " vec4 t = tex.Sample(samp, v_texcoord.xy / v_texcoord.z)%s;\n", bgraTexture ? ".bgra" : ""); + } else { + WRITE(p, " vec4 t = tex.Sample(samp, %s.xy)%s;\n", texcoord.c_str(), bgraTexture ? ".bgra" : ""); + } } else { - WRITE(p, " vec4 t = %s(tex, %s.xy);\n", compat.texture, texcoord); + if (doTextureProjection) { + WRITE(p, " vec4 t = %sProj(tex, %s);\n", compat.texture, texcoord.c_str()); + } else { + WRITE(p, " vec4 t = %s(tex, %s.xy);\n", compat.texture, texcoord.c_str()); + } } } else { if (doTextureProjection) { // We don't use textureProj because we need better control and it's probably not much of a savings anyway. // However it is good for precision on older hardware like PowerVR. - WRITE(p, " vec2 uv = %s.xy/%s.z;\n vec2 uv_round;\n", texcoord, texcoord); + WRITE(p, " vec2 uv = %s.xy/%s.z;\n vec2 uv_round;\n", texcoord.c_str(), texcoord.c_str()); } else { - WRITE(p, " vec2 uv = %s.xy;\n vec2 uv_round;\n", texcoord); + WRITE(p, " vec2 uv = %s.xy;\n vec2 uv_round;\n", texcoord.c_str()); } WRITE(p, " vec2 tsize = vec2(textureSize(tex, 0));\n"); WRITE(p, " vec2 fraction;\n"); @@ -441,7 +515,7 @@ bool GenerateFragmentShaderGLSL(const FShaderID &id, char *buffer, const GLSLSha } if (texFunc != GE_TEXFUNC_REPLACE || !doTextureAlpha) - WRITE(p, " vec4 p = v_color0;\n"); + WRITE(p, " vec4 p = %sv_color0;\n", compat.inPrefix); if (doTextureAlpha) { // texfmt == RGBA switch (texFunc) { @@ -504,11 +578,11 @@ bool GenerateFragmentShaderGLSL(const FShaderID &id, char *buffer, const GLSLSha } } else { // No texture mapping - WRITE(p, " vec4 v = v_color0 %s;\n", secondary); + WRITE(p, " vec4 v = %sv_color0 %s;\n", compat.inPrefix, secondary); } if (enableFog) { - WRITE(p, " float fogCoef = clamp(v_fogdepth, 0.0, 1.0);\n"); + WRITE(p, " float fogCoef = clamp(%sv_fogdepth, 0.0, 1.0);\n", compat.inPrefix); WRITE(p, " v = mix(vec4(u_fogcolor, v.a), v, fogCoef);\n"); // WRITE(p, " v.x = v_depth;\n"); } @@ -527,7 +601,7 @@ bool GenerateFragmentShaderGLSL(const FShaderID &id, char *buffer, const GLSLSha } } - const char *discardStatement = testForceToZero ? "v.a = 0.0;" : "discard;"; + const char *discardStatement = testForceToZero ? "v.a = 0.0;" : "DISCARD;"; if (enableAlphaTest) { if (alphaTestAgainstZero) { // When testing against 0 (extremely common), we can avoid some math. @@ -814,6 +888,10 @@ bool GenerateFragmentShaderGLSL(const FShaderID &id, char *buffer, const GLSLSha WRITE(p, " gl_FragDepth = gl_FragCoord.z;\n"); } + if (compat.d3d11) { + WRITE(p, " return outfragment;\n"); + } + WRITE(p, "}\n"); return true; diff --git a/unittest/TestShaderGenerators.cpp b/unittest/TestShaderGenerators.cpp index 97ca5b0618..fdbb04b3ea 100644 --- a/unittest/TestShaderGenerators.cpp +++ b/unittest/TestShaderGenerators.cpp @@ -43,7 +43,7 @@ bool GenerateFShader(FShaderID id, char *buffer, ShaderLanguage lang, std::strin case ShaderLanguage::HLSL_D3D11_TEST: { GLSLShaderCompat compat{}; - compat.SetupForVulkan(); + compat.SetupForD3D11(); uint64_t uniformMask; return GenerateFragmentShaderGLSL(id, buffer, compat, &uniformMask, errorString); } @@ -162,6 +162,60 @@ bool TestShaderGenerators() { int successes = 0; int count = 700; + // Generate a bunch of random fragment shader IDs, try to generate shader source. + // Then compile it and check that it's ok. + for (int i = 0; i < count; i++) { + uint32_t bottom = rng.R32(); + uint32_t top = rng.R32(); + FShaderID id; + id.d[0] = bottom; + id.d[1] = top; + + // bits we don't need to test because they are irrelevant on d3d11 + id.SetBit(FS_BIT_NO_DEPTH_CANNOT_DISCARD_STENCIL, false); + + bool generateSuccess[numLanguages]{}; + std::string genErrorString[numLanguages]; + + for (int j = 0; j < numLanguages; j++) { + generateSuccess[j] = GenerateFShader(id, buffer[j], languages[j], &genErrorString[j]); + if (!genErrorString[j].empty()) { + printf("%s\n", genErrorString[j].c_str()); + } + // We ignore the contents of the error string here, not even gonna try to compile if it errors. + } + + // KEEPING FOR REUSE LATER: Defunct temporary test. + if (generateSuccess[0] != generateSuccess[1]) { + printf("mismatching success! %s %s\n", genErrorString[0].c_str(), genErrorString[1].c_str()); + printf("%s\n", buffer[0]); + printf("%s\n", buffer[1]); + return 1; + } + if (generateSuccess[0] && strcmp(buffer[0], buffer[1])) { + printf("mismatching shaders! a=glsl b=hlsl\n"); + PrintDiff(buffer[0], buffer[1]); + return 1; + } + + // Now that we have the strings ready for easy comparison (buffer,4 in the watch window), + // let's try to compile them. + for (int j = 0; j < numLanguages; j++) { + if (generateSuccess[j]) { + if (!TestCompileShader(buffer[j], languages[j], false)) { + printf("Error compiling fragment shader:\n\n%s\n\n", LineNumberString(buffer[j]).c_str()); + return false; + } + successes++; + } + } + } + + printf("%d/%d fragment shaders generated (it's normal that it's not all, there are invalid bit combos)\n", successes, count * numLanguages); + + successes = 0; + count = 200; + // Generate a bunch of random vertex shader IDs, try to generate shader source. // Then compile it and check that it's ok. for (int i = 0; i < count; i++) { @@ -189,7 +243,7 @@ bool TestShaderGenerators() { return false; } if (generateSuccess[0] && strcmp(buffer[0], buffer[1])) { - printf("mismatching shaders! a=glsl b=vulkan\n"); + printf("mismatching shaders!\n"); PrintDiff(buffer[0], buffer[1]); return false; } @@ -213,59 +267,6 @@ bool TestShaderGenerators() { successes = 0; count = 200; - // Generate a bunch of random fragment shader IDs, try to generate shader source. - // Then compile it and check that it's ok. - for (int i = 0; i < count; i++) { - uint32_t bottom = rng.R32(); - uint32_t top = rng.R32(); - FShaderID id; - id.d[0] = bottom; - id.d[1] = top; - - bool generateSuccess[numLanguages]{}; - std::string genErrorString[numLanguages]; - - for (int j = 0; j < numLanguages; j++) { - generateSuccess[j] = GenerateFShader(id, buffer[j], languages[j], &genErrorString[j]); - if (!genErrorString[j].empty()) { - printf("%s\n", genErrorString[j].c_str()); - } - // We ignore the contents of the error string here, not even gonna try to compile if it errors. - } - - /* - // KEEPING FOR REUSE LATER: Defunct temporary test: Compare GLSL-in-Vulkan-mode vs Vulkan - if (generateSuccess[0] != generateSuccess[1]) { - printf("mismatching success! %s %s\n", genErrorString[0].c_str(), genErrorString[1].c_str()); - printf("%s\n", buffer[0]); - printf("%s\n", buffer[1]); - return 1; - } - if (generateSuccess[0] && strcmp(buffer[0], buffer[1])) { - printf("mismatching shaders!\n"); - PrintDiff(buffer[0], buffer[1]); - return 1; - } - */ - - // Now that we have the strings ready for easy comparison (buffer,4 in the watch window), - // let's try to compile them. - for (int j = 0; j < numLanguages; j++) { - if (generateSuccess[j]) { - if (!TestCompileShader(buffer[j], languages[j], false)) { - printf("Error compiling fragment shader:\n\n%s\n\n", LineNumberString(buffer[j]).c_str()); - return false; - } - successes++; - } - } - } - - printf("%d/%d fragment shaders generated (it's normal that it's not all, there are invalid bit combos)\n", successes, count * numLanguages); - - successes = 0; - count = 200; - for (int i = 0; i < numLanguages; i++) { delete[] buffer[i]; } From d833b5985d92397e969d4cb1451179472c5f2768 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Wed, 28 Oct 2020 23:50:06 +0100 Subject: [PATCH 135/275] Make discard work the same way in the HLSL shader generator. --- GPU/Directx9/FragmentShaderGeneratorHLSL.cpp | 14 ++++++++------ GPU/GLES/FragmentShaderGeneratorGLES.cpp | 4 ++-- 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/GPU/Directx9/FragmentShaderGeneratorHLSL.cpp b/GPU/Directx9/FragmentShaderGeneratorHLSL.cpp index 0105bb6e71..7c015e40b3 100644 --- a/GPU/Directx9/FragmentShaderGeneratorHLSL.cpp +++ b/GPU/Directx9/FragmentShaderGeneratorHLSL.cpp @@ -57,6 +57,7 @@ bool GenerateFragmentShaderHLSL(const FShaderID &id, char *buffer, ShaderLanguag bool enableAlphaTest = id.Bit(FS_BIT_ALPHA_TEST); bool alphaTestAgainstZero = id.Bit(FS_BIT_ALPHA_AGAINST_ZERO); + bool testForceToZero = id.Bit(FS_BIT_TEST_DISCARD_TO_ZERO); bool enableColorTest = id.Bit(FS_BIT_COLOR_TEST); bool colorTestAgainstZero = id.Bit(FS_BIT_COLOR_AGAINST_ZERO); bool enableColorDoubling = id.Bit(FS_BIT_COLOR_DOUBLE); @@ -312,19 +313,20 @@ bool GenerateFragmentShaderHLSL(const FShaderID &id, char *buffer, ShaderLanguag WRITE(p, " v = lerp(vec4(u_fogcolor, v.a), v, fogCoef);\n"); } + const char *discardStatement = testForceToZero ? "v.a = 0.0;" : "DISCARD;"; if (enableAlphaTest) { if (alphaTestAgainstZero) { // When testing against 0 (extremely common), we can avoid some math. // 0.002 is approximately half of 1.0 / 255.0. if (alphaTestFunc == GE_COMP_NOTEQUAL || alphaTestFunc == GE_COMP_GREATER) { - WRITE(p, " clip(v.a - 0.002);\n"); + WRITE(p, " if (v.a < 0.002) %s\n", discardStatement); } else if (alphaTestFunc != GE_COMP_NEVER) { // Anything else is a test for == 0. Happens sometimes, actually... - WRITE(p, " clip(-v.a + 0.002);\n"); + WRITE(p, " if (v.a > 0.002) %s\n", discardStatement); } else { // NEVER has been logged as used by games, although it makes little sense - statically failing. // Maybe we could discard the drawcall, but it's pretty rare. Let's just statically discard here. - WRITE(p, " DISCARD;\n"); + WRITE(p, " %s\n", discardStatement); } } else { const char *alphaTestFuncs[] = { "#", "#", " != ", " == ", " >= ", " > ", " <= ", " < " }; // never/always don't make sense @@ -338,7 +340,7 @@ bool GenerateFragmentShaderHLSL(const FShaderID &id, char *buffer, ShaderLanguag } } else { // This means NEVER. See above. - WRITE(p, " DISCARD;\n"); + WRITE(p, " %s\n", discardStatement); } } } @@ -355,7 +357,7 @@ bool GenerateFragmentShaderHLSL(const FShaderID &id, char *buffer, ShaderLanguag } else { // NEVER has been logged as used by games, although it makes little sense - statically failing. // Maybe we could discard the drawcall, but it's pretty rare. Let's just statically discard here. - WRITE(p, " DISCARD;\n"); + WRITE(p, " %s\n", discardStatement); } } else { const char *colorTestFuncs[] = { "#", "#", " != ", " == " }; // never/always don't make sense @@ -374,7 +376,7 @@ bool GenerateFragmentShaderHLSL(const FShaderID &id, char *buffer, ShaderLanguag } } else { - WRITE(p, " DISCARD;\n"); + WRITE(p, " %s\n", discardStatement); } } } diff --git a/GPU/GLES/FragmentShaderGeneratorGLES.cpp b/GPU/GLES/FragmentShaderGeneratorGLES.cpp index a5a24e044b..8bb5ab979d 100644 --- a/GPU/GLES/FragmentShaderGeneratorGLES.cpp +++ b/GPU/GLES/FragmentShaderGeneratorGLES.cpp @@ -56,7 +56,7 @@ bool GenerateFragmentShaderGLSL(const FShaderID &id, char *buffer, const GLSLSha bool highpFog = false; bool highpTexcoord = false; - bool enableFragmentTestCache = g_Config.bFragmentTestCache && !compat.vulkan; + bool enableFragmentTestCache = g_Config.bFragmentTestCache && !compat.vulkan && !compat.d3d11; if (compat.gles) { // PowerVR needs highp to do the fog in MHU correctly. @@ -411,7 +411,7 @@ bool GenerateFragmentShaderGLSL(const FShaderID &id, char *buffer, const GLSLSha if (!shaderDepal) { if (compat.d3d11) { if (doTextureProjection) { - WRITE(p, " vec4 t = tex.Sample(samp, v_texcoord.xy / v_texcoord.z)%s;\n", bgraTexture ? ".bgra" : ""); + WRITE(p, " vec4 t = tex.Sample(samp, %sv_texcoord.xy / %sv_texcoord.z)%s;\n", compat.inPrefix, compat.inPrefix, bgraTexture ? ".bgra" : ""); } else { WRITE(p, " vec4 t = tex.Sample(samp, %s.xy)%s;\n", texcoord.c_str(), bgraTexture ? ".bgra" : ""); } From b4a76a9f093157c667282982ff78e27f9177103a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Thu, 29 Oct 2020 00:13:32 +0100 Subject: [PATCH 136/275] Change fragment shader output to work the same in GLSL and HLSL. --- GPU/Common/ShaderCommon.cpp | 2 ++ GPU/Directx9/FragmentShaderGeneratorHLSL.cpp | 25 +++++++++++++++----- GPU/GLES/FragmentShaderGeneratorGLES.cpp | 18 +++++++++----- 3 files changed, 33 insertions(+), 12 deletions(-) diff --git a/GPU/Common/ShaderCommon.cpp b/GPU/Common/ShaderCommon.cpp index 797f96a361..820b87a23d 100644 --- a/GPU/Common/ShaderCommon.cpp +++ b/GPU/Common/ShaderCommon.cpp @@ -116,6 +116,7 @@ void GLSLShaderCompat::SetupForVulkan() { lastFragData = nullptr; texture = "texture"; texelFetch = "texelFetch"; + d3d11 = false; vulkan = true; forceMatrix4x4 = false; coefsFromBuffers = true; @@ -137,6 +138,7 @@ void GLSLShaderCompat::SetupForD3D11() { lastFragData = nullptr; texture = "texture"; texelFetch = "texelFetch"; + vulkan = false; d3d11 = true; forceMatrix4x4 = false; coefsFromBuffers = true; diff --git a/GPU/Directx9/FragmentShaderGeneratorHLSL.cpp b/GPU/Directx9/FragmentShaderGeneratorHLSL.cpp index 7c015e40b3..477cf63b8c 100644 --- a/GPU/Directx9/FragmentShaderGeneratorHLSL.cpp +++ b/GPU/Directx9/FragmentShaderGeneratorHLSL.cpp @@ -33,9 +33,10 @@ const char *hlsl_preamble = "#define vec2 float2\n" "#define vec3 float3\n" "#define vec4 float4\n" -"#define uvec3 uint\n" +"#define uvec3 uint3\n" "#define ivec3 int3\n" -"#define splat3(x) float3(x, x, x)\n"; +"#define splat3(x) float3(x, x, x)\n" +"#define usplat3(x) uvec3(x, x, x)\n"; const char *hlsl_d3d11_preamble = "#define DISCARD discard\n" @@ -153,7 +154,7 @@ bool GenerateFragmentShaderHLSL(const FShaderID &id, char *buffer, ShaderLanguag } if (enableColorTest) { if (lang == HLSL_D3D11) { - WRITE(p, "uint3 roundAndScaleTo255iv(float3 x) { return uint3(floor(x * 255.0f + 0.5f)); }\n"); + WRITE(p, "uvec3 roundAndScaleTo255iv(float3 x) { return uvec3(floor(x * 255.0f + 0.5f)); }\n"); } else { WRITE(p, "vec3 roundAndScaleTo255v(float3 x) { return floor(x * 255.0f + 0.5f); }\n"); } @@ -364,9 +365,9 @@ bool GenerateFragmentShaderHLSL(const FShaderID &id, char *buffer, ShaderLanguag if (colorTestFuncs[colorTestFunc][0] != '#') { const char *test = colorTestFuncs[colorTestFunc]; if (lang == HLSL_D3D11) { - WRITE(p, " uint3 v_scaled = roundAndScaleTo255iv(v.rgb);\n"); - WRITE(p, " uint3 v_masked = v_scaled & u_alphacolormask.rgb;\n"); - WRITE(p, " uint3 colorTestRef = u_alphacolorref.rgb & u_alphacolormask.rgb;\n"); + WRITE(p, " ivec3 v_scaled = roundAndScaleTo255iv(v.rgb);\n"); + WRITE(p, " ivec3 v_masked = v_scaled & u_alphacolormask.rgb;\n"); + WRITE(p, " ivec3 colorTestRef = u_alphacolorref.rgb & u_alphacolormask.rgb;\n"); // We have to test the components separately, or we get incorrect results. See #10629. WRITE(p, " if (v_masked.r %s colorTestRef.r && v_masked.g %s colorTestRef.g && v_masked.b %s colorTestRef.b) DISCARD;\n", test, test, test); } else { @@ -518,6 +519,10 @@ bool GenerateFragmentShaderHLSL(const FShaderID &id, char *buffer, ShaderLanguag } switch (stencilToAlpha) { + case REPLACE_ALPHA_DUALSOURCE: + // Handled at the end. + break; + case REPLACE_ALPHA_YES: WRITE(p, " v.a = %s;\n", replacedAlpha.c_str()); break; @@ -525,6 +530,10 @@ bool GenerateFragmentShaderHLSL(const FShaderID &id, char *buffer, ShaderLanguag case REPLACE_ALPHA_NO: // Do nothing, v is already fine. break; + + default: + *errorString = "Bad stencil-to-alpha type, corrupt ID?"; + return false; } LogicOpReplaceType replaceLogicOpType = (LogicOpReplaceType)id.Bits(FS_BIT_REPLACE_LOGIC_OP_TYPE, 2); @@ -537,6 +546,10 @@ bool GenerateFragmentShaderHLSL(const FShaderID &id, char *buffer, ShaderLanguag break; case LOGICOPTYPE_NORMAL: break; + + default: + *errorString = "Bad logic op type, corrupt ID?"; + return false; } if (gstate_c.Supports(GPU_ROUND_FRAGMENT_DEPTH_TO_16BIT)) { diff --git a/GPU/GLES/FragmentShaderGeneratorGLES.cpp b/GPU/GLES/FragmentShaderGeneratorGLES.cpp index 8bb5ab979d..e286ab866f 100644 --- a/GPU/GLES/FragmentShaderGeneratorGLES.cpp +++ b/GPU/GLES/FragmentShaderGeneratorGLES.cpp @@ -833,16 +833,15 @@ bool GenerateFragmentShaderGLSL(const FShaderID &id, char *buffer, const GLSLSha switch (stencilToAlpha) { case REPLACE_ALPHA_DUALSOURCE: - WRITE(p, " %s = vec4(v.rgb, %s);\n", compat.fragColor0, replacedAlpha.c_str()); - WRITE(p, " %s = vec4(0.0, 0.0, 0.0, v.a);\n", compat.fragColor1); + // Handled at the end. break; case REPLACE_ALPHA_YES: - WRITE(p, " %s = vec4(v.rgb, %s);\n", compat.fragColor0, replacedAlpha.c_str()); + WRITE(p, " v.a = %s;\n", replacedAlpha.c_str()); break; case REPLACE_ALPHA_NO: - WRITE(p, " %s = v;\n", compat.fragColor0); + // Nothing to do. break; default: @@ -853,10 +852,10 @@ bool GenerateFragmentShaderGLSL(const FShaderID &id, char *buffer, const GLSLSha LogicOpReplaceType replaceLogicOpType = (LogicOpReplaceType)id.Bits(FS_BIT_REPLACE_LOGIC_OP_TYPE, 2); switch (replaceLogicOpType) { case LOGICOPTYPE_ONE: - WRITE(p, " %s.rgb = vec3(1.0, 1.0, 1.0);\n", compat.fragColor0); + WRITE(p, " v.rgb = splat3(1.0);\n"); break; case LOGICOPTYPE_INVERT: - WRITE(p, " %s.rgb = vec3(1.0, 1.0, 1.0) - %s.rgb;\n", compat.fragColor0, compat.fragColor0); + WRITE(p, " v.rgb = splat3(1.0) - v.rgb;\n"); break; case LOGICOPTYPE_NORMAL: break; @@ -888,6 +887,13 @@ bool GenerateFragmentShaderGLSL(const FShaderID &id, char *buffer, const GLSLSha WRITE(p, " gl_FragDepth = gl_FragCoord.z;\n"); } + if (stencilToAlpha == REPLACE_ALPHA_DUALSOURCE) { + WRITE(p, " %s = vec4(v.rgb, %s);\n", compat.fragColor0, replacedAlpha.c_str()); + WRITE(p, " %s = vec4(0.0, 0.0, 0.0, v.a);\n", compat.fragColor1); + } else { + WRITE(p, " %s = v;\n", compat.fragColor0); + } + if (compat.d3d11) { WRITE(p, " return outfragment;\n"); } From b070ed45e953ff5789f8a4a544e7e93a0c107572 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Thu, 29 Oct 2020 00:38:52 +0100 Subject: [PATCH 137/275] Evolve the HLSL and GLSL fragment shader generators even closer together. --- Common/GPU/Vulkan/VulkanContext.cpp | 5 ++ GPU/Directx9/FragmentShaderGeneratorHLSL.cpp | 39 ++++++++-------- GPU/GLES/FragmentShaderGeneratorGLES.cpp | 48 ++++++++++++-------- unittest/TestShaderGenerators.cpp | 1 + 4 files changed, 56 insertions(+), 37 deletions(-) diff --git a/Common/GPU/Vulkan/VulkanContext.cpp b/Common/GPU/Vulkan/VulkanContext.cpp index 10a98517ad..4c715d289f 100644 --- a/Common/GPU/Vulkan/VulkanContext.cpp +++ b/Common/GPU/Vulkan/VulkanContext.cpp @@ -923,6 +923,11 @@ static std::string surface_transforms_to_string(VkSurfaceTransformFlagsKHR trans bool VulkanContext::InitSwapchain() { VkResult res = vkGetPhysicalDeviceSurfaceCapabilitiesKHR(physical_devices_[physical_device_], surface_, &surfCapabilities_); + if (res == VK_ERROR_SURFACE_LOST_KHR) { + // Not much to do. + ERROR_LOG(G3D, "VK: Surface lost in InitSwapchain"); + return false; + } _dbg_assert_(res == VK_SUCCESS); uint32_t presentModeCount; res = vkGetPhysicalDeviceSurfacePresentModesKHR(physical_devices_[physical_device_], surface_, &presentModeCount, nullptr); diff --git a/GPU/Directx9/FragmentShaderGeneratorHLSL.cpp b/GPU/Directx9/FragmentShaderGeneratorHLSL.cpp index 477cf63b8c..bca9438265 100644 --- a/GPU/Directx9/FragmentShaderGeneratorHLSL.cpp +++ b/GPU/Directx9/FragmentShaderGeneratorHLSL.cpp @@ -36,7 +36,8 @@ const char *hlsl_preamble = "#define uvec3 uint3\n" "#define ivec3 int3\n" "#define splat3(x) float3(x, x, x)\n" -"#define usplat3(x) uvec3(x, x, x)\n"; +"#define mix lerp\n" +"#define mod(x, y) fmod(x, y)\n"; const char *hlsl_d3d11_preamble = "#define DISCARD discard\n" @@ -228,12 +229,12 @@ bool GenerateFragmentShaderHLSL(const FShaderID &id, char *buffer, ShaderLanguag if (id.Bit(FS_BIT_CLAMP_S)) { ucoord = "clamp(" + ucoord + ", u_texclamp.z, u_texclamp.x - u_texclamp.z)"; } else { - ucoord = "fmod(" + ucoord + ", u_texclamp.x)"; + ucoord = "mod(" + ucoord + ", u_texclamp.x)"; } if (id.Bit(FS_BIT_CLAMP_T)) { vcoord = "clamp(" + vcoord + ", u_texclamp.w, u_texclamp.y - u_texclamp.w)"; } else { - vcoord = "fmod(" + vcoord + ", u_texclamp.y)"; + vcoord = "mod(" + vcoord + ", u_texclamp.y)"; } if (textureAtOffset) { ucoord = "(" + ucoord + " + u_texclampoff.x)"; @@ -259,16 +260,18 @@ bool GenerateFragmentShaderHLSL(const FShaderID &id, char *buffer, ShaderLanguag WRITE(p, " vec4 t = tex2D(tex, %s.xy)%s;\n", texcoord, bgraTexture ? ".bgra" : ""); } } - WRITE(p, " vec4 p = In.v_color0;\n"); + if (texFunc != GE_TEXFUNC_REPLACE || !doTextureAlpha) { + WRITE(p, " vec4 p = In.v_color0;\n"); + } if (doTextureAlpha) { // texfmt == RGBA switch (texFunc) { case GE_TEXFUNC_MODULATE: WRITE(p, " vec4 v = p * t%s;\n", secondary); break; case GE_TEXFUNC_DECAL: - WRITE(p, " vec4 v = vec4(lerp(p.rgb, t.rgb, t.a), p.a)%s;\n", secondary); break; + WRITE(p, " vec4 v = vec4(mix(p.rgb, t.rgb, t.a), p.a)%s;\n", secondary); break; case GE_TEXFUNC_BLEND: - WRITE(p, " vec4 v = vec4(lerp(p.rgb, u_texenv.rgb, t.rgb), p.a * t.a)%s;\n", secondary); break; + WRITE(p, " vec4 v = vec4(mix(p.rgb, u_texenv.rgb, t.rgb), p.a * t.a)%s;\n", secondary); break; case GE_TEXFUNC_REPLACE: WRITE(p, " vec4 v = t%s;\n", secondary); break; case GE_TEXFUNC_ADD: @@ -287,7 +290,7 @@ bool GenerateFragmentShaderHLSL(const FShaderID &id, char *buffer, ShaderLanguag case GE_TEXFUNC_DECAL: WRITE(p, " vec4 v = vec4(t.rgb, p.a)%s;\n", secondary); break; case GE_TEXFUNC_BLEND: - WRITE(p, " vec4 v = vec4(lerp(p.rgb, u_texenv.rgb, t.rgb), p.a)%s;\n", secondary); break; + WRITE(p, " vec4 v = vec4(mix(p.rgb, u_texenv.rgb, t.rgb), p.a)%s;\n", secondary); break; case GE_TEXFUNC_REPLACE: WRITE(p, " vec4 v = vec4(t.rgb, p.a)%s;\n", secondary); break; case GE_TEXFUNC_ADD: @@ -311,7 +314,7 @@ bool GenerateFragmentShaderHLSL(const FShaderID &id, char *buffer, ShaderLanguag if (enableFog) { WRITE(p, " float fogCoef = clamp(In.v_fogdepth, 0.0, 1.0);\n"); - WRITE(p, " v = lerp(vec4(u_fogcolor, v.a), v, fogCoef);\n"); + WRITE(p, " v = mix(vec4(u_fogcolor, v.a), v, fogCoef);\n"); } const char *discardStatement = testForceToZero ? "v.a = 0.0;" : "DISCARD;"; @@ -334,10 +337,10 @@ bool GenerateFragmentShaderHLSL(const FShaderID &id, char *buffer, ShaderLanguag if (alphaTestFuncs[alphaTestFunc][0] != '#') { // TODO: Rewrite this to use clip() appropriately (like, clip(v.a - u_alphacolorref.a)) if (lang == HLSL_D3D11) { - WRITE(p, " if ((roundAndScaleTo255i(v.a) & u_alphacolormask.a) %s u_alphacolorref.a) discard;\n", alphaTestFuncs[alphaTestFunc]); + WRITE(p, " if ((roundAndScaleTo255i(v.a) & u_alphacolormask.a) %s int(u_alphacolorref.a)) %s\n", alphaTestFuncs[alphaTestFunc], discardStatement); } else { // TODO: Use a texture to lookup bitwise ops? - WRITE(p, " if (roundAndScaleTo255f(v.a) %s u_alphacolorref.a) DISCARD;\n", alphaTestFuncs[alphaTestFunc]); + WRITE(p, " if (roundAndScaleTo255f(v.a) %s u_alphacolorref.a) %s\n", alphaTestFuncs[alphaTestFunc], discardStatement); } } else { // This means NEVER. See above. @@ -351,10 +354,10 @@ bool GenerateFragmentShaderHLSL(const FShaderID &id, char *buffer, ShaderLanguag // When testing against 0 (common), we can avoid some math. // 0.002 is approximately half of 1.0 / 255.0. if (colorTestFunc == GE_COMP_NOTEQUAL) { - WRITE(p, " if (v.r < 0.002 && v.g < 0.002 && v.b < 0.002) DISCARD;\n"); + WRITE(p, " if (v.r < 0.002 && v.g < 0.002 && v.b < 0.002) %s\n", discardStatement); } else if (colorTestFunc != GE_COMP_NEVER) { // Anything else is a test for == 0. - WRITE(p, " if (v.r > 0.002 || v.g > 0.002 || v.b > 0.002) DISCARD;\n"); + WRITE(p, " if (v.r > 0.002 || v.g > 0.002 || v.b > 0.002) %s\n", discardStatement); } else { // NEVER has been logged as used by games, although it makes little sense - statically failing. // Maybe we could discard the drawcall, but it's pretty rare. Let's just statically discard here. @@ -365,15 +368,15 @@ bool GenerateFragmentShaderHLSL(const FShaderID &id, char *buffer, ShaderLanguag if (colorTestFuncs[colorTestFunc][0] != '#') { const char *test = colorTestFuncs[colorTestFunc]; if (lang == HLSL_D3D11) { - WRITE(p, " ivec3 v_scaled = roundAndScaleTo255iv(v.rgb);\n"); - WRITE(p, " ivec3 v_masked = v_scaled & u_alphacolormask.rgb;\n"); - WRITE(p, " ivec3 colorTestRef = u_alphacolorref.rgb & u_alphacolormask.rgb;\n"); + WRITE(p, " uvec3 v_scaled = roundAndScaleTo255iv(v.rgb);\n"); + WRITE(p, " uvec3 v_masked = v_scaled & u_alphacolormask.rgb;\n"); + WRITE(p, " uvec3 colorTestRef = u_alphacolorref.rgb & u_alphacolormask.rgb;\n"); // We have to test the components separately, or we get incorrect results. See #10629. - WRITE(p, " if (v_masked.r %s colorTestRef.r && v_masked.g %s colorTestRef.g && v_masked.b %s colorTestRef.b) DISCARD;\n", test, test, test); + WRITE(p, " if (v_masked.r %s colorTestRef.r && v_masked.g %s colorTestRef.g && v_masked.b %s colorTestRef.b) %s\n", test, test, test, discardStatement); } else { // TODO: Use a texture to lookup bitwise ops instead? WRITE(p, " vec3 colortest = roundAndScaleTo255v(v.rgb);\n"); - WRITE(p, " if ((colortest.r %s u_alphacolorref.r) && (colortest.g %s u_alphacolorref.g) && (colortest.b %s u_alphacolorref.b)) DISCARD;\n", test, test, test); + WRITE(p, " if ((colortest.r %s u_alphacolorref.r) && (colortest.g %s u_alphacolorref.g) && (colortest.b %s u_alphacolorref.b)) %s\n", test, test, test, discardStatement); } } else { @@ -422,7 +425,7 @@ bool GenerateFragmentShaderHLSL(const FShaderID &id, char *buffer, ShaderLanguag case GE_SRCBLEND_DSTCOLOR: srcFactor = "destColor.rgb"; break; case GE_SRCBLEND_INVDSTCOLOR: srcFactor = "(splat3(1.0) - destColor.rgb)"; break; case GE_SRCBLEND_SRCALPHA: srcFactor = "v.aaa"; break; - case GE_SRCBLEND_INVSRCALPHA: srcFactor = "splat3(1.0) - v.aaa"; break; + case GE_SRCBLEND_INVSRCALPHA: srcFactor = "splat3(1.0 - v.a)"; break; case GE_SRCBLEND_DSTALPHA: srcFactor = "destColor.aaa"; break; case GE_SRCBLEND_INVDSTALPHA: srcFactor = "splat3(1.0) - destColor.aaa"; break; case GE_SRCBLEND_DOUBLESRCALPHA: srcFactor = "v.aaa * 2.0"; break; diff --git a/GPU/GLES/FragmentShaderGeneratorGLES.cpp b/GPU/GLES/FragmentShaderGeneratorGLES.cpp index e286ab866f..4d97c3b855 100644 --- a/GPU/GLES/FragmentShaderGeneratorGLES.cpp +++ b/GPU/GLES/FragmentShaderGeneratorGLES.cpp @@ -667,7 +667,15 @@ bool GenerateFragmentShaderGLSL(const FShaderID &id, char *buffer, const GLSLSha } else { const char *colorTestFuncs[] = { "#", "#", " != ", " == " }; if (colorTestFuncs[colorTestFunc][0] != '#') { - if (compat.bitwiseOps) { + // TODO: Unify these paths better. + if (compat.d3d11) { + const char *test = colorTestFuncs[colorTestFunc]; + WRITE(p, " uvec3 v_scaled = roundAndScaleTo255iv(v.rgb);\n"); + WRITE(p, " uvec3 v_masked = v_scaled & u_alphacolormask.rgb;\n"); + WRITE(p, " uvec3 colorTestRef = u_alphacolorref.rgb & u_alphacolormask.rgb;\n"); + // We have to test the components separately, or we get incorrect results. See #10629. + WRITE(p, " if (v_masked.r %s colorTestRef.r && v_masked.g %s colorTestRef.g && v_masked.b %s colorTestRef.b) %s\n", test, test, test, discardStatement); + } else if (compat.bitwiseOps) { // Apparently GLES3 does not support vector bitwise ops. WRITE(p, " ivec3 v_scaled = roundAndScaleTo255iv(v.rgb);\n"); if (compat.vulkan) { @@ -723,7 +731,9 @@ bool GenerateFragmentShaderGLSL(const FShaderID &id, char *buffer, const GLSLSha if (replaceBlend == REPLACE_BLEND_COPY_FBO) { // If we have NV_shader_framebuffer_fetch / EXT_shader_framebuffer_fetch, we skip the blit. // We can just read the prev value more directly. - if (gstate_c.Supports(GPU_SUPPORTS_ANY_FRAMEBUFFER_FETCH)) { + if (compat.d3d11) { + WRITE(p, " vec4 destColor = fboTex.Load(int3((int)In.pixelPos.x, (int)In.pixelPos.y, 0));\n"); + } else if (gstate_c.Supports(GPU_SUPPORTS_ANY_FRAMEBUFFER_FETCH)) { WRITE(p, " lowp vec4 destColor = %s;\n", compat.lastFragData); } else if (!compat.texelFetch) { WRITE(p, " lowp vec4 destColor = %s(fbotex, gl_FragCoord.xy * u_fbotexSize.xy);\n", compat.texture); @@ -731,34 +741,34 @@ bool GenerateFragmentShaderGLSL(const FShaderID &id, char *buffer, const GLSLSha WRITE(p, " lowp vec4 destColor = %s(fbotex, ivec2(gl_FragCoord.x, gl_FragCoord.y), 0);\n", compat.texelFetch); } - const char *srcFactor = "splat3(1.0)"; - const char *dstFactor = "splat3(0.0)"; + const char *srcFactor = nullptr; + const char *dstFactor = nullptr; switch (replaceBlendFuncA) { case GE_SRCBLEND_DSTCOLOR: srcFactor = "destColor.rgb"; break; case GE_SRCBLEND_INVDSTCOLOR: srcFactor = "(splat3(1.0) - destColor.rgb)"; break; - case GE_SRCBLEND_SRCALPHA: srcFactor = "splat3(v.a)"; break; + case GE_SRCBLEND_SRCALPHA: srcFactor = "v.aaa"; break; case GE_SRCBLEND_INVSRCALPHA: srcFactor = "splat3(1.0 - v.a)"; break; - case GE_SRCBLEND_DSTALPHA: srcFactor = "splat3(destColor.a)"; break; - case GE_SRCBLEND_INVDSTALPHA: srcFactor = "splat3(1.0 - destColor.a)"; break; - case GE_SRCBLEND_DOUBLESRCALPHA: srcFactor = "splat3(v.a * 2.0)"; break; - case GE_SRCBLEND_DOUBLEINVSRCALPHA: srcFactor = "splat3(1.0 - v.a * 2.0)"; break; - case GE_SRCBLEND_DOUBLEDSTALPHA: srcFactor = "splat3(destColor.a * 2.0)"; break; - case GE_SRCBLEND_DOUBLEINVDSTALPHA: srcFactor = "splat3(1.0 - destColor.a * 2.0)"; break; + case GE_SRCBLEND_DSTALPHA: srcFactor = "destColor.aaa"; break; + case GE_SRCBLEND_INVDSTALPHA: srcFactor = "splat3(1.0) - destColor.aaa"; break; + case GE_SRCBLEND_DOUBLESRCALPHA: srcFactor = "v.aaa * 2.0"; break; + case GE_SRCBLEND_DOUBLEINVSRCALPHA: srcFactor = "splat3(1.0) - v.aaa * 2.0"; break; + case GE_SRCBLEND_DOUBLEDSTALPHA: srcFactor = "destColor.aaa * 2.0"; break; + case GE_SRCBLEND_DOUBLEINVDSTALPHA: srcFactor = "splat3(1.0) - destColor.aaa * 2.0"; break; case GE_SRCBLEND_FIXA: srcFactor = "u_blendFixA"; break; default: srcFactor = "u_blendFixA"; break; } switch (replaceBlendFuncB) { case GE_DSTBLEND_SRCCOLOR: dstFactor = "v.rgb"; break; case GE_DSTBLEND_INVSRCCOLOR: dstFactor = "(splat3(1.0) - v.rgb)"; break; - case GE_DSTBLEND_SRCALPHA: dstFactor = "splat3(v.a)"; break; - case GE_DSTBLEND_INVSRCALPHA: dstFactor = "splat3(1.0 - v.a)"; break; - case GE_DSTBLEND_DSTALPHA: dstFactor = "splat3(destColor.a)"; break; - case GE_DSTBLEND_INVDSTALPHA: dstFactor = "splat3(1.0 - destColor.a)"; break; - case GE_DSTBLEND_DOUBLESRCALPHA: dstFactor = "splat3(v.a * 2.0)"; break; - case GE_DSTBLEND_DOUBLEINVSRCALPHA: dstFactor = "splat3(1.0 - v.a * 2.0)"; break; - case GE_DSTBLEND_DOUBLEDSTALPHA: dstFactor = "splat3(destColor.a * 2.0)"; break; - case GE_DSTBLEND_DOUBLEINVDSTALPHA: dstFactor = "splat3(1.0 - destColor.a * 2.0)"; break; + case GE_DSTBLEND_SRCALPHA: dstFactor = "v.aaa"; break; + case GE_DSTBLEND_INVSRCALPHA: dstFactor = "splat3(1.0) - v.aaa"; break; + case GE_DSTBLEND_DSTALPHA: dstFactor = "destColor.aaa"; break; + case GE_DSTBLEND_INVDSTALPHA: dstFactor = "splat3(1.0) - destColor.aaa"; break; + case GE_DSTBLEND_DOUBLESRCALPHA: dstFactor = "v.aaa * 2.0"; break; + case GE_DSTBLEND_DOUBLEINVSRCALPHA: dstFactor = "splat3(1.0) - v.aaa * 2.0"; break; + case GE_DSTBLEND_DOUBLEDSTALPHA: dstFactor = "destColor.aaa * 2.0"; break; + case GE_DSTBLEND_DOUBLEINVDSTALPHA: dstFactor = "splat3(1.0) - destColor.aaa * 2.0"; break; case GE_DSTBLEND_FIXB: dstFactor = "u_blendFixB"; break; default: dstFactor = "u_blendFixB"; break; } diff --git a/unittest/TestShaderGenerators.cpp b/unittest/TestShaderGenerators.cpp index fdbb04b3ea..c4eb0cae2f 100644 --- a/unittest/TestShaderGenerators.cpp +++ b/unittest/TestShaderGenerators.cpp @@ -173,6 +173,7 @@ bool TestShaderGenerators() { // bits we don't need to test because they are irrelevant on d3d11 id.SetBit(FS_BIT_NO_DEPTH_CANNOT_DISCARD_STENCIL, false); + id.SetBit(FS_BIT_SHADER_DEPAL, false); bool generateSuccess[numLanguages]{}; std::string genErrorString[numLanguages]; From af4d6e76424d8c0485c8125b55d29b6afdecd3e5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Fri, 30 Oct 2020 10:22:40 +0100 Subject: [PATCH 138/275] Set up the test for D3D9, start fixing stuff. --- Common/GPU/D3D9/D3D9ShaderCompiler.cpp | 89 +++++++------------- Common/GPU/D3D9/D3D9ShaderCompiler.h | 9 +- Common/GPU/OpenGL/GLQueueRunner.cpp | 2 +- GPU/Common/DepalettizeShaderCommon.cpp | 6 +- GPU/Common/PresentationCommon.cpp | 4 +- GPU/Common/ShaderCommon.cpp | 81 +++++++++--------- GPU/Common/ShaderCommon.h | 18 ++-- GPU/Common/ShaderTranslation.cpp | 10 +-- GPU/Directx9/DepalettizeShaderDX9.cpp | 8 +- GPU/Directx9/DepalettizeShaderDX9.h | 4 +- GPU/Directx9/FragmentShaderGeneratorHLSL.cpp | 35 ++------ GPU/Directx9/FramebufferManagerDX9.cpp | 6 +- GPU/Directx9/ShaderManagerDX9.cpp | 10 +-- GPU/Directx9/StencilBufferDX9.cpp | 4 +- GPU/Directx9/VertexShaderGeneratorHLSL.cpp | 4 +- GPU/GLES/FragmentShaderGeneratorGLES.cpp | 78 ++++++++++------- GPU/GLES/ShaderManagerGLES.cpp | 6 ++ GPU/GLES/VertexShaderGeneratorGLES.cpp | 25 +++--- GPU/Vulkan/ShaderManagerVulkan.cpp | 8 +- unittest/TestShaderGenerators.cpp | 69 ++++++++++----- 20 files changed, 236 insertions(+), 240 deletions(-) diff --git a/Common/GPU/D3D9/D3D9ShaderCompiler.cpp b/Common/GPU/D3D9/D3D9ShaderCompiler.cpp index b54bb215c1..8240dc7587 100644 --- a/Common/GPU/D3D9/D3D9ShaderCompiler.cpp +++ b/Common/GPU/D3D9/D3D9ShaderCompiler.cpp @@ -1,7 +1,7 @@ -#ifdef _WIN32 - #include "ppsspp_config.h" +#ifdef _WIN32 + #include "Common/CommonWindows.h" #include "Common/GPU/D3D9/D3DCompilerLoader.h" #include "Common/GPU/D3D9/D3D9ShaderCompiler.h" @@ -10,9 +10,7 @@ struct ID3DXConstantTable; -namespace DX9 { - -bool CompilePixelShader(LPDIRECT3DDEVICE9 device, const char *code, LPDIRECT3DPIXELSHADER9 *pShader, ID3DXConstantTable **pShaderTable, std::string &errorMessage) { +LPD3DBLOB CompileShaderToByteCodeD3D9(const char *code, const char *target, std::string *errorMessage) { LPD3DBLOB pShaderCode = nullptr; LPD3DBLOB pErrorMsg = nullptr; @@ -23,77 +21,50 @@ bool CompilePixelShader(LPDIRECT3DDEVICE9 device, const char *code, LPDIRECT3DPI nullptr, nullptr, "main", - "ps_2_0", + target, 0, 0, &pShaderCode, &pErrorMsg); if (pErrorMsg) { - errorMessage = (CHAR *)pErrorMsg->GetBufferPointer(); + *errorMessage = (CHAR *)pErrorMsg->GetBufferPointer(); pErrorMsg->Release(); } else if (FAILED(hr)) { - errorMessage = GetStringErrorMsg(hr); - } else { - errorMessage = ""; - } - - if (FAILED(hr) || !pShaderCode) { - if (pShaderCode) + *errorMessage = GetStringErrorMsg(hr); + if (pShaderCode) { pShaderCode->Release(); - return false; + pShaderCode = nullptr; + } + } else { + *errorMessage = ""; } - // Create pixel shader. - device->CreatePixelShader( (DWORD*)pShaderCode->GetBufferPointer(), - pShader ); - - pShaderCode->Release(); - - return true; + return pShaderCode; } -bool CompileVertexShader(LPDIRECT3DDEVICE9 device, const char *code, LPDIRECT3DVERTEXSHADER9 *pShader, ID3DXConstantTable **pShaderTable, std::string &errorMessage) { - LPD3DBLOB pShaderCode = nullptr; - LPD3DBLOB pErrorMsg = nullptr; - - // Compile pixel shader. - HRESULT hr = dyn_D3DCompile(code, - (UINT)strlen(code), - nullptr, - nullptr, - nullptr, - "main", - "vs_2_0", - 0, - 0, - &pShaderCode, - &pErrorMsg); - - if (pErrorMsg) { - errorMessage = (CHAR *)pErrorMsg->GetBufferPointer(); - pErrorMsg->Release(); - } else if (FAILED(hr)) { - errorMessage = GetStringErrorMsg(hr); +bool CompilePixelShaderD3D9(LPDIRECT3DDEVICE9 device, const char *code, LPDIRECT3DPIXELSHADER9 *pShader, std::string *errorMessage) { + LPD3DBLOB pShaderCode = CompileShaderToByteCodeD3D9(code, "ps_2_0", errorMessage); + if (pShaderCode) { + // Create pixel shader. + device->CreatePixelShader((DWORD*)pShaderCode->GetBufferPointer(), pShader); + pShaderCode->Release(); + return true; } else { - errorMessage = ""; - } - - if (FAILED(hr) || !pShaderCode) { - if (pShaderCode) - pShaderCode->Release(); return false; } - - // Create pixel shader. - device->CreateVertexShader( (DWORD*)pShaderCode->GetBufferPointer(), - pShader ); - - pShaderCode->Release(); - - return true; } -} // namespace +bool CompileVertexShaderD3D9(LPDIRECT3DDEVICE9 device, const char *code, LPDIRECT3DVERTEXSHADER9 *pShader, std::string *errorMessage) { + LPD3DBLOB pShaderCode = CompileShaderToByteCodeD3D9(code, "vs_2_0", errorMessage); + if (pShaderCode) { + // Create vertex shader. + device->CreateVertexShader((DWORD*)pShaderCode->GetBufferPointer(), pShader); + pShaderCode->Release(); + return true; + } else { + return false; + } +} #endif diff --git a/Common/GPU/D3D9/D3D9ShaderCompiler.h b/Common/GPU/D3D9/D3D9ShaderCompiler.h index 6c4aaf75a2..1de2a158d0 100644 --- a/Common/GPU/D3D9/D3D9ShaderCompiler.h +++ b/Common/GPU/D3D9/D3D9ShaderCompiler.h @@ -1,6 +1,7 @@ #pragma once #include "Common/CommonWindows.h" +#include "Common/GPU/D3D9/D3DCompilerLoader.h" #include #include @@ -8,9 +9,7 @@ struct ID3DXConstantTable; -namespace DX9 { +LPD3DBLOB CompileShaderToByteCodeD3D9(const char *code, const char *target, std::string *errorMessage); -bool CompilePixelShader(LPDIRECT3DDEVICE9 device, const char *code, LPDIRECT3DPIXELSHADER9 *pShader, ID3DXConstantTable **pShaderTable, std::string &errorMessage); -bool CompileVertexShader(LPDIRECT3DDEVICE9 device, const char *code, LPDIRECT3DVERTEXSHADER9 *pShader, ID3DXConstantTable **pShaderTable, std::string &errorMessage); - -} // namespace DX9 +bool CompilePixelShaderD3D9(LPDIRECT3DDEVICE9 device, const char *code, LPDIRECT3DPIXELSHADER9 *pShader, std::string *errorMessage); +bool CompileVertexShaderD3D9(LPDIRECT3DDEVICE9 device, const char *code, LPDIRECT3DVERTEXSHADER9 *pShader, std::string *errorMessage); diff --git a/Common/GPU/OpenGL/GLQueueRunner.cpp b/Common/GPU/OpenGL/GLQueueRunner.cpp index 1d5c024379..c01eb0ed70 100644 --- a/Common/GPU/OpenGL/GLQueueRunner.cpp +++ b/Common/GPU/OpenGL/GLQueueRunner.cpp @@ -279,7 +279,7 @@ void GLQueueRunner::RunInitSteps(const std::vector &steps, bool ski glGetShaderiv(shader, GL_COMPILE_STATUS, &success); if (!success) { std::string infoLog = GetInfoLog(shader, glGetShaderiv, glGetShaderInfoLog); -#ifdef __ANDROID__ +#if PPSSPP_PLATFORM(ANDROID) ERROR_LOG(G3D, "Error in shader compilation! %s\n", infoLog.c_str()); ERROR_LOG(G3D, "Shader source:\n%s\n", (const char *)code); #endif diff --git a/GPU/Common/DepalettizeShaderCommon.cpp b/GPU/Common/DepalettizeShaderCommon.cpp index 5a0c7c6e4a..516c3b9fde 100644 --- a/GPU/Common/DepalettizeShaderCommon.cpp +++ b/GPU/Common/DepalettizeShaderCommon.cpp @@ -164,7 +164,7 @@ void GenerateDepalShader300(char *buffer, GEBufferFormat pixelFormat, ShaderLang void GenerateDepalShaderFloat(char *buffer, GEBufferFormat pixelFormat, ShaderLanguage lang) { char *p = buffer; - const char *modFunc = lang == HLSL_DX9 ? "fmod" : "mod"; + const char *modFunc = lang == HLSL_D3D9 ? "fmod" : "mod"; char lookupMethod[128] = "index.r"; char offset[128] = ""; @@ -305,7 +305,7 @@ void GenerateDepalShaderFloat(char *buffer, GEBufferFormat pixelFormat, ShaderLa WRITE(p, " float coord = (%s * %f)%s;\n", lookupMethod, index_multiplier, offset); WRITE(p, " gl_FragColor = texture2D(pal, vec2(coord, 0.0));\n"); WRITE(p, "}\n"); - } else if (lang == HLSL_DX9) { + } else if (lang == HLSL_D3D9) { WRITE(p, "sampler tex: register(s0);\n"); WRITE(p, "sampler pal: register(s1);\n"); WRITE(p, "float4 main(float2 v_texcoord0 : TEXCOORD0) : COLOR0 {\n"); @@ -326,7 +326,7 @@ void GenerateDepalShader(char *buffer, GEBufferFormat pixelFormat, ShaderLanguag case HLSL_D3D11: GenerateDepalShader300(buffer, pixelFormat, language); break; - case HLSL_DX9: + case HLSL_D3D9: GenerateDepalShaderFloat(buffer, pixelFormat, language); break; default: diff --git a/GPU/Common/PresentationCommon.cpp b/GPU/Common/PresentationCommon.cpp index e969e390e4..2d4da991c6 100644 --- a/GPU/Common/PresentationCommon.cpp +++ b/GPU/Common/PresentationCommon.cpp @@ -372,7 +372,7 @@ Draw::Pipeline *PresentationCommon::CreatePipeline(std::vectorGetNativeObject(Draw::NativeObject::DEVICE); std::string errorMessage; - if (!DX9::CompileVertexShader(device_, depalVShaderHLSL, &vertexShader_, nullptr, errorMessage)) { + if (!CompileVertexShaderD3D9(device_, depalVShaderHLSL, &vertexShader_, &errorMessage)) { ERROR_LOG(G3D, "error compling depal vshader: %s", errorMessage.c_str()); } } @@ -152,11 +152,11 @@ LPDIRECT3DPIXELSHADER9 DepalShaderCacheDX9::GetDepalettizePixelShader(uint32_t c char *buffer = new char[2048]; - GenerateDepalShader(buffer, pixelFormat, HLSL_DX9); + GenerateDepalShader(buffer, pixelFormat, HLSL_D3D9); LPDIRECT3DPIXELSHADER9 pshader; std::string errorMessage; - if (!CompilePixelShader(device_, buffer, &pshader, NULL, errorMessage)) { + if (!CompilePixelShaderD3D9(device_, buffer, &pshader, &errorMessage)) { ERROR_LOG(G3D, "Failed to compile depal pixel shader: %s\n\n%s", buffer, errorMessage.c_str()); delete[] buffer; return nullptr; diff --git a/GPU/Directx9/DepalettizeShaderDX9.h b/GPU/Directx9/DepalettizeShaderDX9.h index b6c77aa6f2..1f9ad4a6b7 100644 --- a/GPU/Directx9/DepalettizeShaderDX9.h +++ b/GPU/Directx9/DepalettizeShaderDX9.h @@ -54,9 +54,9 @@ public: private: LPDIRECT3DDEVICE9 device_; - LPDIRECT3DVERTEXSHADER9 vertexShader_; + LPDIRECT3DVERTEXSHADER9 vertexShader_ = nullptr; std::map cache_; std::map texCache_; }; -} // namespace \ No newline at end of file +} // namespace diff --git a/GPU/Directx9/FragmentShaderGeneratorHLSL.cpp b/GPU/Directx9/FragmentShaderGeneratorHLSL.cpp index bca9438265..b109988234 100644 --- a/GPU/Directx9/FragmentShaderGeneratorHLSL.cpp +++ b/GPU/Directx9/FragmentShaderGeneratorHLSL.cpp @@ -29,24 +29,9 @@ // #define DEBUG_SHADER -const char *hlsl_preamble = -"#define vec2 float2\n" -"#define vec3 float3\n" -"#define vec4 float4\n" -"#define uvec3 uint3\n" -"#define ivec3 int3\n" -"#define splat3(x) float3(x, x, x)\n" -"#define mix lerp\n" -"#define mod(x, y) fmod(x, y)\n"; - -const char *hlsl_d3d11_preamble = -"#define DISCARD discard\n" -"#define DISCARD_BELOW(x) clip(x);\n"; -const char *hlsl_d3d9_preamble = -"#define DISCARD clip(-1)\n" -"#define DISCARD_BELOW(x) clip(x)\n"; - -const char *hlsl_late_preamble = ""; +extern const char *hlsl_preamble_fs; +extern const char *hlsl_d3d9_preamble_fs; +extern const char *hlsl_d3d11_preamble_fs; // Missing: Z depth range // Also, logic ops etc, of course, as they are not supported in DX9. @@ -86,19 +71,19 @@ bool GenerateFragmentShaderHLSL(const FShaderID &id, char *buffer, ShaderLanguag StencilValueType replaceAlphaWithStencilType = (StencilValueType)id.Bits(FS_BIT_REPLACE_ALPHA_WITH_STENCIL_TYPE, 4); - WRITE(p, "%s", hlsl_preamble); + WRITE(p, "%s", hlsl_preamble_fs); // Output some compatibility defines switch (lang) { - case ShaderLanguage::HLSL_DX9: - WRITE(p, hlsl_d3d9_preamble); + case ShaderLanguage::HLSL_D3D9: + WRITE(p, hlsl_d3d9_preamble_fs); break; case ShaderLanguage::HLSL_D3D11: - WRITE(p, hlsl_d3d11_preamble); + WRITE(p, hlsl_d3d11_preamble_fs); break; } - if (lang == HLSL_DX9) { + if (lang == HLSL_D3D9) { if (doTexture) WRITE(p, "sampler tex : register(s0);\n"); if (!isModeClear && replaceBlend > REPLACE_BLEND_STANDARD) { @@ -178,8 +163,7 @@ bool GenerateFragmentShaderHLSL(const FShaderID &id, char *buffer, ShaderLanguag } WRITE(p, "};\n"); - if (lang == HLSL_DX9) { - WRITE(p, "%s", hlsl_late_preamble); + if (lang == HLSL_D3D9) { WRITE(p, "vec4 main( PS_IN In ) : COLOR {\n"); } else { WRITE(p, "struct PS_OUT {\n"); @@ -194,7 +178,6 @@ bool GenerateFragmentShaderHLSL(const FShaderID &id, char *buffer, ShaderLanguag WRITE(p, " float depth : SV_DEPTH;\n"); } WRITE(p, "};\n"); - WRITE(p, "%s", hlsl_late_preamble); WRITE(p, "PS_OUT main( PS_IN In ) {\n"); WRITE(p, " PS_OUT outfragment;\n"); } diff --git a/GPU/Directx9/FramebufferManagerDX9.cpp b/GPU/Directx9/FramebufferManagerDX9.cpp index 0c9c2d5720..3bbecb90b3 100644 --- a/GPU/Directx9/FramebufferManagerDX9.cpp +++ b/GPU/Directx9/FramebufferManagerDX9.cpp @@ -88,11 +88,11 @@ static const D3DVERTEXELEMENT9 g_FramebufferVertexElements[] = { device_ = (LPDIRECT3DDEVICE9)draw->GetNativeObject(Draw::NativeObject::DEVICE); deviceEx_ = (LPDIRECT3DDEVICE9)draw->GetNativeObject(Draw::NativeObject::DEVICE_EX); std::string errorMsg; - if (!CompileVertexShader(device_, vscode, &pFramebufferVertexShader, nullptr, errorMsg)) { + if (!CompileVertexShaderD3D9(device_, vscode, &pFramebufferVertexShader, &errorMsg)) { OutputDebugStringA(errorMsg.c_str()); } - if (!CompilePixelShader(device_, pscode, &pFramebufferPixelShader, nullptr, errorMsg)) { + if (!CompilePixelShaderD3D9(device_, pscode, &pFramebufferPixelShader, &errorMsg)) { OutputDebugStringA(errorMsg.c_str()); if (pFramebufferVertexShader) { pFramebufferVertexShader->Release(); @@ -116,7 +116,7 @@ static const D3DVERTEXELEMENT9 g_FramebufferVertexElements[] = { ShaderTranslationInit(); - presentation_->SetLanguage(HLSL_DX9); + presentation_->SetLanguage(HLSL_D3D9); preferredPixelsFormat_ = Draw::DataFormat::B8G8R8A8_UNORM; } diff --git a/GPU/Directx9/ShaderManagerDX9.cpp b/GPU/Directx9/ShaderManagerDX9.cpp index bce4de6770..ee6f75a600 100644 --- a/GPU/Directx9/ShaderManagerDX9.cpp +++ b/GPU/Directx9/ShaderManagerDX9.cpp @@ -57,7 +57,7 @@ PSShader::PSShader(LPDIRECT3DDEVICE9 device, FShaderID id, const char *code) : i bool success; std::string errorMessage; - success = CompilePixelShader(device, code, &shader, NULL, errorMessage); + success = CompilePixelShaderD3D9(device, code, &shader, &errorMessage); if (!errorMessage.empty()) { if (success) { @@ -107,7 +107,7 @@ VSShader::VSShader(LPDIRECT3DDEVICE9 device, VShaderID id, const char *code, boo bool success; std::string errorMessage; - success = CompileVertexShader(device, code, &shader, NULL, errorMessage); + success = CompileVertexShaderD3D9(device, code, &shader, &errorMessage); if (!errorMessage.empty()) { if (success) { ERROR_LOG(G3D, "Warnings in shader compilation!"); @@ -588,7 +588,7 @@ VSShader *ShaderManagerDX9::ApplyShader(bool useHWTransform, bool useHWTessellat if (vsIter == vsCache_.end()) { // Vertex shader not in cache. Let's compile it. std::string genErrorString; - if (GenerateVertexShaderHLSL(VSID, codeBuffer_, HLSL_DX9, &genErrorString)) { + if (GenerateVertexShaderHLSL(VSID, codeBuffer_, HLSL_D3D9, &genErrorString)) { vs = new VSShader(device_, VSID, codeBuffer_, useHWTransform); } if (!vs || vs->Failed()) { @@ -611,7 +611,7 @@ VSShader *ShaderManagerDX9::ApplyShader(bool useHWTransform, bool useHWTessellat // next time and we'll do this over and over... // Can still work with software transform. - bool success = GenerateVertexShaderHLSL(VSID, codeBuffer_, HLSL_DX9, &genErrorString); + bool success = GenerateVertexShaderHLSL(VSID, codeBuffer_, HLSL_D3D9, &genErrorString); _assert_(success); vs = new VSShader(device_, VSID, codeBuffer_, false); } @@ -627,7 +627,7 @@ VSShader *ShaderManagerDX9::ApplyShader(bool useHWTransform, bool useHWTessellat if (fsIter == fsCache_.end()) { // Fragment shader not in cache. Let's compile it. std::string errorString; - bool success = GenerateFragmentShaderHLSL(FSID, codeBuffer_, HLSL_DX9, &errorString); + bool success = GenerateFragmentShaderHLSL(FSID, codeBuffer_, HLSL_D3D9, &errorString); // We're supposed to handle all possible cases. _assert_(success); fs = new PSShader(device_, FSID, codeBuffer_); diff --git a/GPU/Directx9/StencilBufferDX9.cpp b/GPU/Directx9/StencilBufferDX9.cpp index be617417f0..d8e740836b 100644 --- a/GPU/Directx9/StencilBufferDX9.cpp +++ b/GPU/Directx9/StencilBufferDX9.cpp @@ -132,7 +132,7 @@ bool FramebufferManagerDX9::NotifyStencilUpload(u32 addr, int size, StencilUploa // TODO: Helper with logging? if (!stencilUploadPS_) { std::string errorMessage; - bool success = CompilePixelShader(device_, stencil_ps, &stencilUploadPS_, NULL, errorMessage); + bool success = CompilePixelShaderD3D9(device_, stencil_ps, &stencilUploadPS_, &errorMessage); if (!errorMessage.empty()) { if (success) { ERROR_LOG(G3D, "Warnings in shader compilation!"); @@ -154,7 +154,7 @@ bool FramebufferManagerDX9::NotifyStencilUpload(u32 addr, int size, StencilUploa } if (!stencilUploadVS_) { std::string errorMessage; - bool success = CompileVertexShader(device_, stencil_vs, &stencilUploadVS_, NULL, errorMessage); + bool success = CompileVertexShaderD3D9(device_, stencil_vs, &stencilUploadVS_, &errorMessage); if (!errorMessage.empty()) { if (success) { ERROR_LOG(G3D, "Warnings in shader compilation!"); diff --git a/GPU/Directx9/VertexShaderGeneratorHLSL.cpp b/GPU/Directx9/VertexShaderGeneratorHLSL.cpp index 05bc0b41c7..1a71e1ce03 100644 --- a/GPU/Directx9/VertexShaderGeneratorHLSL.cpp +++ b/GPU/Directx9/VertexShaderGeneratorHLSL.cpp @@ -108,7 +108,7 @@ bool GenerateVertexShaderHLSL(const VShaderID &id, char *buffer, ShaderLanguage WRITE(p, "#define mat3x4 float4x3\n"); // note how the conventions are backwards WRITE(p, "#define splat3(x) vec3(x, x, x)\n"); - if (lang == HLSL_DX9) { + if (lang == HLSL_D3D9) { WRITE(p, "#pragma warning( disable : 3571 )\n"); if (isModeThrough) { WRITE(p, "float4x4 u_proj_through : register(c%i);\n", CONST_VS_PROJ_THROUGH); @@ -245,7 +245,7 @@ bool GenerateVertexShaderHLSL(const VShaderID &id, char *buffer, ShaderLanguage if (enableFog) { WRITE(p, " float v_fogdepth: TEXCOORD1;\n"); } - if (lang == HLSL_DX9) { + if (lang == HLSL_D3D9) { WRITE(p, " vec4 gl_Position : POSITION;\n"); } else { WRITE(p, " vec4 gl_Position : SV_Position;\n"); diff --git a/GPU/GLES/FragmentShaderGeneratorGLES.cpp b/GPU/GLES/FragmentShaderGeneratorGLES.cpp index 4d97c3b855..e190bb70a5 100644 --- a/GPU/GLES/FragmentShaderGeneratorGLES.cpp +++ b/GPU/GLES/FragmentShaderGeneratorGLES.cpp @@ -34,7 +34,7 @@ #define WRITE p+=sprintf -static const char *vulkan_glsl_preamble = +const char *vulkan_glsl_preamble_fs = "#version 450\n" "#extension GL_ARB_separate_shader_objects : enable\n" "#extension GL_ARB_shading_language_420pack : enable\n" @@ -46,17 +46,31 @@ static const char *vulkan_glsl_preamble = "#define highp\n" "#define DISCARD discard\n" "\n"; -extern const char *hlsl_preamble; -extern const char *hlsl_d3d9_preamble; -extern const char *hlsl_d3d11_preamble; -extern const char *hlsl_late_preamble; + +const char *hlsl_preamble_fs = +"#define vec2 float2\n" +"#define vec3 float3\n" +"#define vec4 float4\n" +"#define uvec3 uint3\n" +"#define ivec3 int3\n" +"#define splat3(x) float3(x, x, x)\n" +"#define mix lerp\n" +"#define mod(x, y) fmod(x, y)\n"; + +const char *hlsl_d3d11_preamble_fs = +"#define DISCARD discard\n" +"#define DISCARD_BELOW(x) clip(x);\n"; +const char *hlsl_d3d9_preamble_fs = +"#define DISCARD clip(-1)\n" +"#define DISCARD_BELOW(x) clip(x)\n"; + bool GenerateFragmentShaderGLSL(const FShaderID &id, char *buffer, const GLSLShaderCompat &compat, uint64_t *uniformMask, std::string *errorString) { *uniformMask = 0; bool highpFog = false; bool highpTexcoord = false; - bool enableFragmentTestCache = g_Config.bFragmentTestCache && !compat.vulkan && !compat.d3d11; + bool enableFragmentTestCache = g_Config.bFragmentTestCache && ShaderLanguageIsOpenGL(compat.shaderLanguage); if (compat.gles) { // PowerVR needs highp to do the fog in MHU correctly. @@ -69,15 +83,20 @@ bool GenerateFragmentShaderGLSL(const FShaderID &id, char *buffer, const GLSLSha char *p = buffer; - if (compat.vulkan) { - WRITE(p, "%s", vulkan_glsl_preamble); - } else if (compat.d3d11) { - WRITE(p, "%s", hlsl_preamble); - WRITE(p, "%s", hlsl_d3d11_preamble); - } else if (compat.d3d9) { - WRITE(p, "%s", hlsl_preamble); - WRITE(p, "%s", hlsl_d3d9_preamble); - } else { + switch (compat.shaderLanguage) { + case ShaderLanguage::GLSL_VULKAN: + WRITE(p, "%s", vulkan_glsl_preamble_fs); + break; + case ShaderLanguage::HLSL_D3D11: + WRITE(p, "%s", hlsl_preamble_fs); + WRITE(p, "%s", hlsl_d3d11_preamble_fs); + break; + case ShaderLanguage::HLSL_D3D9: + WRITE(p, "%s", hlsl_preamble_fs); + WRITE(p, "%s", hlsl_d3d9_preamble_fs); + break; + default: + // OpenGL WRITE(p, "#version %d%s\n", compat.glslVersionNumber, compat.gles ? " es" : ""); WRITE(p, "#define DISCARD discard\n"); @@ -134,13 +153,13 @@ bool GenerateFragmentShaderGLSL(const FShaderID &id, char *buffer, const GLSLSha bool isModeClear = id.Bit(FS_BIT_CLEARMODE); const char *shading = ""; - if (compat.glslES30 || compat.vulkan) + if (compat.glslES30 || compat.shaderLanguage == ShaderLanguage::GLSL_VULKAN) shading = doFlatShading ? "flat" : ""; bool earlyFragmentTests = ((!enableAlphaTest && !enableColorTest) || testForceToZero) && !gstate_c.Supports(GPU_ROUND_FRAGMENT_DEPTH_TO_16BIT); bool useAdrenoBugWorkaround = id.Bit(FS_BIT_NO_DEPTH_CANNOT_DISCARD_STENCIL); - if (compat.vulkan) { + if (compat.shaderLanguage == ShaderLanguage::GLSL_VULKAN) { if (earlyFragmentTests) { WRITE(p, "layout (early_fragment_tests) in;\n"); } else if (useAdrenoBugWorkaround && !gstate_c.Supports(GPU_ROUND_FRAGMENT_DEPTH_TO_16BIT)) { @@ -183,7 +202,7 @@ bool GenerateFragmentShaderGLSL(const FShaderID &id, char *buffer, const GLSLSha if (stencilToAlpha == REPLACE_ALPHA_DUALSOURCE) { WRITE(p, "layout (location = 0, index = 1) out vec4 fragColor1;\n"); } - } else if (compat.d3d11) { + } else if (compat.shaderLanguage == ShaderLanguage::HLSL_D3D11) { WRITE(p, "SamplerState samp : register(s0);\n"); WRITE(p, "Texture2D tex : register(t0);\n"); if (!isModeClear && replaceBlend > REPLACE_BLEND_STANDARD) { @@ -229,7 +248,7 @@ bool GenerateFragmentShaderGLSL(const FShaderID &id, char *buffer, const GLSLSha WRITE(p, " float depth : SV_DEPTH;\n"); } WRITE(p, "};\n"); - } else { + } else if (ShaderLanguageIsOpenGL(compat.shaderLanguage)) { if (shaderDepal && gl_extensions.IsGLES) { WRITE(p, "precision highp int;\n"); } @@ -343,8 +362,7 @@ bool GenerateFragmentShaderGLSL(const FShaderID &id, char *buffer, const GLSLSha WRITE(p, "float mymod(float a, float b) { return a - b * floor(a / b); }\n"); } - if (compat.d3d11) { - WRITE(p, "%s", hlsl_late_preamble); + if (compat.shaderLanguage == HLSL_D3D11 || compat.shaderLanguage == HLSL_D3D9) { WRITE(p, "PS_OUT main( PS_IN In ) {\n"); WRITE(p, " PS_OUT outfragment;\n"); } else { @@ -364,7 +382,7 @@ bool GenerateFragmentShaderGLSL(const FShaderID &id, char *buffer, const GLSLSha } if (doTexture) { - std::string texcoord = std::string(compat.inPrefix) + "v_texcoord"; + std::string texcoord = StringFromFormat("%sv_texcoord", compat.inPrefix); // TODO: Not sure the right way to do this for projection. // This path destroys resolution on older PowerVR no matter what I do if projection is needed, // so we disable it on SGX 540 and lesser, and live with the consequences. @@ -378,8 +396,8 @@ bool GenerateFragmentShaderGLSL(const FShaderID &id, char *buffer, const GLSLSha // We may be clamping inside a larger surface (tex = 64x64, buffer=480x272). // We may also be wrapping in such a surface, or either one in a too-small surface. // Obviously, clamping to a smaller surface won't work. But better to clamp to something. - std::string ucoord = std::string(compat.inPrefix) + "v_texcoord.x"; - std::string vcoord = std::string(compat.inPrefix) + "v_texcoord.y"; + std::string ucoord = StringFromFormat("%sv_texcoord.x", compat.inPrefix); + std::string vcoord = StringFromFormat("%sv_texcoord.y", compat.inPrefix); if (doTextureProjection) { ucoord = StringFromFormat("(%sv_texcoord.x / %sv_texcoord.z)", compat.inPrefix, compat.inPrefix); vcoord = StringFromFormat("(%sv_texcoord.y / %sv_texcoord.z)", compat.inPrefix, compat.inPrefix); @@ -409,7 +427,7 @@ bool GenerateFragmentShaderGLSL(const FShaderID &id, char *buffer, const GLSLSha } if (!shaderDepal) { - if (compat.d3d11) { + if (compat.shaderLanguage == HLSL_D3D11) { if (doTextureProjection) { WRITE(p, " vec4 t = tex.Sample(samp, %sv_texcoord.xy / %sv_texcoord.z)%s;\n", compat.inPrefix, compat.inPrefix, bgraTexture ? ".bgra" : ""); } else { @@ -668,7 +686,7 @@ bool GenerateFragmentShaderGLSL(const FShaderID &id, char *buffer, const GLSLSha const char *colorTestFuncs[] = { "#", "#", " != ", " == " }; if (colorTestFuncs[colorTestFunc][0] != '#') { // TODO: Unify these paths better. - if (compat.d3d11) { + if (compat.shaderLanguage == HLSL_D3D11) { const char *test = colorTestFuncs[colorTestFunc]; WRITE(p, " uvec3 v_scaled = roundAndScaleTo255iv(v.rgb);\n"); WRITE(p, " uvec3 v_masked = v_scaled & u_alphacolormask.rgb;\n"); @@ -678,7 +696,7 @@ bool GenerateFragmentShaderGLSL(const FShaderID &id, char *buffer, const GLSLSha } else if (compat.bitwiseOps) { // Apparently GLES3 does not support vector bitwise ops. WRITE(p, " ivec3 v_scaled = roundAndScaleTo255iv(v.rgb);\n"); - if (compat.vulkan) { + if (compat.shaderLanguage == GLSL_VULKAN) { // TODO: Use this for GL as well? WRITE(p, " if ((v_scaled & u_alphacolormask.rgb) %s (u_alphacolorref.rgb & u_alphacolormask.rgb)) %s\n", colorTestFuncs[colorTestFunc], discardStatement); } else { @@ -728,10 +746,10 @@ bool GenerateFragmentShaderGLSL(const FShaderID &id, char *buffer, const GLSLSha WRITE(p, " v.rgb = v.rgb * %s;\n", srcFactor); } - if (replaceBlend == REPLACE_BLEND_COPY_FBO) { + if (replaceBlend == REPLACE_BLEND_COPY_FBO && compat.shaderLanguage != HLSL_D3D9) { // If we have NV_shader_framebuffer_fetch / EXT_shader_framebuffer_fetch, we skip the blit. // We can just read the prev value more directly. - if (compat.d3d11) { + if (compat.shaderLanguage == HLSL_D3D11) { WRITE(p, " vec4 destColor = fboTex.Load(int3((int)In.pixelPos.x, (int)In.pixelPos.y, 0));\n"); } else if (gstate_c.Supports(GPU_SUPPORTS_ANY_FRAMEBUFFER_FETCH)) { WRITE(p, " lowp vec4 destColor = %s;\n", compat.lastFragData); @@ -904,7 +922,7 @@ bool GenerateFragmentShaderGLSL(const FShaderID &id, char *buffer, const GLSLSha WRITE(p, " %s = v;\n", compat.fragColor0); } - if (compat.d3d11) { + if (compat.shaderLanguage == HLSL_D3D11 || compat.shaderLanguage == HLSL_D3D9) { WRITE(p, " return outfragment;\n"); } diff --git a/GPU/GLES/ShaderManagerGLES.cpp b/GPU/GLES/ShaderManagerGLES.cpp index 5d5af4f4a8..887eade3ec 100644 --- a/GPU/GLES/ShaderManagerGLES.cpp +++ b/GPU/GLES/ShaderManagerGLES.cpp @@ -585,6 +585,7 @@ ShaderManagerGLES::~ShaderManagerGLES() { void ShaderManagerGLES::DetectShaderLanguage() { GLSLShaderCompat &compat = compat_; + compat.shaderLanguage = ShaderLanguage::GLSL_140; compat.attribute = "attribute"; compat.varying_vs = "varying"; compat.varying_fs = "varying"; @@ -599,6 +600,7 @@ void ShaderManagerGLES::DetectShaderLanguage() { if (compat.gles) { if (gstate_c.Supports(GPU_SUPPORTS_GLSL_ES_300)) { + compat.shaderLanguage = ShaderLanguage::GLSL_300; compat.glslVersionNumber = 300; // GLSL ES 3.0 compat.fragColor0 = "fragColor0"; compat.texture = "texture"; @@ -606,6 +608,7 @@ void ShaderManagerGLES::DetectShaderLanguage() { compat.bitwiseOps = true; compat.texelFetch = "texelFetch"; } else { + compat.shaderLanguage = ShaderLanguage::GLSL_140; compat.glslVersionNumber = 100; // GLSL ES 1.0 if (gl_extensions.EXT_gpu_shader4) { compat.bitwiseOps = true; @@ -619,6 +622,7 @@ void ShaderManagerGLES::DetectShaderLanguage() { } else { if (!gl_extensions.ForceGL2 || gl_extensions.IsCoreContext) { if (gl_extensions.VersionGEThan(3, 3, 0)) { + compat.shaderLanguage = ShaderLanguage::GLSL_300; compat.glslVersionNumber = 330; compat.fragColor0 = "fragColor0"; compat.texture = "texture"; @@ -626,11 +630,13 @@ void ShaderManagerGLES::DetectShaderLanguage() { compat.bitwiseOps = true; compat.texelFetch = "texelFetch"; } else if (gl_extensions.VersionGEThan(3, 0, 0)) { + compat.shaderLanguage = ShaderLanguage::GLSL_140; compat.glslVersionNumber = 130; compat.fragColor0 = "fragColor0"; compat.bitwiseOps = true; compat.texelFetch = "texelFetch"; } else { + compat.shaderLanguage = ShaderLanguage::GLSL_140; compat.glslVersionNumber = 110; if (gl_extensions.EXT_gpu_shader4) { compat.bitwiseOps = true; diff --git a/GPU/GLES/VertexShaderGeneratorGLES.cpp b/GPU/GLES/VertexShaderGeneratorGLES.cpp index c5d0bf8623..76faa4af05 100644 --- a/GPU/GLES/VertexShaderGeneratorGLES.cpp +++ b/GPU/GLES/VertexShaderGeneratorGLES.cpp @@ -113,7 +113,7 @@ bool GenerateVertexShaderGLSL(const VShaderID &id, char *buffer, const GLSLShade bool highpTexcoord = false; char *p = buffer; - if (compat.vulkan) { + if (compat.shaderLanguage == GLSL_VULKAN) { WRITE(p, "%s", vulkan_glsl_preamble); } else { if (compat.gles) { @@ -126,13 +126,13 @@ bool GenerateVertexShaderGLSL(const VShaderID &id, char *buffer, const GLSLShade WRITE(p, "#define splat3(x) vec3(x)\n"); } - if (!compat.vulkan && gl_extensions.EXT_gpu_shader4) { + if (!ShaderLanguageIsOpenGL(compat.shaderLanguage) && gl_extensions.EXT_gpu_shader4) { WRITE(p, "#extension GL_EXT_gpu_shader4 : enable\n"); } if (compat.gles) { WRITE(p, "precision highp float;\n"); - } else if (!compat.vulkan) { + } else if (!compat.shaderLanguage == GLSL_VULKAN) { WRITE(p, "#define lowp\n"); WRITE(p, "#define mediump\n"); WRITE(p, "#define highp\n"); @@ -175,7 +175,7 @@ bool GenerateVertexShaderGLSL(const VShaderID &id, char *buffer, const GLSLShade bool hasNormalTess = id.Bit(VS_BIT_HAS_NORMAL_TESS); bool flipNormalTess = id.Bit(VS_BIT_NORM_REVERSE_TESS); - if (compat.vulkan) { + if (compat.shaderLanguage == GLSL_VULKAN) { WRITE(p, "\n"); WRITE(p, "layout (std140, set = 0, binding = 3) uniform baseVars {\n%s};\n", ub_baseStr); if (enableLighting || doShadeMapping) @@ -185,7 +185,7 @@ bool GenerateVertexShaderGLSL(const VShaderID &id, char *buffer, const GLSLShade } const char *shading = ""; - if (compat.glslES30 || compat.vulkan) + if (compat.glslES30 || compat.shaderLanguage == GLSL_VULKAN) shading = doFlatShading ? "flat " : ""; DoLightComputation doLight[4] = { LIGHT_OFF, LIGHT_OFF, LIGHT_OFF, LIGHT_OFF }; @@ -204,7 +204,7 @@ bool GenerateVertexShaderGLSL(const VShaderID &id, char *buffer, const GLSLShade int boneWeightScale = id.Bits(VS_BIT_WEIGHT_FMTSCALE, 2); bool texcoordInVec3 = false; - if (compat.vulkan) { + if (compat.shaderLanguage == GLSL_VULKAN) { if (enableBones) { numBoneWeights = 1 + id.Bits(VS_BIT_BONES, 3); WRITE(p, "%s", boneWeightDecl[numBoneWeights]); @@ -307,15 +307,10 @@ bool GenerateVertexShaderGLSL(const VShaderID &id, char *buffer, const GLSLShade *uniformMask |= DIRTY_TEXMATRIX; } if (enableBones) { -#ifdef USE_BONE_ARRAY - WRITE(p, "uniform mediump mat4 u_bone[%i];\n", numBoneWeights); - *uniformMask |= DIRTY_BONE_UNIFORMS; -#else for (int i = 0; i < numBoneWeights; i++) { WRITE(p, "uniform mat4 u_bone%i;\n", i); *uniformMask |= DIRTY_BONEMATRIX0 << i; } -#endif } if (doTexture) { WRITE(p, "uniform vec4 u_uvscaleoffset;\n"); @@ -415,7 +410,7 @@ bool GenerateVertexShaderGLSL(const VShaderID &id, char *buffer, const GLSLShade if (doBezier || doSpline) { *uniformMask |= DIRTY_BEZIERSPLINE; - if (compat.vulkan) { + if (compat.shaderLanguage == GLSL_VULKAN) { WRITE(p, "struct TessData {\n"); WRITE(p, " vec4 pos;\n"); WRITE(p, " vec4 uv;\n"); @@ -615,14 +610,14 @@ bool GenerateVertexShaderGLSL(const VShaderID &id, char *buffer, const GLSLShade // Uncomment this to screw up bone shaders to check the vertex shader software fallback // WRITE(p, "THIS SHOULD ERROR! #error"); - if (numBoneWeights == 1 && !compat.vulkan) + if (numBoneWeights == 1 && compat.shaderLanguage != GLSL_VULKAN) WRITE(p, " %s skinMatrix = w1 * u_bone0", boneMatrix); else WRITE(p, " %s skinMatrix = w1.x * u_bone0", boneMatrix); for (int i = 1; i < numBoneWeights; i++) { const char *weightAttr = boneWeightAttr[i]; // workaround for "cant do .x of scalar" issue - if (!compat.vulkan) { + if (compat.shaderLanguage != GLSL_VULKAN) { if (numBoneWeights == 1 && i == 0) weightAttr = "w1"; if (numBoneWeights == 5 && i == 4) weightAttr = "w2"; } @@ -895,7 +890,7 @@ bool GenerateVertexShaderGLSL(const VShaderID &id, char *buffer, const GLSLShade WRITE(p, " }\n"); } WRITE(p, " gl_Position = outPos;\n"); - if (compat.vulkan) { + if (compat.shaderLanguage == GLSL_VULKAN) { WRITE(p, " gl_PointSize = 1.0;\n"); } diff --git a/GPU/Vulkan/ShaderManagerVulkan.cpp b/GPU/Vulkan/ShaderManagerVulkan.cpp index 84909a4d8a..6503aa3b1f 100644 --- a/GPU/Vulkan/ShaderManagerVulkan.cpp +++ b/GPU/Vulkan/ShaderManagerVulkan.cpp @@ -169,7 +169,7 @@ ShaderManagerVulkan::ShaderManagerVulkan(Draw::DrawContext *draw, VulkanContext static_assert(sizeof(ub_lights) <= 512, "ub_lights grew too big"); static_assert(sizeof(ub_bones) <= 384, "ub_bones grew too big"); - compat_.SetupForVulkan(); + compat_.SetupForShaderLanguage(ShaderLanguage::GLSL_VULKAN); } ShaderManagerVulkan::~ShaderManagerVulkan() { @@ -390,8 +390,6 @@ bool ShaderManagerVulkan::LoadCache(FILE *f) { if (header.featureFlags != gstate_c.featureFlags) return false; - GLSLShaderCompat compat{}; - compat.SetupForVulkan(); for (int i = 0; i < header.numVertexShaders; i++) { VShaderID id; if (fread(&id, sizeof(id), 1, f) != 1) { @@ -402,7 +400,7 @@ bool ShaderManagerVulkan::LoadCache(FILE *f) { std::string genErrorString; uint32_t attributeMask = 0; uint64_t uniformMask = 0; - if (!GenerateVertexShaderGLSL(id, codeBuffer_, compat, &attributeMask, &uniformMask, &genErrorString)) { + if (!GenerateVertexShaderGLSL(id, codeBuffer_, compat_, &attributeMask, &uniformMask, &genErrorString)) { return false; } VulkanVertexShader *vs = new VulkanVertexShader(vulkan_, id, codeBuffer_, useHWTransform); @@ -418,7 +416,7 @@ bool ShaderManagerVulkan::LoadCache(FILE *f) { } std::string genErrorString; uint64_t uniformMask = 0; - if (!GenerateFragmentShaderGLSL(id, codeBuffer_, compat, &uniformMask, &genErrorString)) { + if (!GenerateFragmentShaderGLSL(id, codeBuffer_, compat_, &uniformMask, &genErrorString)) { return false; } VulkanFragmentShader *fs = new VulkanFragmentShader(vulkan_, id, codeBuffer_); diff --git a/unittest/TestShaderGenerators.cpp b/unittest/TestShaderGenerators.cpp index c4eb0cae2f..4008d75606 100644 --- a/unittest/TestShaderGenerators.cpp +++ b/unittest/TestShaderGenerators.cpp @@ -20,19 +20,16 @@ #include "GPU/D3D9/D3DCompilerLoader.h" #include "GPU/D3D9/D3D9ShaderCompiler.h" - bool GenerateFShader(FShaderID id, char *buffer, ShaderLanguage lang, std::string *errorString) { switch (lang) { case ShaderLanguage::HLSL_D3D11: return GenerateFragmentShaderHLSL(id, buffer, ShaderLanguage::HLSL_D3D11, errorString); - case ShaderLanguage::HLSL_DX9: - GenerateFragmentShaderHLSL(id, buffer, ShaderLanguage::HLSL_DX9, errorString); - // TODO: Need a device :( Returning false here so it doesn't get tried. - return false; + case ShaderLanguage::HLSL_D3D9: + return GenerateFragmentShaderHLSL(id, buffer, ShaderLanguage::HLSL_D3D9, errorString); case ShaderLanguage::GLSL_VULKAN: { GLSLShaderCompat compat{}; - compat.SetupForVulkan(); + compat.SetupForShaderLanguage(ShaderLanguage::GLSL_VULKAN); uint64_t uniformMask; return GenerateFragmentShaderGLSL(id, buffer, compat, &uniformMask, errorString); } @@ -40,10 +37,17 @@ bool GenerateFShader(FShaderID id, char *buffer, ShaderLanguage lang, std::strin case ShaderLanguage::GLSL_300: // TODO: Need a device - except that maybe glslang could be used to verify these .... return false; + case ShaderLanguage::HLSL_D3D9_TEST: + { + GLSLShaderCompat compat{}; + compat.SetupForShaderLanguage(ShaderLanguage::HLSL_D3D9); + uint64_t uniformMask; + return GenerateFragmentShaderGLSL(id, buffer, compat, &uniformMask, errorString); + } case ShaderLanguage::HLSL_D3D11_TEST: { GLSLShaderCompat compat{}; - compat.SetupForD3D11(); + compat.SetupForShaderLanguage(ShaderLanguage::HLSL_D3D11); uint64_t uniformMask; return GenerateFragmentShaderGLSL(id, buffer, compat, &uniformMask, errorString); } @@ -56,15 +60,21 @@ bool GenerateVShader(VShaderID id, char *buffer, ShaderLanguage lang, std::strin switch (lang) { case ShaderLanguage::HLSL_D3D11: return GenerateVertexShaderHLSL(id, buffer, ShaderLanguage::HLSL_D3D11, errorString); - case ShaderLanguage::HLSL_DX9: - GenerateVertexShaderHLSL(id, buffer, ShaderLanguage::HLSL_DX9, errorString); - // TODO: Need a device :( Returning false here so it doesn't get tried. - return false; - // return DX9::GenerateFragmentShaderHLSL(id, buffer, ShaderLanguage::HLSL_DX9); + case ShaderLanguage::HLSL_D3D9: + return GenerateVertexShaderHLSL(id, buffer, ShaderLanguage::HLSL_D3D9, errorString); + // return DX9::GenerateFragmentShaderHLSL(id, buffer, ShaderLanguage::HLSL_D3D9); case ShaderLanguage::GLSL_VULKAN: { GLSLShaderCompat compat{}; - compat.SetupForVulkan(); + compat.SetupForShaderLanguage(ShaderLanguage::GLSL_VULKAN); + uint32_t attrMask; + uint64_t uniformMask; + return GenerateVertexShaderGLSL(id, buffer, compat, &attrMask, &uniformMask, errorString); + } + case ShaderLanguage::HLSL_D3D9_TEST: + { + GLSLShaderCompat compat{}; + compat.SetupForShaderLanguage(ShaderLanguage::HLSL_D3D9); uint32_t attrMask; uint64_t uniformMask; return GenerateVertexShaderGLSL(id, buffer, compat, &attrMask, &uniformMask, errorString); @@ -72,7 +82,7 @@ bool GenerateVShader(VShaderID id, char *buffer, ShaderLanguage lang, std::strin case ShaderLanguage::HLSL_D3D11_TEST: { GLSLShaderCompat compat{}; - compat.SetupForD3D11(); + compat.SetupForShaderLanguage(ShaderLanguage::HLSL_D3D11); uint32_t attrMask; uint64_t uniformMask; return GenerateVertexShaderGLSL(id, buffer, compat, &attrMask, &uniformMask, errorString); @@ -82,7 +92,7 @@ bool GenerateVShader(VShaderID id, char *buffer, ShaderLanguage lang, std::strin } } -bool TestCompileShader(const char *buffer, ShaderLanguage lang, bool vertex) { +bool TestCompileShader(const char *buffer, ShaderLanguage lang, bool vertex, std::string *errorMessage) { switch (lang) { case ShaderLanguage::HLSL_D3D11: case ShaderLanguage::HLSL_D3D11_TEST: @@ -90,8 +100,18 @@ bool TestCompileShader(const char *buffer, ShaderLanguage lang, bool vertex) { auto output = CompileShaderToBytecodeD3D11(buffer, strlen(buffer), vertex ? "vs_4_0" : "ps_4_0", 0); return !output.empty(); } - case ShaderLanguage::HLSL_DX9: - return false; + case ShaderLanguage::HLSL_D3D9: + case ShaderLanguage::HLSL_D3D9_TEST: + { + LPD3DBLOB blob = CompileShaderToByteCodeD3D9(buffer, vertex ? "vs_2_0" : "ps_2_0", errorMessage); + if (blob) { + blob->Release(); + return true; + } else { + return false; + } + } + case ShaderLanguage::GLSL_VULKAN: { std::vector spirv; @@ -144,12 +164,13 @@ bool TestShaderGenerators() { LoadD3DCompilerDynamic(); ShaderLanguage languages[] = { - ShaderLanguage::HLSL_D3D11_TEST, + ShaderLanguage::HLSL_D3D9_TEST, + ShaderLanguage::HLSL_D3D9, ShaderLanguage::HLSL_D3D11, + ShaderLanguage::HLSL_D3D9, ShaderLanguage::GLSL_VULKAN, ShaderLanguage::GLSL_140, ShaderLanguage::GLSL_300, - ShaderLanguage::HLSL_DX9, }; const int numLanguages = ARRAY_SIZE(languages); @@ -203,8 +224,9 @@ bool TestShaderGenerators() { // let's try to compile them. for (int j = 0; j < numLanguages; j++) { if (generateSuccess[j]) { - if (!TestCompileShader(buffer[j], languages[j], false)) { - printf("Error compiling fragment shader:\n\n%s\n\n", LineNumberString(buffer[j]).c_str()); + std::string errorMessage; + if (!TestCompileShader(buffer[j], languages[j], false, &errorMessage)) { + printf("Error compiling fragment shader:\n\n%s\n\n%s\n", LineNumberString(buffer[j]).c_str(), errorMessage.c_str()); return false; } successes++; @@ -254,8 +276,9 @@ bool TestShaderGenerators() { // let's try to compile them. for (int j = 0; j < numLanguages; j++) { if (generateSuccess[j]) { - if (!TestCompileShader(buffer[j], languages[j], true)) { - printf("Error compiling vertex shader:\n\n%s\n\n", LineNumberString(buffer[j]).c_str()); + std::string errorMessage; + if (!TestCompileShader(buffer[j], languages[j], true, &errorMessage)) { + printf("Error compiling vertex shader:\n\n%s\n\n%s\n", LineNumberString(buffer[j]).c_str(), errorMessage.c_str()); return false; } successes++; From c2a6090c3f53ff3c94adaf4cd4c64157d3043f9f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Fri, 30 Oct 2020 10:22:51 +0100 Subject: [PATCH 139/275] More D3D9 fixes. --- GPU/Common/ShaderId.h | 7 +- GPU/Directx9/FragmentShaderGeneratorHLSL.h | 15 +-- GPU/GLES/FragmentShaderGeneratorGLES.cpp | 146 +++++++++++++++++---- GPU/GLES/FragmentShaderGeneratorGLES.h | 18 +++ GPU/GLES/VertexShaderGeneratorGLES.cpp | 2 +- unittest/TestShaderGenerators.cpp | 7 +- 6 files changed, 149 insertions(+), 46 deletions(-) diff --git a/GPU/Common/ShaderId.h b/GPU/Common/ShaderId.h index 60eba9e460..e6cf46be68 100644 --- a/GPU/Common/ShaderId.h +++ b/GPU/Common/ShaderId.h @@ -164,10 +164,9 @@ protected: } } void SetBits(int bit, int count, int value) { - if (value != 0) { - const int mask = (1 << count) - 1; - d[bit >> 5] |= (value & mask) << (bit & 31); - } + const int mask = (1 << count) - 1; + const int shifted_mask = mask << (bit & 31); + d[bit >> 5] = (d[bit >> 5] & ~shifted_mask) | ((value & mask) << (bit & 31)); } }; diff --git a/GPU/Directx9/FragmentShaderGeneratorHLSL.h b/GPU/Directx9/FragmentShaderGeneratorHLSL.h index 5dcaa52e54..a3ec82cf14 100644 --- a/GPU/Directx9/FragmentShaderGeneratorHLSL.h +++ b/GPU/Directx9/FragmentShaderGeneratorHLSL.h @@ -19,19 +19,6 @@ #include "GPU/Common/ShaderId.h" #include "GPU/Common/ShaderCommon.h" +#include "GPU/GLES/FragmentShaderGeneratorGLES.h" bool GenerateFragmentShaderHLSL(const FShaderID &id, char *buffer, ShaderLanguage lang, std::string *errorString); - -#define CONST_PS_TEXENV 0 -#define CONST_PS_ALPHACOLORREF 1 -#define CONST_PS_ALPHACOLORMASK 2 -#define CONST_PS_FOGCOLOR 3 -#define CONST_PS_STENCILREPLACE 4 -#define CONST_PS_BLENDFIXA 5 -#define CONST_PS_BLENDFIXB 6 -#define CONST_PS_FBOTEXSIZE 7 -#define CONST_PS_TEXCLAMP 8 -#define CONST_PS_TEXCLAMPOFF 9 - -// For stencil upload -#define CONST_PS_STENCILVALUE 10 diff --git a/GPU/GLES/FragmentShaderGeneratorGLES.cpp b/GPU/GLES/FragmentShaderGeneratorGLES.cpp index e190bb70a5..fdb795f6c6 100644 --- a/GPU/GLES/FragmentShaderGeneratorGLES.cpp +++ b/GPU/GLES/FragmentShaderGeneratorGLES.cpp @@ -202,29 +202,75 @@ bool GenerateFragmentShaderGLSL(const FShaderID &id, char *buffer, const GLSLSha if (stencilToAlpha == REPLACE_ALPHA_DUALSOURCE) { WRITE(p, "layout (location = 0, index = 1) out vec4 fragColor1;\n"); } - } else if (compat.shaderLanguage == ShaderLanguage::HLSL_D3D11) { - WRITE(p, "SamplerState samp : register(s0);\n"); - WRITE(p, "Texture2D tex : register(t0);\n"); - if (!isModeClear && replaceBlend > REPLACE_BLEND_STANDARD) { - if (replaceBlend == REPLACE_BLEND_COPY_FBO) { - // No sampler required, we Load - WRITE(p, "Texture2D fboTex : register(t1);\n"); + } else if (compat.shaderLanguage == HLSL_D3D11 || compat.shaderLanguage == HLSL_D3D9) { + if (compat.shaderLanguage == HLSL_D3D9) { + if (doTexture) + WRITE(p, "sampler tex : register(s0);\n"); + if (!isModeClear && replaceBlend > REPLACE_BLEND_STANDARD) { + if (replaceBlend == REPLACE_BLEND_COPY_FBO) { + WRITE(p, "vec2 u_fbotexSize : register(c%i);\n", CONST_PS_FBOTEXSIZE); + WRITE(p, "sampler fbotex : register(s1);\n"); + } + if (replaceBlendFuncA >= GE_SRCBLEND_FIXA) { + WRITE(p, "float3 u_blendFixA : register(c%i);\n", CONST_PS_BLENDFIXA); + } + if (replaceBlendFuncB >= GE_DSTBLEND_FIXB) { + WRITE(p, "float3 u_blendFixB : register(c%i);\n", CONST_PS_BLENDFIXB); + } } + if (gstate_c.needShaderTexClamp && doTexture) { + WRITE(p, "vec4 u_texclamp : register(c%i);\n", CONST_PS_TEXCLAMP); + if (textureAtOffset) { + WRITE(p, "vec2 u_texclampoff : register(c%i);\n", CONST_PS_TEXCLAMPOFF); + } + } + + if (enableAlphaTest || enableColorTest) { + WRITE(p, "vec4 u_alphacolorref : register(c%i);\n", CONST_PS_ALPHACOLORREF); + WRITE(p, "vec4 u_alphacolormask : register(c%i);\n", CONST_PS_ALPHACOLORMASK); + } + if (stencilToAlpha && replaceAlphaWithStencilType == STENCIL_VALUE_UNIFORM) { + WRITE(p, "float u_stencilReplaceValue : register(c%i);\n", CONST_PS_STENCILREPLACE); + } + if (doTexture && texFunc == GE_TEXFUNC_BLEND) { + WRITE(p, "float3 u_texenv : register(c%i);\n", CONST_PS_TEXENV); + } + if (enableFog) { + WRITE(p, "float3 u_fogcolor : register(c%i);\n", CONST_PS_FOGCOLOR); + } + } else { + WRITE(p, "SamplerState samp : register(s0);\n"); + WRITE(p, "Texture2D tex : register(t0);\n"); + if (!isModeClear && replaceBlend > REPLACE_BLEND_STANDARD) { + if (replaceBlend == REPLACE_BLEND_COPY_FBO) { + // No sampler required, we Load + WRITE(p, "Texture2D fboTex : register(t1);\n"); + } + } + WRITE(p, "cbuffer base : register(b0) {\n%s};\n", cb_baseStr); } - WRITE(p, "cbuffer base : register(b0) {\n%s};\n", cb_baseStr); if (enableAlphaTest) { - WRITE(p, "int roundAndScaleTo255i(float x) { return int(floor(x * 255.0f + 0.5f)); }\n"); + if (compat.shaderLanguage == HLSL_D3D11) { + WRITE(p, "int roundAndScaleTo255i(float x) { return int(floor(x * 255.0f + 0.5f)); }\n"); + } else { + // D3D11 level 9 gets to take this path. + WRITE(p, "float roundAndScaleTo255f(float x) { return floor(x * 255.0f + 0.5f); }\n"); + } } if (enableColorTest) { - WRITE(p, "uvec3 roundAndScaleTo255iv(float3 x) { return uvec3(floor(x * 255.0f + 0.5f)); }\n"); + if (compat.shaderLanguage == HLSL_D3D11) { + WRITE(p, "uvec3 roundAndScaleTo255iv(float3 x) { return uvec3(floor(x * 255.0f + 0.5f)); }\n"); + } else { + WRITE(p, "vec3 roundAndScaleTo255v(float3 x) { return floor(x * 255.0f + 0.5f); }\n"); + } } WRITE(p, "struct PS_IN {\n"); if (doTexture) { WRITE(p, " vec3 v_texcoord: TEXCOORD0;\n"); } - const char *colorInterpolation = doFlatShading ? "nointerpolation " : ""; + const char *colorInterpolation = doFlatShading && compat.shaderLanguage == HLSL_D3D11 ? "nointerpolation " : ""; WRITE(p, " %svec4 v_color0: COLOR0;\n", colorInterpolation); if (lmode) { WRITE(p, " vec3 v_color1: COLOR1;\n"); @@ -232,22 +278,60 @@ bool GenerateFragmentShaderGLSL(const FShaderID &id, char *buffer, const GLSLSha if (enableFog) { WRITE(p, " float v_fogdepth: TEXCOORD1;\n"); } - if ((replaceBlend == REPLACE_BLEND_COPY_FBO) || gstate_c.Supports(GPU_ROUND_FRAGMENT_DEPTH_TO_16BIT)) { + if (compat.shaderLanguage == HLSL_D3D11 && ((replaceBlend == REPLACE_BLEND_COPY_FBO) || gstate_c.Supports(GPU_ROUND_FRAGMENT_DEPTH_TO_16BIT))) { WRITE(p, " vec4 pixelPos : SV_POSITION;\n"); } WRITE(p, "};\n"); - WRITE(p, "struct PS_OUT {\n"); - if (stencilToAlpha == REPLACE_ALPHA_DUALSOURCE) { - WRITE(p, " vec4 target : SV_Target0;\n"); - WRITE(p, " vec4 target1 : SV_Target1;\n"); - } else { - WRITE(p, " vec4 target : SV_Target;\n"); + if (compat.shaderLanguage == HLSL_D3D11) { + WRITE(p, "struct PS_OUT {\n"); + if (stencilToAlpha == REPLACE_ALPHA_DUALSOURCE) { + WRITE(p, " vec4 target : SV_Target0;\n"); + WRITE(p, " vec4 target1 : SV_Target1;\n"); + } else { + WRITE(p, " vec4 target : SV_Target;\n"); + } + if (gstate_c.Supports(GPU_ROUND_FRAGMENT_DEPTH_TO_16BIT)) { + WRITE(p, " float depth : SV_DEPTH;\n"); + } + WRITE(p, "};\n"); } - if (gstate_c.Supports(GPU_ROUND_FRAGMENT_DEPTH_TO_16BIT)) { - WRITE(p, " float depth : SV_DEPTH;\n"); + } else if (compat.shaderLanguage == HLSL_D3D9) { + if (doTexture) + WRITE(p, "sampler tex : register(s0);\n"); + if (!isModeClear && replaceBlend > REPLACE_BLEND_STANDARD) { + if (replaceBlend == REPLACE_BLEND_COPY_FBO) { + WRITE(p, "vec2 u_fbotexSize : register(c%i);\n", CONST_PS_FBOTEXSIZE); + WRITE(p, "sampler fbotex : register(s1);\n"); + } + if (replaceBlendFuncA >= GE_SRCBLEND_FIXA) { + WRITE(p, "float3 u_blendFixA : register(c%i);\n", CONST_PS_BLENDFIXA); + } + if (replaceBlendFuncB >= GE_DSTBLEND_FIXB) { + WRITE(p, "float3 u_blendFixB : register(c%i);\n", CONST_PS_BLENDFIXB); + } } - WRITE(p, "};\n"); + if (gstate_c.needShaderTexClamp && doTexture) { + WRITE(p, "vec4 u_texclamp : register(c%i);\n", CONST_PS_TEXCLAMP); + if (textureAtOffset) { + WRITE(p, "vec2 u_texclampoff : register(c%i);\n", CONST_PS_TEXCLAMPOFF); + } + } + + if (enableAlphaTest || enableColorTest) { + WRITE(p, "vec4 u_alphacolorref : register(c%i);\n", CONST_PS_ALPHACOLORREF); + WRITE(p, "vec4 u_alphacolormask : register(c%i);\n", CONST_PS_ALPHACOLORMASK); + } + if (stencilToAlpha && replaceAlphaWithStencilType == STENCIL_VALUE_UNIFORM) { + WRITE(p, "float u_stencilReplaceValue : register(c%i);\n", CONST_PS_STENCILREPLACE); + } + if (doTexture && texFunc == GE_TEXFUNC_BLEND) { + WRITE(p, "float3 u_texenv : register(c%i);\n", CONST_PS_TEXENV); + } + if (enableFog) { + WRITE(p, "float3 u_fogcolor : register(c%i);\n", CONST_PS_FOGCOLOR); + } + } else if (ShaderLanguageIsOpenGL(compat.shaderLanguage)) { if (shaderDepal && gl_extensions.IsGLES) { WRITE(p, "precision highp int;\n"); @@ -362,9 +446,11 @@ bool GenerateFragmentShaderGLSL(const FShaderID &id, char *buffer, const GLSLSha WRITE(p, "float mymod(float a, float b) { return a - b * floor(a / b); }\n"); } - if (compat.shaderLanguage == HLSL_D3D11 || compat.shaderLanguage == HLSL_D3D9) { + if (compat.shaderLanguage == HLSL_D3D11) { WRITE(p, "PS_OUT main( PS_IN In ) {\n"); - WRITE(p, " PS_OUT outfragment;\n"); + WRITE(p, " PS_OUT outfragment;\n"); + } else if (compat.shaderLanguage == HLSL_D3D9) { + WRITE(p, "vec4 main( PS_IN In ) : COLOR {\n"); } else { WRITE(p, "void main() {\n"); } @@ -433,13 +519,19 @@ bool GenerateFragmentShaderGLSL(const FShaderID &id, char *buffer, const GLSLSha } else { WRITE(p, " vec4 t = tex.Sample(samp, %s.xy)%s;\n", texcoord.c_str(), bgraTexture ? ".bgra" : ""); } + } else if (compat.shaderLanguage == HLSL_D3D9) { + if (doTextureProjection) { + WRITE(p, " vec4 t = tex2Dproj(tex, vec4(v_texcoord.x, v_texcoord.y, 0, v_texcoord.z))%s;\n", bgraTexture ? ".bgra" : ""); + } else { + WRITE(p, " vec4 t = tex2D(tex, %s.xy)%s;\n", texcoord.c_str(), bgraTexture ? ".bgra" : ""); + } } else { if (doTextureProjection) { WRITE(p, " vec4 t = %sProj(tex, %s);\n", compat.texture, texcoord.c_str()); } else { WRITE(p, " vec4 t = %s(tex, %s.xy);\n", compat.texture, texcoord.c_str()); } - } + } } else { if (doTextureProjection) { // We don't use textureProj because we need better control and it's probably not much of a savings anyway. @@ -918,12 +1010,14 @@ bool GenerateFragmentShaderGLSL(const FShaderID &id, char *buffer, const GLSLSha if (stencilToAlpha == REPLACE_ALPHA_DUALSOURCE) { WRITE(p, " %s = vec4(v.rgb, %s);\n", compat.fragColor0, replacedAlpha.c_str()); WRITE(p, " %s = vec4(0.0, 0.0, 0.0, v.a);\n", compat.fragColor1); - } else { + } else if (compat.shaderLanguage != HLSL_D3D9) { WRITE(p, " %s = v;\n", compat.fragColor0); } - if (compat.shaderLanguage == HLSL_D3D11 || compat.shaderLanguage == HLSL_D3D9) { + if (compat.shaderLanguage == HLSL_D3D11) { WRITE(p, " return outfragment;\n"); + } else if (compat.shaderLanguage == HLSL_D3D9) { + WRITE(p, " return v;\n"); } WRITE(p, "}\n"); diff --git a/GPU/GLES/FragmentShaderGeneratorGLES.h b/GPU/GLES/FragmentShaderGeneratorGLES.h index fde1158e93..a4c743ca04 100644 --- a/GPU/GLES/FragmentShaderGeneratorGLES.h +++ b/GPU/GLES/FragmentShaderGeneratorGLES.h @@ -21,4 +21,22 @@ struct FShaderID; +// D3D9 constants + + +#define CONST_PS_TEXENV 0 +#define CONST_PS_ALPHACOLORREF 1 +#define CONST_PS_ALPHACOLORMASK 2 +#define CONST_PS_FOGCOLOR 3 +#define CONST_PS_STENCILREPLACE 4 +#define CONST_PS_BLENDFIXA 5 +#define CONST_PS_BLENDFIXB 6 +#define CONST_PS_FBOTEXSIZE 7 +#define CONST_PS_TEXCLAMP 8 +#define CONST_PS_TEXCLAMPOFF 9 + +// For stencil upload +#define CONST_PS_STENCILVALUE 10 + + bool GenerateFragmentShaderGLSL(const FShaderID &id, char *buffer, const GLSLShaderCompat &compat, uint64_t *uniformMask, std::string *errorString); diff --git a/GPU/GLES/VertexShaderGeneratorGLES.cpp b/GPU/GLES/VertexShaderGeneratorGLES.cpp index 76faa4af05..b4c3a6d160 100644 --- a/GPU/GLES/VertexShaderGeneratorGLES.cpp +++ b/GPU/GLES/VertexShaderGeneratorGLES.cpp @@ -132,7 +132,7 @@ bool GenerateVertexShaderGLSL(const VShaderID &id, char *buffer, const GLSLShade if (compat.gles) { WRITE(p, "precision highp float;\n"); - } else if (!compat.shaderLanguage == GLSL_VULKAN) { + } else if (compat.shaderLanguage != GLSL_VULKAN) { WRITE(p, "#define lowp\n"); WRITE(p, "#define mediump\n"); WRITE(p, "#define highp\n"); diff --git a/unittest/TestShaderGenerators.cpp b/unittest/TestShaderGenerators.cpp index 4008d75606..e14ee6465d 100644 --- a/unittest/TestShaderGenerators.cpp +++ b/unittest/TestShaderGenerators.cpp @@ -4,6 +4,7 @@ #include "GPU/Common/ShaderId.h" #include "GPU/Common/ShaderCommon.h" +#include "GPU/Common/GPUStateUtils.h" #include "Common/Data/Random/Rng.h" #include "GPU/Vulkan/VulkanContext.h" @@ -147,7 +148,7 @@ void PrintDiff(const char *a, const char *b) { printf("a: %s\n", a_lines[i].c_str()); printf("b: %s\n", b_lines[i].c_str()); printf("...continues...\n"); - for (size_t j = i + 1; j < i + 5 && j < a_lines.size(); j++) { + for (size_t j = i + 1; j < i + 5 && j < a_lines.size() && j < b_lines.size(); j++) { printf("a: %s\n", a_lines[j].c_str()); printf("b: %s\n", b_lines[j].c_str()); } @@ -196,6 +197,10 @@ bool TestShaderGenerators() { id.SetBit(FS_BIT_NO_DEPTH_CANNOT_DISCARD_STENCIL, false); id.SetBit(FS_BIT_SHADER_DEPAL, false); + // DX9 disabling: + if (static_cast(id.Bits(FS_BIT_STENCIL_TO_ALPHA, 2)) == ReplaceAlphaType::REPLACE_ALPHA_DUALSOURCE) + continue; + bool generateSuccess[numLanguages]{}; std::string genErrorString[numLanguages]; From a2ed609e909507d9a4df5b76c8bf3b016bf9cb90 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Fri, 30 Oct 2020 18:41:54 +0100 Subject: [PATCH 140/275] HLSL fix --- GPU/Directx9/FragmentShaderGeneratorHLSL.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/GPU/Directx9/FragmentShaderGeneratorHLSL.cpp b/GPU/Directx9/FragmentShaderGeneratorHLSL.cpp index b109988234..9cb577c94a 100644 --- a/GPU/Directx9/FragmentShaderGeneratorHLSL.cpp +++ b/GPU/Directx9/FragmentShaderGeneratorHLSL.cpp @@ -98,7 +98,7 @@ bool GenerateFragmentShaderHLSL(const FShaderID &id, char *buffer, ShaderLanguag WRITE(p, "float3 u_blendFixB : register(c%i);\n", CONST_PS_BLENDFIXB); } } - if (gstate_c.needShaderTexClamp && doTexture) { + if (needShaderTexClamp && doTexture) { WRITE(p, "vec4 u_texclamp : register(c%i);\n", CONST_PS_TEXCLAMP); if (textureAtOffset) { WRITE(p, "vec2 u_texclampoff : register(c%i);\n", CONST_PS_TEXCLAMPOFF); @@ -238,7 +238,7 @@ bool GenerateFragmentShaderHLSL(const FShaderID &id, char *buffer, ShaderLanguag } } else { if (doTextureProjection) { - WRITE(p, " vec4 t = tex2Dproj(tex, vec4(v_texcoord.x, v_texcoord.y, 0, v_texcoord.z))%s;\n", bgraTexture ? ".bgra" : ""); + WRITE(p, " vec4 t = tex2Dproj(tex, vec4(In.v_texcoord.x, In.v_texcoord.y, 0, In.v_texcoord.z))%s;\n", bgraTexture ? ".bgra" : ""); } else { WRITE(p, " vec4 t = tex2D(tex, %s.xy)%s;\n", texcoord, bgraTexture ? ".bgra" : ""); } From 44c57d87f47aec9e31f0b0f8329b327a47ac2577 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Fri, 30 Oct 2020 18:49:50 +0100 Subject: [PATCH 141/275] Get D3D9 fragment shader generation to parity --- GPU/Common/ShaderCommon.cpp | 2 +- GPU/GLES/FragmentShaderGeneratorGLES.cpp | 11 ++++++++--- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/GPU/Common/ShaderCommon.cpp b/GPU/Common/ShaderCommon.cpp index e53a7d37f4..aa433a191a 100644 --- a/GPU/Common/ShaderCommon.cpp +++ b/GPU/Common/ShaderCommon.cpp @@ -130,7 +130,7 @@ void GLSLShaderCompat::SetupForShaderLanguage(ShaderLanguage lang) { varying_fs = "in"; varying_vs = "out"; attribute = "in"; - bitwiseOps = true; + bitwiseOps = lang == HLSL_D3D11; framebufferFetchExtension = nullptr; gles = false; glslES30 = true; diff --git a/GPU/GLES/FragmentShaderGeneratorGLES.cpp b/GPU/GLES/FragmentShaderGeneratorGLES.cpp index fdb795f6c6..101a2af019 100644 --- a/GPU/GLES/FragmentShaderGeneratorGLES.cpp +++ b/GPU/GLES/FragmentShaderGeneratorGLES.cpp @@ -218,7 +218,7 @@ bool GenerateFragmentShaderGLSL(const FShaderID &id, char *buffer, const GLSLSha WRITE(p, "float3 u_blendFixB : register(c%i);\n", CONST_PS_BLENDFIXB); } } - if (gstate_c.needShaderTexClamp && doTexture) { + if (needShaderTexClamp && doTexture) { WRITE(p, "vec4 u_texclamp : register(c%i);\n", CONST_PS_TEXCLAMP); if (textureAtOffset) { WRITE(p, "vec2 u_texclampoff : register(c%i);\n", CONST_PS_TEXCLAMPOFF); @@ -311,7 +311,7 @@ bool GenerateFragmentShaderGLSL(const FShaderID &id, char *buffer, const GLSLSha WRITE(p, "float3 u_blendFixB : register(c%i);\n", CONST_PS_BLENDFIXB); } } - if (gstate_c.needShaderTexClamp && doTexture) { + if (needShaderTexClamp && doTexture) { WRITE(p, "vec4 u_texclamp : register(c%i);\n", CONST_PS_TEXCLAMP); if (textureAtOffset) { WRITE(p, "vec2 u_texclampoff : register(c%i);\n", CONST_PS_TEXCLAMPOFF); @@ -521,7 +521,7 @@ bool GenerateFragmentShaderGLSL(const FShaderID &id, char *buffer, const GLSLSha } } else if (compat.shaderLanguage == HLSL_D3D9) { if (doTextureProjection) { - WRITE(p, " vec4 t = tex2Dproj(tex, vec4(v_texcoord.x, v_texcoord.y, 0, v_texcoord.z))%s;\n", bgraTexture ? ".bgra" : ""); + WRITE(p, " vec4 t = tex2Dproj(tex, vec4(%sv_texcoord.x, %sv_texcoord.y, 0, %sv_texcoord.z))%s;\n", compat.inPrefix, compat.inPrefix, compat.inPrefix, bgraTexture ? ".bgra" : ""); } else { WRITE(p, " vec4 t = tex2D(tex, %s.xy)%s;\n", texcoord.c_str(), bgraTexture ? ".bgra" : ""); } @@ -785,6 +785,11 @@ bool GenerateFragmentShaderGLSL(const FShaderID &id, char *buffer, const GLSLSha WRITE(p, " uvec3 colorTestRef = u_alphacolorref.rgb & u_alphacolormask.rgb;\n"); // We have to test the components separately, or we get incorrect results. See #10629. WRITE(p, " if (v_masked.r %s colorTestRef.r && v_masked.g %s colorTestRef.g && v_masked.b %s colorTestRef.b) %s\n", test, test, test, discardStatement); + } else if (compat.shaderLanguage == HLSL_D3D9) { + const char *test = colorTestFuncs[colorTestFunc]; + // TODO: Use a texture to lookup bitwise ops instead? + WRITE(p, " vec3 colortest = roundAndScaleTo255v(v.rgb);\n"); + WRITE(p, " if ((colortest.r %s u_alphacolorref.r) && (colortest.g %s u_alphacolorref.g) && (colortest.b %s u_alphacolorref.b)) %s\n", test, test, test, discardStatement); } else if (compat.bitwiseOps) { // Apparently GLES3 does not support vector bitwise ops. WRITE(p, " ivec3 v_scaled = roundAndScaleTo255iv(v.rgb);\n"); From b7d674411e9f5e29218047d4095ff25ecdfba19e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Fri, 30 Oct 2020 23:29:18 +0100 Subject: [PATCH 142/275] Test parsing of generated OpenGL shaders too (by using glslang). --- Common/GPU/Vulkan/VulkanContext.cpp | 35 ++++++++++--- Common/GPU/Vulkan/VulkanContext.h | 9 +++- Common/GPU/Vulkan/thin3d_vulkan.cpp | 4 +- GPU/Common/ShaderCommon.cpp | 36 ++++++++++++- GPU/Common/ShaderCommon.h | 36 ++++++------- GPU/Directx9/ShaderManagerDX9.cpp | 2 +- GPU/GLES/ShaderManagerGLES.cpp | 14 +----- GPU/GLES/ShaderManagerGLES.h | 8 +-- GPU/GLES/VertexShaderGeneratorGLES.cpp | 4 +- GPU/Software/SoftGpu.cpp | 2 +- GPU/Vulkan/ShaderManagerVulkan.cpp | 8 ++- GPU/Vulkan/ShaderManagerVulkan.h | 6 +-- GPU/Vulkan/VulkanUtil.cpp | 2 +- unittest/TestShaderGenerators.cpp | 70 ++++++++++++-------------- 14 files changed, 138 insertions(+), 98 deletions(-) diff --git a/Common/GPU/Vulkan/VulkanContext.cpp b/Common/GPU/Vulkan/VulkanContext.cpp index 4c715d289f..bf77c2720f 100644 --- a/Common/GPU/Vulkan/VulkanContext.cpp +++ b/Common/GPU/Vulkan/VulkanContext.cpp @@ -1177,24 +1177,43 @@ EShLanguage FindLanguage(const VkShaderStageFlagBits shader_type) { // Compile a given string containing GLSL into SPV for use by VK // Return value of false means an error was encountered. -bool GLSLtoSPV(const VkShaderStageFlagBits shader_type, - const char *pshader, - std::vector &spirv, std::string *errorMessage) { +bool GLSLtoSPV(const VkShaderStageFlagBits shader_type, const char *sourceCode, GLSLVariant variant, + std::vector &spirv, std::string *errorMessage) { glslang::TProgram program; const char *shaderStrings[1]; - EProfile profile = ECoreProfile; - int defaultVersion = 450; TBuiltInResource Resources; init_resources(Resources); - // Enable SPIR-V and Vulkan rules when parsing GLSL - EShMessages messages = (EShMessages)(EShMsgSpvRules | EShMsgVulkanRules); + int defaultVersion; + EShMessages messages; + EProfile profile; + + switch (variant) { + case GLSLVariant::VULKAN: + // Enable SPIR-V and Vulkan rules when parsing GLSL + messages = (EShMessages)(EShMsgSpvRules | EShMsgVulkanRules); + defaultVersion = 450; + profile = ECoreProfile; + break; + case GLSLVariant::GL140: + messages = (EShMessages)(EShMsgDefault); + defaultVersion = 140; + profile = ECompatibilityProfile; + break; + case GLSLVariant::GLES300: + messages = (EShMessages)(EShMsgDefault); + defaultVersion = 300; + profile = EEsProfile; + break; + default: + return false; + } EShLanguage stage = FindLanguage(shader_type); glslang::TShader shader(stage); - shaderStrings[0] = pshader; + shaderStrings[0] = sourceCode; shader.setStrings(shaderStrings, 1); if (!shader.parse(&Resources, defaultVersion, profile, false, true, messages)) { diff --git a/Common/GPU/Vulkan/VulkanContext.h b/Common/GPU/Vulkan/VulkanContext.h index db467eff93..3798066c65 100644 --- a/Common/GPU/Vulkan/VulkanContext.h +++ b/Common/GPU/Vulkan/VulkanContext.h @@ -367,7 +367,14 @@ void TransitionImageLayout2(VkCommandBuffer cmd, VkImage image, int baseMip, int // GLSL compiler void init_glslang(); void finalize_glslang(); -bool GLSLtoSPV(const VkShaderStageFlagBits shader_type, const char *pshader, std::vector &spirv, std::string *errorMessage = nullptr); + +enum class GLSLVariant { + VULKAN, + GL140, + GLES300, +}; + +bool GLSLtoSPV(const VkShaderStageFlagBits shader_type, const char *sourceCode, GLSLVariant variant, std::vector &spirv, std::string *errorMessage); const char *VulkanResultToString(VkResult res); std::string FormatDriverVersion(const VkPhysicalDeviceProperties &props); diff --git a/Common/GPU/Vulkan/thin3d_vulkan.cpp b/Common/GPU/Vulkan/thin3d_vulkan.cpp index a27ebec428..d097e283f2 100644 --- a/Common/GPU/Vulkan/thin3d_vulkan.cpp +++ b/Common/GPU/Vulkan/thin3d_vulkan.cpp @@ -215,7 +215,9 @@ bool VKShaderModule::Compile(VulkanContext *vulkan, ShaderLanguage language, con // We'll need this to free it later. source_ = (const char *)data; std::vector spirv; - if (!GLSLtoSPV(vkstage_, source_.c_str(), spirv)) { + std::string errorMessage; + if (!GLSLtoSPV(vkstage_, source_.c_str(), GLSLVariant::VULKAN, spirv, &errorMessage)) { + INFO_LOG(G3D, "Shader compile to module failed: %s", errorMessage.c_str()); return false; } diff --git a/GPU/Common/ShaderCommon.cpp b/GPU/Common/ShaderCommon.cpp index aa433a191a..7decf40746 100644 --- a/GPU/Common/ShaderCommon.cpp +++ b/GPU/Common/ShaderCommon.cpp @@ -2,7 +2,6 @@ #undef new #endif - #include "ext/glslang/SPIRV/GlslangToSpv.h" #include "ShaderCommon.h" @@ -102,9 +101,42 @@ void init_resources(TBuiltInResource &Resources) { Resources.limits.generalConstantMatrixVectorIndexing = 1; } -void GLSLShaderCompat::SetupForShaderLanguage(ShaderLanguage lang) { +GLSLShaderCompat::GLSLShaderCompat(ShaderLanguage lang) { shaderLanguage = lang; switch (lang) { + case GLSL_140: + // Just used in the shader test, and as a basis for the others in DetectShaderLanguage. + glslVersionNumber = 110; + attribute = "attribute"; + varying_vs = "varying"; + varying_fs = "varying"; + fragColor0 = "gl_FragColor"; + fragColor1 = "fragColor1"; + texture = "texture2D"; + texelFetch = nullptr; + bitwiseOps = false; + lastFragData = nullptr; + gles = false; + forceMatrix4x4 = true; + break; + case GLSL_300: + // Just used in the shader test. + glslVersionNumber = 300; // GLSL ES 3.0 + varying_vs = "out"; + varying_fs = "in"; + attribute = "in"; + fragColor0 = "fragColor0"; + fragColor1 = "fragColor1"; + texture = "texture"; + texelFetch = nullptr; + bitwiseOps = false; + lastFragData = nullptr; + gles = false; + forceMatrix4x4 = true; + glslES30 = true; + bitwiseOps = true; + texelFetch = "texelFetch"; + break; case GLSL_VULKAN: fragColor0 = "fragColor0"; fragColor1 = "fragColor1"; diff --git a/GPU/Common/ShaderCommon.h b/GPU/Common/ShaderCommon.h index b5be554346..9ca974cd2e 100644 --- a/GPU/Common/ShaderCommon.h +++ b/GPU/Common/ShaderCommon.h @@ -146,25 +146,25 @@ enum DoLightComputation { }; struct GLSLShaderCompat { - int glslVersionNumber; - ShaderLanguage shaderLanguage; - bool gles; - const char *varying_fs; - const char *varying_vs; - const char *attribute; - const char *fragColor0; - const char *fragColor1; - const char *texture; - const char *texelFetch; - const char *lastFragData; - const char *framebufferFetchExtension; - const char *inPrefix = ""; - bool glslES30; - bool bitwiseOps; - bool forceMatrix4x4; - bool coefsFromBuffers; + explicit GLSLShaderCompat(ShaderLanguage lang); - void SetupForShaderLanguage(ShaderLanguage lang); + int glslVersionNumber = 0; + ShaderLanguage shaderLanguage; + bool gles = false; + const char *varying_fs = nullptr; + const char *varying_vs = nullptr; + const char *attribute = nullptr; + const char *fragColor0 = nullptr; + const char *fragColor1 = nullptr; + const char *texture = nullptr; + const char *texelFetch = nullptr; + const char *lastFragData = nullptr; + const char *framebufferFetchExtension = nullptr; + const char *inPrefix = ""; + bool glslES30 = false; + bool bitwiseOps = false; + bool forceMatrix4x4 = false; + bool coefsFromBuffers = false; }; // PSP vertex format. diff --git a/GPU/Directx9/ShaderManagerDX9.cpp b/GPU/Directx9/ShaderManagerDX9.cpp index ee6f75a600..efee2d57e2 100644 --- a/GPU/Directx9/ShaderManagerDX9.cpp +++ b/GPU/Directx9/ShaderManagerDX9.cpp @@ -16,7 +16,7 @@ // https://github.com/hrydgard/ppsspp and http://www.ppsspp.org/. #ifdef _WIN32 -#define SHADERLOG +//#define SHADERLOG #endif #include diff --git a/GPU/GLES/ShaderManagerGLES.cpp b/GPU/GLES/ShaderManagerGLES.cpp index 887eade3ec..c1303a1c29 100644 --- a/GPU/GLES/ShaderManagerGLES.cpp +++ b/GPU/GLES/ShaderManagerGLES.cpp @@ -571,7 +571,7 @@ void LinkedShader::UpdateUniforms(u32 vertType, const ShaderID &vsid, bool useBu } ShaderManagerGLES::ShaderManagerGLES(Draw::DrawContext *draw) - : ShaderManagerCommon(draw), lastShader_(nullptr), shaderSwitchDirtyUniforms_(0), diskCacheDirty_(false), fsCache_(16), vsCache_(16) { + : ShaderManagerCommon(draw), compat_(GLSL_140), fsCache_(16), vsCache_(16) { render_ = (GLRenderManager *)draw->GetNativeObject(Draw::NativeObject::RENDER_MANAGER); codeBuffer_ = new char[16384]; lastFSID_.set_invalid(); @@ -585,18 +585,8 @@ ShaderManagerGLES::~ShaderManagerGLES() { void ShaderManagerGLES::DetectShaderLanguage() { GLSLShaderCompat &compat = compat_; - compat.shaderLanguage = ShaderLanguage::GLSL_140; - compat.attribute = "attribute"; - compat.varying_vs = "varying"; - compat.varying_fs = "varying"; - compat.fragColor0 = "gl_FragColor"; - compat.fragColor1 = "fragColor1"; - compat.texture = "texture2D"; - compat.texelFetch = nullptr; - compat.bitwiseOps = false; - compat.lastFragData = nullptr; + compat.gles = gl_extensions.IsGLES; - compat.forceMatrix4x4 = true; if (compat.gles) { if (gstate_c.Supports(GPU_SUPPORTS_GLSL_ES_300)) { diff --git a/GPU/GLES/ShaderManagerGLES.h b/GPU/GLES/ShaderManagerGLES.h index c1c968dc76..8a636db49e 100644 --- a/GPU/GLES/ShaderManagerGLES.h +++ b/GPU/GLES/ShaderManagerGLES.h @@ -196,7 +196,7 @@ private: typedef std::vector LinkedShaderCache; GLRenderManager *render_; - GLSLShaderCompat compat_{}; + GLSLShaderCompat compat_; LinkedShaderCache linkedShaderCache_; bool lastVShaderSame_; @@ -204,8 +204,8 @@ private: FShaderID lastFSID_; VShaderID lastVSID_; - LinkedShader *lastShader_; - u64 shaderSwitchDirtyUniforms_; + LinkedShader *lastShader_ = nullptr; + u64 shaderSwitchDirtyUniforms_ = 0; char *codeBuffer_; typedef DenseHashMap FSCache; @@ -214,7 +214,7 @@ private: typedef DenseHashMap VSCache; VSCache vsCache_; - bool diskCacheDirty_; + bool diskCacheDirty_ = false; struct { std::vector vert; std::vector frag; diff --git a/GPU/GLES/VertexShaderGeneratorGLES.cpp b/GPU/GLES/VertexShaderGeneratorGLES.cpp index b4c3a6d160..885afed9e2 100644 --- a/GPU/GLES/VertexShaderGeneratorGLES.cpp +++ b/GPU/GLES/VertexShaderGeneratorGLES.cpp @@ -99,7 +99,7 @@ static const char * const boneWeightDecl[9] = { "layout(location = 3) in vec4 w1;\nlayout(location = 4) in vec4 w2;\n", }; -static const char *vulkan_glsl_preamble = +const char *vulkan_glsl_preamble_vs = "#version 450\n" "#extension GL_ARB_separate_shader_objects : enable\n" "#extension GL_ARB_shading_language_420pack : enable\n" @@ -114,7 +114,7 @@ bool GenerateVertexShaderGLSL(const VShaderID &id, char *buffer, const GLSLShade char *p = buffer; if (compat.shaderLanguage == GLSL_VULKAN) { - WRITE(p, "%s", vulkan_glsl_preamble); + WRITE(p, "%s", vulkan_glsl_preamble_vs); } else { if (compat.gles) { // PowerVR needs highp to do the fog in MHU correctly. diff --git a/GPU/Software/SoftGpu.cpp b/GPU/Software/SoftGpu.cpp index f5c53b7bbb..26453819f9 100644 --- a/GPU/Software/SoftGpu.cpp +++ b/GPU/Software/SoftGpu.cpp @@ -76,7 +76,7 @@ SoftGPU::SoftGPU(GraphicsContext *gfxCtx, Draw::DrawContext *draw) break; case GPUBackend::DIRECT3D9: ShaderTranslationInit(); - presentation_->SetLanguage(HLSL_DX9); + presentation_->SetLanguage(HLSL_D3D9); break; case GPUBackend::DIRECT3D11: ShaderTranslationInit(); diff --git a/GPU/Vulkan/ShaderManagerVulkan.cpp b/GPU/Vulkan/ShaderManagerVulkan.cpp index 6503aa3b1f..3c7c84904f 100644 --- a/GPU/Vulkan/ShaderManagerVulkan.cpp +++ b/GPU/Vulkan/ShaderManagerVulkan.cpp @@ -53,7 +53,7 @@ VulkanFragmentShader::VulkanFragmentShader(VulkanContext *vulkan, FShaderID id, OutputDebugStringA(LineNumberString(code).c_str()); #endif - bool success = GLSLtoSPV(VK_SHADER_STAGE_FRAGMENT_BIT, code, spirv, &errorMessage); + bool success = GLSLtoSPV(VK_SHADER_STAGE_FRAGMENT_BIT, code, GLSLVariant::VULKAN, spirv, &errorMessage); if (!errorMessage.empty()) { if (success) { ERROR_LOG(G3D, "Warnings in shader compilation!"); @@ -109,7 +109,7 @@ VulkanVertexShader::VulkanVertexShader(VulkanContext *vulkan, VShaderID id, cons #ifdef SHADERLOG OutputDebugStringA(LineNumberString(code).c_str()); #endif - bool success = GLSLtoSPV(VK_SHADER_STAGE_VERTEX_BIT, code, spirv, &errorMessage); + bool success = GLSLtoSPV(VK_SHADER_STAGE_VERTEX_BIT, code, GLSLVariant::VULKAN, spirv, &errorMessage); if (!errorMessage.empty()) { if (success) { ERROR_LOG(G3D, "Warnings in shader compilation!"); @@ -158,7 +158,7 @@ std::string VulkanVertexShader::GetShaderString(DebugShaderStringType type) cons } ShaderManagerVulkan::ShaderManagerVulkan(Draw::DrawContext *draw, VulkanContext *vulkan) - : ShaderManagerCommon(draw), vulkan_(vulkan), lastVShader_(nullptr), lastFShader_(nullptr), fsCache_(16), vsCache_(16) { + : ShaderManagerCommon(draw), vulkan_(vulkan), compat_(GLSL_VULKAN), fsCache_(16), vsCache_(16) { codeBuffer_ = new char[16384]; uboAlignment_ = vulkan_->GetPhysicalDeviceProperties().properties.limits.minUniformBufferOffsetAlignment; memset(&ub_base, 0, sizeof(ub_base)); @@ -168,8 +168,6 @@ ShaderManagerVulkan::ShaderManagerVulkan(Draw::DrawContext *draw, VulkanContext static_assert(sizeof(ub_base) <= 512, "ub_base grew too big"); static_assert(sizeof(ub_lights) <= 512, "ub_lights grew too big"); static_assert(sizeof(ub_bones) <= 384, "ub_bones grew too big"); - - compat_.SetupForShaderLanguage(ShaderLanguage::GLSL_VULKAN); } ShaderManagerVulkan::~ShaderManagerVulkan() { diff --git a/GPU/Vulkan/ShaderManagerVulkan.h b/GPU/Vulkan/ShaderManagerVulkan.h index 874cd698dd..a030422ba2 100644 --- a/GPU/Vulkan/ShaderManagerVulkan.h +++ b/GPU/Vulkan/ShaderManagerVulkan.h @@ -131,7 +131,7 @@ private: void Clear(); VulkanContext *vulkan_; - GLSLShaderCompat compat_{}; + GLSLShaderCompat compat_; typedef DenseHashMap FSCache; FSCache fsCache_; @@ -147,8 +147,8 @@ private: UB_VS_Lights ub_lights; UB_VS_Bones ub_bones; - VulkanFragmentShader *lastFShader_; - VulkanVertexShader *lastVShader_; + VulkanFragmentShader *lastFShader_ = nullptr; + VulkanVertexShader *lastVShader_ = nullptr; FShaderID lastFSID_; VShaderID lastVSID_; diff --git a/GPU/Vulkan/VulkanUtil.cpp b/GPU/Vulkan/VulkanUtil.cpp index bb39dff229..fa2deab322 100644 --- a/GPU/Vulkan/VulkanUtil.cpp +++ b/GPU/Vulkan/VulkanUtil.cpp @@ -368,7 +368,7 @@ VkPipeline Vulkan2D::GetPipeline(VkRenderPass rp, VkShaderModule vs, VkShaderMod VkShaderModule CompileShaderModule(VulkanContext *vulkan, VkShaderStageFlagBits stage, const char *code, std::string *error) { std::vector spirv; - bool success = GLSLtoSPV(stage, code, spirv, error); + bool success = GLSLtoSPV(stage, code, GLSLVariant::VULKAN, spirv, error); if (!error->empty()) { if (success) { ERROR_LOG(G3D, "Warnings in shader compilation!"); diff --git a/unittest/TestShaderGenerators.cpp b/unittest/TestShaderGenerators.cpp index e14ee6465d..c7691ce270 100644 --- a/unittest/TestShaderGenerators.cpp +++ b/unittest/TestShaderGenerators.cpp @@ -22,6 +22,7 @@ #include "GPU/D3D9/D3D9ShaderCompiler.h" bool GenerateFShader(FShaderID id, char *buffer, ShaderLanguage lang, std::string *errorString) { + uint64_t uniformMask; switch (lang) { case ShaderLanguage::HLSL_D3D11: return GenerateFragmentShaderHLSL(id, buffer, ShaderLanguage::HLSL_D3D11, errorString); @@ -29,27 +30,29 @@ bool GenerateFShader(FShaderID id, char *buffer, ShaderLanguage lang, std::strin return GenerateFragmentShaderHLSL(id, buffer, ShaderLanguage::HLSL_D3D9, errorString); case ShaderLanguage::GLSL_VULKAN: { - GLSLShaderCompat compat{}; - compat.SetupForShaderLanguage(ShaderLanguage::GLSL_VULKAN); - uint64_t uniformMask; + GLSLShaderCompat compat(ShaderLanguage::GLSL_VULKAN); return GenerateFragmentShaderGLSL(id, buffer, compat, &uniformMask, errorString); } case ShaderLanguage::GLSL_140: + { + GLSLShaderCompat compat(ShaderLanguage::GLSL_140); + return GenerateFragmentShaderGLSL(id, buffer, compat, &uniformMask, errorString); + } + case ShaderLanguage::GLSL_300: - // TODO: Need a device - except that maybe glslang could be used to verify these .... - return false; + { + GLSLShaderCompat compat(ShaderLanguage::GLSL_140); + return GenerateFragmentShaderGLSL(id, buffer, compat, &uniformMask, errorString); + } + case ShaderLanguage::HLSL_D3D9_TEST: { - GLSLShaderCompat compat{}; - compat.SetupForShaderLanguage(ShaderLanguage::HLSL_D3D9); - uint64_t uniformMask; + GLSLShaderCompat compat(ShaderLanguage::HLSL_D3D9); return GenerateFragmentShaderGLSL(id, buffer, compat, &uniformMask, errorString); } case ShaderLanguage::HLSL_D3D11_TEST: { - GLSLShaderCompat compat{}; - compat.SetupForShaderLanguage(ShaderLanguage::HLSL_D3D11); - uint64_t uniformMask; + GLSLShaderCompat compat(ShaderLanguage::HLSL_D3D11); return GenerateFragmentShaderGLSL(id, buffer, compat, &uniformMask, errorString); } default: @@ -58,34 +61,26 @@ bool GenerateFShader(FShaderID id, char *buffer, ShaderLanguage lang, std::strin } bool GenerateVShader(VShaderID id, char *buffer, ShaderLanguage lang, std::string *errorString) { + uint32_t attrMask; + uint64_t uniformMask; switch (lang) { case ShaderLanguage::HLSL_D3D11: return GenerateVertexShaderHLSL(id, buffer, ShaderLanguage::HLSL_D3D11, errorString); case ShaderLanguage::HLSL_D3D9: return GenerateVertexShaderHLSL(id, buffer, ShaderLanguage::HLSL_D3D9, errorString); - // return DX9::GenerateFragmentShaderHLSL(id, buffer, ShaderLanguage::HLSL_D3D9); case ShaderLanguage::GLSL_VULKAN: { - GLSLShaderCompat compat{}; - compat.SetupForShaderLanguage(ShaderLanguage::GLSL_VULKAN); - uint32_t attrMask; - uint64_t uniformMask; + GLSLShaderCompat compat(ShaderLanguage::GLSL_VULKAN); return GenerateVertexShaderGLSL(id, buffer, compat, &attrMask, &uniformMask, errorString); } case ShaderLanguage::HLSL_D3D9_TEST: { - GLSLShaderCompat compat{}; - compat.SetupForShaderLanguage(ShaderLanguage::HLSL_D3D9); - uint32_t attrMask; - uint64_t uniformMask; + GLSLShaderCompat compat(ShaderLanguage::HLSL_D3D9); return GenerateVertexShaderGLSL(id, buffer, compat, &attrMask, &uniformMask, errorString); } case ShaderLanguage::HLSL_D3D11_TEST: { - GLSLShaderCompat compat{}; - compat.SetupForShaderLanguage(ShaderLanguage::HLSL_D3D11); - uint32_t attrMask; - uint64_t uniformMask; + GLSLShaderCompat compat(ShaderLanguage::HLSL_D3D11); return GenerateVertexShaderGLSL(id, buffer, compat, &attrMask, &uniformMask, errorString); } default: @@ -94,6 +89,7 @@ bool GenerateVShader(VShaderID id, char *buffer, ShaderLanguage lang, std::strin } bool TestCompileShader(const char *buffer, ShaderLanguage lang, bool vertex, std::string *errorMessage) { + std::vector spirv; switch (lang) { case ShaderLanguage::HLSL_D3D11: case ShaderLanguage::HLSL_D3D11_TEST: @@ -114,19 +110,11 @@ bool TestCompileShader(const char *buffer, ShaderLanguage lang, bool vertex, std } case ShaderLanguage::GLSL_VULKAN: - { - std::vector spirv; - std::string errorMessage; - bool result = GLSLtoSPV(vertex ? VK_SHADER_STAGE_VERTEX_BIT : VK_SHADER_STAGE_FRAGMENT_BIT, buffer, spirv, &errorMessage); - if (!result) { - printf("GLSLtoSPV ERROR:\n%s\n\n", errorMessage.c_str()); - } - return result; - } + return GLSLtoSPV(vertex ? VK_SHADER_STAGE_VERTEX_BIT : VK_SHADER_STAGE_FRAGMENT_BIT, buffer, GLSLVariant::VULKAN, spirv, errorMessage); case ShaderLanguage::GLSL_140: - return false; + return GLSLtoSPV(vertex ? VK_SHADER_STAGE_VERTEX_BIT : VK_SHADER_STAGE_FRAGMENT_BIT, buffer, GLSLVariant::GL140, spirv, errorMessage); case ShaderLanguage::GLSL_300: - return false; + return GLSLtoSPV(vertex ? VK_SHADER_STAGE_VERTEX_BIT : VK_SHADER_STAGE_FRAGMENT_BIT, buffer, GLSLVariant::GLES300, spirv, errorMessage); default: return false; } @@ -167,8 +155,8 @@ bool TestShaderGenerators() { ShaderLanguage languages[] = { ShaderLanguage::HLSL_D3D9_TEST, ShaderLanguage::HLSL_D3D9, + ShaderLanguage::HLSL_D3D11_TEST, ShaderLanguage::HLSL_D3D11, - ShaderLanguage::HLSL_D3D9, ShaderLanguage::GLSL_VULKAN, ShaderLanguage::GLSL_140, ShaderLanguage::GLSL_300, @@ -213,6 +201,7 @@ bool TestShaderGenerators() { } // KEEPING FOR REUSE LATER: Defunct temporary test. + /* if (generateSuccess[0] != generateSuccess[1]) { printf("mismatching success! %s %s\n", genErrorString[0].c_str(), genErrorString[1].c_str()); printf("%s\n", buffer[0]); @@ -224,7 +213,11 @@ bool TestShaderGenerators() { PrintDiff(buffer[0], buffer[1]); return 1; } - + if (generateSuccess[2] && strcmp(buffer[2], buffer[3])) { + printf("mismatching shaders! a=glsl b=hlsl\n"); + PrintDiff(buffer[2], buffer[3]); + return 1; + }*/ // Now that we have the strings ready for easy comparison (buffer,4 in the watch window), // let's try to compile them. for (int j = 0; j < numLanguages; j++) { @@ -262,7 +255,7 @@ bool TestShaderGenerators() { printf("%s\n", genErrorString[j].c_str()); } } - /* + // KEEPING FOR REUSE LATER: Defunct temporary test: Compare GLSL-in-Vulkan-mode vs Vulkan if (generateSuccess[0] != generateSuccess[1]) { printf("mismatching success! '%s' '%s'\n", genErrorString[0].c_str(), genErrorString[1].c_str()); @@ -275,7 +268,6 @@ bool TestShaderGenerators() { PrintDiff(buffer[0], buffer[1]); return false; } - */ // Now that we have the strings ready for easy comparison (buffer,4 in the watch window), // let's try to compile them. From 8d70fd269e86c79dcece61e38c9e60740da290d0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Fri, 30 Oct 2020 23:58:53 +0100 Subject: [PATCH 143/275] Minor D3D9 fixes --- Common/GPU/D3D9/D3D9ShaderCompiler.cpp | 6 ++++++ GPU/D3D11/FramebufferManagerD3D11.cpp | 2 +- GPU/Directx9/FramebufferManagerDX9.cpp | 2 +- 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/Common/GPU/D3D9/D3D9ShaderCompiler.cpp b/Common/GPU/D3D9/D3D9ShaderCompiler.cpp index 8240dc7587..0a458597ca 100644 --- a/Common/GPU/D3D9/D3D9ShaderCompiler.cpp +++ b/Common/GPU/D3D9/D3D9ShaderCompiler.cpp @@ -7,6 +7,8 @@ #include "Common/GPU/D3D9/D3D9ShaderCompiler.h" #include "Common/CommonFuncs.h" #include "Common/SysError.h" +#include "Common/Log.h" +#include "Common/StringUtils.h" struct ID3DXConstantTable; @@ -29,6 +31,10 @@ LPD3DBLOB CompileShaderToByteCodeD3D9(const char *code, const char *target, std: if (pErrorMsg) { *errorMessage = (CHAR *)pErrorMsg->GetBufferPointer(); + + OutputDebugStringUTF8(LineNumberString(std::string(code)).c_str()); + OutputDebugStringUTF8(errorMessage->c_str()); + pErrorMsg->Release(); } else if (FAILED(hr)) { *errorMessage = GetStringErrorMsg(hr); diff --git a/GPU/D3D11/FramebufferManagerD3D11.cpp b/GPU/D3D11/FramebufferManagerD3D11.cpp index 437fe4922c..92734d5be6 100644 --- a/GPU/D3D11/FramebufferManagerD3D11.cpp +++ b/GPU/D3D11/FramebufferManagerD3D11.cpp @@ -51,7 +51,7 @@ static const char *vscode = "struct VS_IN {\n" " float4 ObjPos : POSITION;\n" " float2 Uv : TEXCOORD0;\n" - "};" + "};\n" "struct VS_OUT {\n" " float2 Uv : TEXCOORD0;\n" " float4 ProjPos : SV_Position;\n" diff --git a/GPU/Directx9/FramebufferManagerDX9.cpp b/GPU/Directx9/FramebufferManagerDX9.cpp index 3bbecb90b3..be182d77f1 100644 --- a/GPU/Directx9/FramebufferManagerDX9.cpp +++ b/GPU/Directx9/FramebufferManagerDX9.cpp @@ -52,7 +52,7 @@ static const char *vscode = R"( struct VS_IN { float4 ObjPos : POSITION; float2 Uv : TEXCOORD0; -};" +}; struct VS_OUT { float4 ProjPos : POSITION; float2 Uv : TEXCOORD0; From d981511459175285710fcb14a1ba740b14dca95f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Sat, 31 Oct 2020 00:09:48 +0100 Subject: [PATCH 144/275] Misc cleanup --- Core/HW/SasAudio.cpp | 10 +--------- Core/HW/SasAudio.h | 18 +++++++++--------- 2 files changed, 10 insertions(+), 18 deletions(-) diff --git a/Core/HW/SasAudio.cpp b/Core/HW/SasAudio.cpp index ea66611e0f..15db6c4d50 100644 --- a/Core/HW/SasAudio.cpp +++ b/Core/HW/SasAudio.cpp @@ -331,15 +331,7 @@ void ADSREnvelope::SetSimpleEnvelope(u32 ADSREnv1, u32 ADSREnv2) { } } -SasInstance::SasInstance() - : maxVoices(PSP_SAS_VOICES_MAX), - sampleRate(44100), - outputMode(PSP_SAS_OUTPUTMODE_MIXED), - mixBuffer(0), - sendBuffer(0), - sendBufferDownsampled(0), - sendBufferProcessed(0), - grainSize(0) { +SasInstance::SasInstance() { #ifdef AUDIO_TO_FILE audioDump = fopen("D:\\audio.raw", "wb"); #endif diff --git a/Core/HW/SasAudio.h b/Core/HW/SasAudio.h index 480250dc70..de883afa36 100644 --- a/Core/HW/SasAudio.h +++ b/Core/HW/SasAudio.h @@ -282,16 +282,16 @@ public: int GetGrainSize() const { return grainSize; } int EstimateMixUs(); - int maxVoices; - int sampleRate; - int outputMode; + int maxVoices = PSP_SAS_VOICES_MAX; + int sampleRate = 44100; + int outputMode = PSP_SAS_OUTPUTMODE_MIXED; - int *mixBuffer; - int *sendBuffer; - s16 *sendBufferDownsampled; - s16 *sendBufferProcessed; + int *mixBuffer = nullptr; + int *sendBuffer = nullptr; + s16 *sendBufferDownsampled = nullptr; + s16 *sendBufferProcessed = nullptr; - FILE *audioDump; + FILE *audioDump = nullptr; void Mix(u32 outAddr, u32 inAddr = 0, int leftVol = 0, int rightVol = 0); void MixVoice(SasVoice &voice); @@ -310,6 +310,6 @@ public: private: SasReverb reverb_; - int grainSize; + int grainSize = 0; int16_t mixTemp_[PSP_SAS_MAX_GRAIN * 4 + 2 + 8]; // some extra margin for very high pitches. }; From cf1a5e2c677801f1139285afca6f5f6b858f8d3d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Sat, 31 Oct 2020 00:10:19 +0100 Subject: [PATCH 145/275] Switch D3D11 over to use the GLSL fragment shader generator --- GPU/D3D11/ShaderManagerD3D11.cpp | 6 +++--- GPU/D3D11/ShaderManagerD3D11.h | 6 ++++-- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/GPU/D3D11/ShaderManagerD3D11.cpp b/GPU/D3D11/ShaderManagerD3D11.cpp index 615fe283ce..2b10f9a7a4 100644 --- a/GPU/D3D11/ShaderManagerD3D11.cpp +++ b/GPU/D3D11/ShaderManagerD3D11.cpp @@ -35,7 +35,6 @@ #include "GPU/GPUState.h" #include "GPU/ge_constants.h" #include "GPU/D3D11/ShaderManagerD3D11.h" -#include "GPU/Directx9/FragmentShaderGeneratorHLSL.h" #include "GPU/Directx9/VertexShaderGeneratorHLSL.h" #include "GPU/D3D11/D3D11Util.h" @@ -90,7 +89,7 @@ std::string D3D11VertexShader::GetShaderString(DebugShaderStringType type) const } ShaderManagerD3D11::ShaderManagerD3D11(Draw::DrawContext *draw, ID3D11Device *device, ID3D11DeviceContext *context, D3D_FEATURE_LEVEL featureLevel) - : ShaderManagerCommon(draw), device_(device), context_(context), featureLevel_(featureLevel), lastVShader_(nullptr), lastFShader_(nullptr) { + : ShaderManagerCommon(draw), device_(device), context_(context), featureLevel_(featureLevel), compat_(ShaderLanguage::HLSL_D3D11) { codeBuffer_ = new char[16384]; memset(&ub_base, 0, sizeof(ub_base)); memset(&ub_lights, 0, sizeof(ub_lights)); @@ -222,7 +221,8 @@ void ShaderManagerD3D11::GetShaders(int prim, u32 vertType, D3D11VertexShader ** if (fsIter == fsCache_.end()) { // Fragment shader not in cache. Let's compile it. std::string genErrorString; - GenerateFragmentShaderHLSL(FSID, codeBuffer_, HLSL_D3D11, &genErrorString); + uint64_t uniformMask; + GenerateFragmentShaderGLSL(FSID, codeBuffer_, compat_, &uniformMask, &genErrorString); fs = new D3D11FragmentShader(device_, featureLevel_, FSID, codeBuffer_, useHWTransform); fsCache_[FSID] = fs; } else { diff --git a/GPU/D3D11/ShaderManagerD3D11.h b/GPU/D3D11/ShaderManagerD3D11.h index abb867a613..43f174cad8 100644 --- a/GPU/D3D11/ShaderManagerD3D11.h +++ b/GPU/D3D11/ShaderManagerD3D11.h @@ -25,6 +25,7 @@ #include "GPU/Common/ShaderCommon.h" #include "GPU/Common/ShaderId.h" #include "GPU/Common/ShaderUniforms.h" +#include "GPU/GLES/FragmentShaderGeneratorGLES.h" class D3D11Context; class D3D11PushBuffer; @@ -109,6 +110,7 @@ private: ID3D11Device *device_; ID3D11DeviceContext *context_; D3D_FEATURE_LEVEL featureLevel_; + GLSLShaderCompat compat_; typedef std::map FSCache; FSCache fsCache_; @@ -128,8 +130,8 @@ private: ID3D11Buffer *push_lights; ID3D11Buffer *push_bones; - D3D11FragmentShader *lastFShader_; - D3D11VertexShader *lastVShader_; + D3D11FragmentShader *lastFShader_ = nullptr; + D3D11VertexShader *lastVShader_ = nullptr; FShaderID lastFSID_; VShaderID lastVSID_; From c311eeaf7dbf648528e287f949cc35eb3323567e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Sat, 31 Oct 2020 00:19:20 +0100 Subject: [PATCH 146/275] Switch D3D9 too to the glsl shader generator --- Common/GPU/D3D9/D3D9ShaderCompiler.cpp | 3 ++- GPU/Directx9/ShaderManagerDX9.cpp | 6 ++++-- GPU/Directx9/ShaderManagerDX9.h | 7 ++++--- 3 files changed, 10 insertions(+), 6 deletions(-) diff --git a/Common/GPU/D3D9/D3D9ShaderCompiler.cpp b/Common/GPU/D3D9/D3D9ShaderCompiler.cpp index 0a458597ca..a46131bda1 100644 --- a/Common/GPU/D3D9/D3D9ShaderCompiler.cpp +++ b/Common/GPU/D3D9/D3D9ShaderCompiler.cpp @@ -30,12 +30,13 @@ LPD3DBLOB CompileShaderToByteCodeD3D9(const char *code, const char *target, std: &pErrorMsg); if (pErrorMsg) { - *errorMessage = (CHAR *)pErrorMsg->GetBufferPointer(); + *errorMessage = std::string((CHAR *)pErrorMsg->GetBufferPointer()); OutputDebugStringUTF8(LineNumberString(std::string(code)).c_str()); OutputDebugStringUTF8(errorMessage->c_str()); pErrorMsg->Release(); + pShaderCode = nullptr; } else if (FAILED(hr)) { *errorMessage = GetStringErrorMsg(hr); if (pShaderCode) { diff --git a/GPU/Directx9/ShaderManagerDX9.cpp b/GPU/Directx9/ShaderManagerDX9.cpp index efee2d57e2..4b78d25860 100644 --- a/GPU/Directx9/ShaderManagerDX9.cpp +++ b/GPU/Directx9/ShaderManagerDX9.cpp @@ -41,6 +41,7 @@ #include "GPU/GPUState.h" #include "GPU/ge_constants.h" #include "GPU/Common/ShaderUniforms.h" +#include "GPU/GLES/FragmentShaderGeneratorGLES.h" #include "GPU/Directx9/ShaderManagerDX9.h" #include "GPU/Directx9/DrawEngineDX9.h" #include "GPU/Directx9/FramebufferManagerDX9.h" @@ -510,7 +511,7 @@ void ShaderManagerDX9::VSUpdateUniforms(u64 dirtyUniforms) { } ShaderManagerDX9::ShaderManagerDX9(Draw::DrawContext *draw, LPDIRECT3DDEVICE9 device) - : ShaderManagerCommon(draw), device_(device), lastVShader_(nullptr), lastPShader_(nullptr) { + : ShaderManagerCommon(draw), device_(device), compat_(HLSL_D3D9) { codeBuffer_ = new char[16384]; } @@ -627,7 +628,8 @@ VSShader *ShaderManagerDX9::ApplyShader(bool useHWTransform, bool useHWTessellat if (fsIter == fsCache_.end()) { // Fragment shader not in cache. Let's compile it. std::string errorString; - bool success = GenerateFragmentShaderHLSL(FSID, codeBuffer_, HLSL_D3D9, &errorString); + uint64_t uniformMask; + bool success = GenerateFragmentShaderGLSL(FSID, codeBuffer_, compat_, &uniformMask, &errorString); // We're supposed to handle all possible cases. _assert_(success); fs = new PSShader(device_, FSID, codeBuffer_); diff --git a/GPU/Directx9/ShaderManagerDX9.h b/GPU/Directx9/ShaderManagerDX9.h index 706a627938..3c644f236e 100644 --- a/GPU/Directx9/ShaderManagerDX9.h +++ b/GPU/Directx9/ShaderManagerDX9.h @@ -22,7 +22,7 @@ #include "Common/Common.h" #include "GPU/Directx9/VertexShaderGeneratorHLSL.h" -#include "GPU/Directx9/FragmentShaderGeneratorHLSL.h" +#include "GPU/GLES/FragmentShaderGeneratorGLES.h" #include "GPU/Common/ShaderCommon.h" #include "GPU/Common/ShaderId.h" #include "Common/Math/lin/matrix4x4.h" @@ -112,14 +112,15 @@ private: void Clear(); LPDIRECT3DDEVICE9 device_; + GLSLShaderCompat compat_; FShaderID lastFSID_; VShaderID lastVSID_; char *codeBuffer_; - VSShader *lastVShader_; - PSShader *lastPShader_; + VSShader *lastVShader_ = nullptr; + PSShader *lastPShader_ = nullptr; typedef std::map FSCache; FSCache fsCache_; From 3d0630c04a02b717715a260d58eb7d2748519e7c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Sat, 31 Oct 2020 00:25:32 +0100 Subject: [PATCH 147/275] Remove the HLSL fragment shader generator. The GLSL one can now do its job. --- CMakeLists.txt | 2 - GPU/Common/ShaderCommon.h | 3 - GPU/D3D11/DrawEngineD3D11.h | 1 - GPU/D3D11/StencilBufferD3D11.cpp | 1 - GPU/Directx9/FragmentShaderGeneratorHLSL.cpp | 574 ------------------- GPU/Directx9/FragmentShaderGeneratorHLSL.h | 24 - GPU/GPU.vcxproj | 2 - GPU/GPU.vcxproj.filters | 6 - UWP/GPU_UWP/GPU_UWP.vcxproj | 2 - UWP/GPU_UWP/GPU_UWP.vcxproj.filters | 2 - libretro/Makefile.common | 1 - unittest/TestShaderGenerators.cpp | 36 +- 12 files changed, 19 insertions(+), 635 deletions(-) delete mode 100644 GPU/Directx9/FragmentShaderGeneratorHLSL.cpp delete mode 100644 GPU/Directx9/FragmentShaderGeneratorHLSL.h diff --git a/CMakeLists.txt b/CMakeLists.txt index adfad87ca3..2ad5fbdfeb 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1300,8 +1300,6 @@ set(GPU_D3D9 GPU/Directx9/TextureCacheDX9.h GPU/Directx9/TextureScalerDX9.cpp GPU/Directx9/TextureScalerDX9.h - GPU/Directx9/FragmentShaderGeneratorHLSL.cpp - GPU/Directx9/FragmentShaderGeneratorHLSL.h GPU/Directx9/VertexShaderGeneratorHLSL.cpp GPU/Directx9/VertexShaderGeneratorHLSL.h ) diff --git a/GPU/Common/ShaderCommon.h b/GPU/Common/ShaderCommon.h index 9ca974cd2e..d757ff9d20 100644 --- a/GPU/Common/ShaderCommon.h +++ b/GPU/Common/ShaderCommon.h @@ -30,9 +30,6 @@ enum ShaderLanguage { GLSL_VULKAN, HLSL_D3D9, HLSL_D3D11, - - HLSL_D3D11_TEST, // temporary - HLSL_D3D9_TEST, // temporary }; inline bool ShaderLanguageIsOpenGL(ShaderLanguage lang) { diff --git a/GPU/D3D11/DrawEngineD3D11.h b/GPU/D3D11/DrawEngineD3D11.h index 5225c11052..47302fe71e 100644 --- a/GPU/D3D11/DrawEngineD3D11.h +++ b/GPU/D3D11/DrawEngineD3D11.h @@ -28,7 +28,6 @@ #include "GPU/Common/VertexDecoderCommon.h" #include "GPU/Common/DrawEngineCommon.h" #include "GPU/Common/GPUStateUtils.h" -#include "GPU/Directx9/FragmentShaderGeneratorHLSL.h" #include "GPU/D3D11/StateMappingD3D11.h" #include "GPU/D3D11/D3D11Util.h" diff --git a/GPU/D3D11/StencilBufferD3D11.cpp b/GPU/D3D11/StencilBufferD3D11.cpp index 043cbd50d0..118dba0dc5 100644 --- a/GPU/D3D11/StencilBufferD3D11.cpp +++ b/GPU/D3D11/StencilBufferD3D11.cpp @@ -23,7 +23,6 @@ #include "Core/Reporting.h" #include "GPU/Common/StencilCommon.h" #include "GPU/D3D11/FramebufferManagerD3D11.h" -#include "GPU/Directx9/FragmentShaderGeneratorHLSL.h" #include "GPU/D3D11/ShaderManagerD3D11.h" #include "GPU/D3D11/TextureCacheD3D11.h" #include "GPU/D3D11/D3D11Util.h" diff --git a/GPU/Directx9/FragmentShaderGeneratorHLSL.cpp b/GPU/Directx9/FragmentShaderGeneratorHLSL.cpp deleted file mode 100644 index 9cb577c94a..0000000000 --- a/GPU/Directx9/FragmentShaderGeneratorHLSL.cpp +++ /dev/null @@ -1,574 +0,0 @@ -// Copyright (c) 2012- PPSSPP Project. - -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 2.0 or later versions. - -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License 2.0 for more details. - -// A copy of the GPL 2.0 should have been included with the program. -// If not, see http://www.gnu.org/licenses/ - -// Official git repository and contact information can be found at -// https://github.com/hrydgard/ppsspp and http://www.ppsspp.org/. - -#include - -#include "Core/Reporting.h" -#include "Core/Config.h" -#include "GPU/Directx9/FragmentShaderGeneratorHLSL.h" -#include "GPU/ge_constants.h" -#include "GPU/Common/GPUStateUtils.h" -#include "GPU/GPUState.h" -#include "GPU/Common/ShaderUniforms.h" - -#define WRITE p+=sprintf - -// #define DEBUG_SHADER - -extern const char *hlsl_preamble_fs; -extern const char *hlsl_d3d9_preamble_fs; -extern const char *hlsl_d3d11_preamble_fs; - -// Missing: Z depth range -// Also, logic ops etc, of course, as they are not supported in DX9. -bool GenerateFragmentShaderHLSL(const FShaderID &id, char *buffer, ShaderLanguage lang, std::string *errorString) { - char *p = buffer; - - bool lmode = id.Bit(FS_BIT_LMODE); - bool doTexture = id.Bit(FS_BIT_DO_TEXTURE); - bool enableFog = id.Bit(FS_BIT_ENABLE_FOG); - bool enableAlphaTest = id.Bit(FS_BIT_ALPHA_TEST); - - bool alphaTestAgainstZero = id.Bit(FS_BIT_ALPHA_AGAINST_ZERO); - bool testForceToZero = id.Bit(FS_BIT_TEST_DISCARD_TO_ZERO); - bool enableColorTest = id.Bit(FS_BIT_COLOR_TEST); - bool colorTestAgainstZero = id.Bit(FS_BIT_COLOR_AGAINST_ZERO); - bool enableColorDoubling = id.Bit(FS_BIT_COLOR_DOUBLE); - bool doTextureProjection = id.Bit(FS_BIT_DO_TEXTURE_PROJ); - bool doTextureAlpha = id.Bit(FS_BIT_TEXALPHA); - bool doFlatShading = id.Bit(FS_BIT_FLATSHADE); - bool isModeClear = id.Bit(FS_BIT_CLEARMODE); - - bool bgraTexture = id.Bit(FS_BIT_BGRA_TEXTURE); - - GEComparison alphaTestFunc = (GEComparison)id.Bits(FS_BIT_ALPHA_TEST_FUNC, 3); - GEComparison colorTestFunc = (GEComparison)id.Bits(FS_BIT_COLOR_TEST_FUNC, 2); - bool needShaderTexClamp = id.Bit(FS_BIT_SHADER_TEX_CLAMP); - - ReplaceBlendType replaceBlend = static_cast(id.Bits(FS_BIT_REPLACE_BLEND, 3)); - ReplaceAlphaType stencilToAlpha = static_cast(id.Bits(FS_BIT_STENCIL_TO_ALPHA, 2)); - - GETexFunc texFunc = (GETexFunc)id.Bits(FS_BIT_TEXFUNC, 3); - bool textureAtOffset = id.Bit(FS_BIT_TEXTURE_AT_OFFSET); - - GEBlendSrcFactor replaceBlendFuncA = (GEBlendSrcFactor)id.Bits(FS_BIT_BLENDFUNC_A, 4); - GEBlendDstFactor replaceBlendFuncB = (GEBlendDstFactor)id.Bits(FS_BIT_BLENDFUNC_B, 4); - GEBlendMode replaceBlendEq = (GEBlendMode)id.Bits(FS_BIT_BLENDEQ, 3); - - StencilValueType replaceAlphaWithStencilType = (StencilValueType)id.Bits(FS_BIT_REPLACE_ALPHA_WITH_STENCIL_TYPE, 4); - - WRITE(p, "%s", hlsl_preamble_fs); - - // Output some compatibility defines - switch (lang) { - case ShaderLanguage::HLSL_D3D9: - WRITE(p, hlsl_d3d9_preamble_fs); - break; - case ShaderLanguage::HLSL_D3D11: - WRITE(p, hlsl_d3d11_preamble_fs); - break; - } - - if (lang == HLSL_D3D9) { - if (doTexture) - WRITE(p, "sampler tex : register(s0);\n"); - if (!isModeClear && replaceBlend > REPLACE_BLEND_STANDARD) { - if (replaceBlend == REPLACE_BLEND_COPY_FBO) { - WRITE(p, "vec2 u_fbotexSize : register(c%i);\n", CONST_PS_FBOTEXSIZE); - WRITE(p, "sampler fbotex : register(s1);\n"); - } - if (replaceBlendFuncA >= GE_SRCBLEND_FIXA) { - WRITE(p, "float3 u_blendFixA : register(c%i);\n", CONST_PS_BLENDFIXA); - } - if (replaceBlendFuncB >= GE_DSTBLEND_FIXB) { - WRITE(p, "float3 u_blendFixB : register(c%i);\n", CONST_PS_BLENDFIXB); - } - } - if (needShaderTexClamp && doTexture) { - WRITE(p, "vec4 u_texclamp : register(c%i);\n", CONST_PS_TEXCLAMP); - if (textureAtOffset) { - WRITE(p, "vec2 u_texclampoff : register(c%i);\n", CONST_PS_TEXCLAMPOFF); - } - } - - if (enableAlphaTest || enableColorTest) { - WRITE(p, "vec4 u_alphacolorref : register(c%i);\n", CONST_PS_ALPHACOLORREF); - WRITE(p, "vec4 u_alphacolormask : register(c%i);\n", CONST_PS_ALPHACOLORMASK); - } - if (stencilToAlpha && replaceAlphaWithStencilType == STENCIL_VALUE_UNIFORM) { - WRITE(p, "float u_stencilReplaceValue : register(c%i);\n", CONST_PS_STENCILREPLACE); - } - if (doTexture && texFunc == GE_TEXFUNC_BLEND) { - WRITE(p, "float3 u_texenv : register(c%i);\n", CONST_PS_TEXENV); - } - if (enableFog) { - WRITE(p, "float3 u_fogcolor : register(c%i);\n", CONST_PS_FOGCOLOR); - } - } else { - WRITE(p, "SamplerState samp : register(s0);\n"); - WRITE(p, "Texture2D tex : register(t0);\n"); - if (!isModeClear && replaceBlend > REPLACE_BLEND_STANDARD) { - if (replaceBlend == REPLACE_BLEND_COPY_FBO) { - // No sampler required, we Load - WRITE(p, "Texture2D fboTex : register(t1);\n"); - } - } - WRITE(p, "cbuffer base : register(b0) {\n%s};\n", cb_baseStr); - } - - if (enableAlphaTest) { - if (lang == HLSL_D3D11) { - WRITE(p, "int roundAndScaleTo255i(float x) { return int(floor(x * 255.0f + 0.5f)); }\n"); - } else { - // D3D11 level 9 gets to take this path. - WRITE(p, "float roundAndScaleTo255f(float x) { return floor(x * 255.0f + 0.5f); }\n"); - } - } - if (enableColorTest) { - if (lang == HLSL_D3D11) { - WRITE(p, "uvec3 roundAndScaleTo255iv(float3 x) { return uvec3(floor(x * 255.0f + 0.5f)); }\n"); - } else { - WRITE(p, "vec3 roundAndScaleTo255v(float3 x) { return floor(x * 255.0f + 0.5f); }\n"); - } - } - - WRITE(p, "struct PS_IN {\n"); - if (doTexture) { - WRITE(p, " vec3 v_texcoord: TEXCOORD0;\n"); - } - const char *colorInterpolation = doFlatShading && lang == HLSL_D3D11 ? "nointerpolation " : ""; - WRITE(p, " %svec4 v_color0: COLOR0;\n", colorInterpolation); - if (lmode) { - WRITE(p, " vec3 v_color1: COLOR1;\n"); - } - if (enableFog) { - WRITE(p, " float v_fogdepth: TEXCOORD1;\n"); - } - if (lang == HLSL_D3D11 && ((replaceBlend == REPLACE_BLEND_COPY_FBO) || gstate_c.Supports(GPU_ROUND_FRAGMENT_DEPTH_TO_16BIT))) { - WRITE(p, " vec4 pixelPos : SV_POSITION;\n"); - } - WRITE(p, "};\n"); - - if (lang == HLSL_D3D9) { - WRITE(p, "vec4 main( PS_IN In ) : COLOR {\n"); - } else { - WRITE(p, "struct PS_OUT {\n"); - if (stencilToAlpha == REPLACE_ALPHA_DUALSOURCE) { - WRITE(p, " vec4 target : SV_Target0;\n"); - WRITE(p, " vec4 target1 : SV_Target1;\n"); - } - else { - WRITE(p, " vec4 target : SV_Target;\n"); - } - if (gstate_c.Supports(GPU_ROUND_FRAGMENT_DEPTH_TO_16BIT)) { - WRITE(p, " float depth : SV_DEPTH;\n"); - } - WRITE(p, "};\n"); - WRITE(p, "PS_OUT main( PS_IN In ) {\n"); - WRITE(p, " PS_OUT outfragment;\n"); - } - - if (isModeClear) { - // Clear mode does not allow any fancy shading. - WRITE(p, " vec4 v = In.v_color0;\n"); - } else { - const char *secondary = ""; - // Secondary color for specular on top of texture - if (lmode) { - WRITE(p, " vec4 s = vec4(In.v_color1, 0.0);\n"); - secondary = " + s"; - } else { - secondary = ""; - } - - if (doTexture) { - const char *texcoord = "In.v_texcoord"; - // TODO: Not sure the right way to do this for projection. - if (needShaderTexClamp) { - // We may be clamping inside a larger surface (tex = 64x64, buffer=480x272). - // We may also be wrapping in such a surface, or either one in a too-small surface. - // Obviously, clamping to a smaller surface won't work. But better to clamp to something. - std::string ucoord = "In.v_texcoord.x"; - std::string vcoord = "In.v_texcoord.y"; - if (doTextureProjection) { - ucoord = "(In.v_texcoord.x / In.v_texcoord.z)"; - vcoord = "(In.v_texcoord.y / In.v_texcoord.z)"; - } - - if (id.Bit(FS_BIT_CLAMP_S)) { - ucoord = "clamp(" + ucoord + ", u_texclamp.z, u_texclamp.x - u_texclamp.z)"; - } else { - ucoord = "mod(" + ucoord + ", u_texclamp.x)"; - } - if (id.Bit(FS_BIT_CLAMP_T)) { - vcoord = "clamp(" + vcoord + ", u_texclamp.w, u_texclamp.y - u_texclamp.w)"; - } else { - vcoord = "mod(" + vcoord + ", u_texclamp.y)"; - } - if (textureAtOffset) { - ucoord = "(" + ucoord + " + u_texclampoff.x)"; - vcoord = "(" + vcoord + " + u_texclampoff.y)"; - } - - WRITE(p, " vec2 fixedcoord = vec2(%s, %s);\n", ucoord.c_str(), vcoord.c_str()); - texcoord = "fixedcoord"; - // We already projected it. - doTextureProjection = false; - } - - if (lang == HLSL_D3D11) { - if (doTextureProjection) { - WRITE(p, " vec4 t = tex.Sample(samp, In.v_texcoord.xy / In.v_texcoord.z)%s;\n", bgraTexture ? ".bgra" : ""); - } else { - WRITE(p, " vec4 t = tex.Sample(samp, %s.xy)%s;\n", texcoord, bgraTexture ? ".bgra" : ""); - } - } else { - if (doTextureProjection) { - WRITE(p, " vec4 t = tex2Dproj(tex, vec4(In.v_texcoord.x, In.v_texcoord.y, 0, In.v_texcoord.z))%s;\n", bgraTexture ? ".bgra" : ""); - } else { - WRITE(p, " vec4 t = tex2D(tex, %s.xy)%s;\n", texcoord, bgraTexture ? ".bgra" : ""); - } - } - if (texFunc != GE_TEXFUNC_REPLACE || !doTextureAlpha) { - WRITE(p, " vec4 p = In.v_color0;\n"); - } - - if (doTextureAlpha) { // texfmt == RGBA - switch (texFunc) { - case GE_TEXFUNC_MODULATE: - WRITE(p, " vec4 v = p * t%s;\n", secondary); break; - case GE_TEXFUNC_DECAL: - WRITE(p, " vec4 v = vec4(mix(p.rgb, t.rgb, t.a), p.a)%s;\n", secondary); break; - case GE_TEXFUNC_BLEND: - WRITE(p, " vec4 v = vec4(mix(p.rgb, u_texenv.rgb, t.rgb), p.a * t.a)%s;\n", secondary); break; - case GE_TEXFUNC_REPLACE: - WRITE(p, " vec4 v = t%s;\n", secondary); break; - case GE_TEXFUNC_ADD: - case GE_TEXFUNC_UNKNOWN1: - case GE_TEXFUNC_UNKNOWN2: - case GE_TEXFUNC_UNKNOWN3: - WRITE(p, " vec4 v = vec4(p.rgb + t.rgb, p.a * t.a)%s;\n", secondary); break; - default: - WRITE(p, " vec4 v = p;\n"); break; - } - - } else { // texfmt == RGB - switch (texFunc) { - case GE_TEXFUNC_MODULATE: - WRITE(p, " vec4 v = vec4(t.rgb * p.rgb, p.a)%s;\n", secondary); break; - case GE_TEXFUNC_DECAL: - WRITE(p, " vec4 v = vec4(t.rgb, p.a)%s;\n", secondary); break; - case GE_TEXFUNC_BLEND: - WRITE(p, " vec4 v = vec4(mix(p.rgb, u_texenv.rgb, t.rgb), p.a)%s;\n", secondary); break; - case GE_TEXFUNC_REPLACE: - WRITE(p, " vec4 v = vec4(t.rgb, p.a)%s;\n", secondary); break; - case GE_TEXFUNC_ADD: - case GE_TEXFUNC_UNKNOWN1: - case GE_TEXFUNC_UNKNOWN2: - case GE_TEXFUNC_UNKNOWN3: - WRITE(p, " vec4 v = vec4(p.rgb + t.rgb, p.a)%s;\n", secondary); break; - default: - WRITE(p, " vec4 v = p;\n"); break; - } - } - - if (enableColorDoubling) { - // This happens before fog is applied. - WRITE(p, " v.rgb = clamp(v.rgb * 2.0, 0.0, 1.0);\n"); - } - } else { - // No texture mapping - WRITE(p, " vec4 v = In.v_color0 %s;\n", secondary); - } - - if (enableFog) { - WRITE(p, " float fogCoef = clamp(In.v_fogdepth, 0.0, 1.0);\n"); - WRITE(p, " v = mix(vec4(u_fogcolor, v.a), v, fogCoef);\n"); - } - - const char *discardStatement = testForceToZero ? "v.a = 0.0;" : "DISCARD;"; - if (enableAlphaTest) { - if (alphaTestAgainstZero) { - // When testing against 0 (extremely common), we can avoid some math. - // 0.002 is approximately half of 1.0 / 255.0. - if (alphaTestFunc == GE_COMP_NOTEQUAL || alphaTestFunc == GE_COMP_GREATER) { - WRITE(p, " if (v.a < 0.002) %s\n", discardStatement); - } else if (alphaTestFunc != GE_COMP_NEVER) { - // Anything else is a test for == 0. Happens sometimes, actually... - WRITE(p, " if (v.a > 0.002) %s\n", discardStatement); - } else { - // NEVER has been logged as used by games, although it makes little sense - statically failing. - // Maybe we could discard the drawcall, but it's pretty rare. Let's just statically discard here. - WRITE(p, " %s\n", discardStatement); - } - } else { - const char *alphaTestFuncs[] = { "#", "#", " != ", " == ", " >= ", " > ", " <= ", " < " }; // never/always don't make sense - if (alphaTestFuncs[alphaTestFunc][0] != '#') { - // TODO: Rewrite this to use clip() appropriately (like, clip(v.a - u_alphacolorref.a)) - if (lang == HLSL_D3D11) { - WRITE(p, " if ((roundAndScaleTo255i(v.a) & u_alphacolormask.a) %s int(u_alphacolorref.a)) %s\n", alphaTestFuncs[alphaTestFunc], discardStatement); - } else { - // TODO: Use a texture to lookup bitwise ops? - WRITE(p, " if (roundAndScaleTo255f(v.a) %s u_alphacolorref.a) %s\n", alphaTestFuncs[alphaTestFunc], discardStatement); - } - } else { - // This means NEVER. See above. - WRITE(p, " %s\n", discardStatement); - } - } - } - - if (enableColorTest) { - if (colorTestAgainstZero) { - // When testing against 0 (common), we can avoid some math. - // 0.002 is approximately half of 1.0 / 255.0. - if (colorTestFunc == GE_COMP_NOTEQUAL) { - WRITE(p, " if (v.r < 0.002 && v.g < 0.002 && v.b < 0.002) %s\n", discardStatement); - } else if (colorTestFunc != GE_COMP_NEVER) { - // Anything else is a test for == 0. - WRITE(p, " if (v.r > 0.002 || v.g > 0.002 || v.b > 0.002) %s\n", discardStatement); - } else { - // NEVER has been logged as used by games, although it makes little sense - statically failing. - // Maybe we could discard the drawcall, but it's pretty rare. Let's just statically discard here. - WRITE(p, " %s\n", discardStatement); - } - } else { - const char *colorTestFuncs[] = { "#", "#", " != ", " == " }; // never/always don't make sense - if (colorTestFuncs[colorTestFunc][0] != '#') { - const char *test = colorTestFuncs[colorTestFunc]; - if (lang == HLSL_D3D11) { - WRITE(p, " uvec3 v_scaled = roundAndScaleTo255iv(v.rgb);\n"); - WRITE(p, " uvec3 v_masked = v_scaled & u_alphacolormask.rgb;\n"); - WRITE(p, " uvec3 colorTestRef = u_alphacolorref.rgb & u_alphacolormask.rgb;\n"); - // We have to test the components separately, or we get incorrect results. See #10629. - WRITE(p, " if (v_masked.r %s colorTestRef.r && v_masked.g %s colorTestRef.g && v_masked.b %s colorTestRef.b) %s\n", test, test, test, discardStatement); - } else { - // TODO: Use a texture to lookup bitwise ops instead? - WRITE(p, " vec3 colortest = roundAndScaleTo255v(v.rgb);\n"); - WRITE(p, " if ((colortest.r %s u_alphacolorref.r) && (colortest.g %s u_alphacolorref.g) && (colortest.b %s u_alphacolorref.b)) %s\n", test, test, test, discardStatement); - } - } - else { - WRITE(p, " %s\n", discardStatement); - } - } - } - - if (replaceBlend == REPLACE_BLEND_2X_SRC) { - WRITE(p, " v.rgb = v.rgb * 2.0;\n"); - } - - if (replaceBlend == REPLACE_BLEND_PRE_SRC || replaceBlend == REPLACE_BLEND_PRE_SRC_2X_ALPHA) { - const char *srcFactor = "ERROR"; - switch (replaceBlendFuncA) { - case GE_SRCBLEND_DSTCOLOR: srcFactor = "ERROR"; break; - case GE_SRCBLEND_INVDSTCOLOR: srcFactor = "ERROR"; break; - case GE_SRCBLEND_SRCALPHA: srcFactor = "splat3(v.a)"; break; - case GE_SRCBLEND_INVSRCALPHA: srcFactor = "splat3(1.0 - v.a)"; break; - case GE_SRCBLEND_DSTALPHA: srcFactor = "ERROR"; break; - case GE_SRCBLEND_INVDSTALPHA: srcFactor = "ERROR"; break; - case GE_SRCBLEND_DOUBLESRCALPHA: srcFactor = "splat3(v.a * 2.0)"; break; - case GE_SRCBLEND_DOUBLEINVSRCALPHA: srcFactor = "splat3(1.0 - v.a * 2.0)"; break; - // PRE_SRC for REPLACE_BLEND_PRE_SRC_2X_ALPHA means "double the src." - // It's close to the same, but clamping can still be an issue. - case GE_SRCBLEND_DOUBLEDSTALPHA: srcFactor = "splat3(2.0)"; break; - case GE_SRCBLEND_DOUBLEINVDSTALPHA: srcFactor = "ERROR"; break; - case GE_SRCBLEND_FIXA: srcFactor = "u_blendFixA"; break; - default: srcFactor = "u_blendFixA"; break; - } - if (!strcmp(srcFactor, "ERROR")) { - *errorString = "Bad srcfactor in replace blend"; - return false; - } - - WRITE(p, " v.rgb = v.rgb * %s;\n", srcFactor); - } - - if (lang == HLSL_D3D11 && replaceBlend == REPLACE_BLEND_COPY_FBO) { - WRITE(p, " vec4 destColor = fboTex.Load(int3((int)In.pixelPos.x, (int)In.pixelPos.y, 0));\n"); - - const char *srcFactor = nullptr; - const char *dstFactor = nullptr; - - switch (replaceBlendFuncA) { - case GE_SRCBLEND_DSTCOLOR: srcFactor = "destColor.rgb"; break; - case GE_SRCBLEND_INVDSTCOLOR: srcFactor = "(splat3(1.0) - destColor.rgb)"; break; - case GE_SRCBLEND_SRCALPHA: srcFactor = "v.aaa"; break; - case GE_SRCBLEND_INVSRCALPHA: srcFactor = "splat3(1.0 - v.a)"; break; - case GE_SRCBLEND_DSTALPHA: srcFactor = "destColor.aaa"; break; - case GE_SRCBLEND_INVDSTALPHA: srcFactor = "splat3(1.0) - destColor.aaa"; break; - case GE_SRCBLEND_DOUBLESRCALPHA: srcFactor = "v.aaa * 2.0"; break; - case GE_SRCBLEND_DOUBLEINVSRCALPHA: srcFactor = "splat3(1.0) - v.aaa * 2.0"; break; - case GE_SRCBLEND_DOUBLEDSTALPHA: srcFactor = "destColor.aaa * 2.0"; break; - case GE_SRCBLEND_DOUBLEINVDSTALPHA: srcFactor = "splat3(1.0) - destColor.aaa * 2.0"; break; - case GE_SRCBLEND_FIXA: srcFactor = "u_blendFixA"; break; - default: srcFactor = "u_blendFixA"; break; - } - switch (replaceBlendFuncB) { - case GE_DSTBLEND_SRCCOLOR: dstFactor = "v.rgb"; break; - case GE_DSTBLEND_INVSRCCOLOR: dstFactor = "(splat3(1.0) - v.rgb)"; break; - case GE_DSTBLEND_SRCALPHA: dstFactor = "v.aaa"; break; - case GE_DSTBLEND_INVSRCALPHA: dstFactor = "splat3(1.0) - v.aaa"; break; - case GE_DSTBLEND_DSTALPHA: dstFactor = "destColor.aaa"; break; - case GE_DSTBLEND_INVDSTALPHA: dstFactor = "splat3(1.0) - destColor.aaa"; break; - case GE_DSTBLEND_DOUBLESRCALPHA: dstFactor = "v.aaa * 2.0"; break; - case GE_DSTBLEND_DOUBLEINVSRCALPHA: dstFactor = "splat3(1.0) - v.aaa * 2.0"; break; - case GE_DSTBLEND_DOUBLEDSTALPHA: dstFactor = "destColor.aaa * 2.0"; break; - case GE_DSTBLEND_DOUBLEINVDSTALPHA: dstFactor = "splat3(1.0) - destColor.aaa * 2.0"; break; - case GE_DSTBLEND_FIXB: dstFactor = "u_blendFixB"; break; - default: dstFactor = "u_blendFixB"; break; - } - - switch (replaceBlendEq) { - case GE_BLENDMODE_MUL_AND_ADD: - WRITE(p, " v.rgb = v.rgb * %s + destColor.rgb * %s;\n", srcFactor, dstFactor); - break; - case GE_BLENDMODE_MUL_AND_SUBTRACT: - WRITE(p, " v.rgb = v.rgb * %s - destColor.rgb * %s;\n", srcFactor, dstFactor); - break; - case GE_BLENDMODE_MUL_AND_SUBTRACT_REVERSE: - WRITE(p, " v.rgb = destColor.rgb * %s - v.rgb * %s;\n", dstFactor, srcFactor); - break; - case GE_BLENDMODE_MIN: - WRITE(p, " v.rgb = min(v.rgb, destColor.rgb);\n"); - break; - case GE_BLENDMODE_MAX: - WRITE(p, " v.rgb = max(v.rgb, destColor.rgb);\n"); - break; - case GE_BLENDMODE_ABSDIFF: - WRITE(p, " v.rgb = abs(v.rgb - destColor.rgb);\n"); - break; - default: - *errorString = "Bad replace blend eq"; - return false; - } - } - - // Can do REPLACE_BLEND_COPY_FBO in ps_2_0, but need to apply viewport in the vertex shader - // so that we can have the output position here to sample the texture at. - - if (replaceBlend == REPLACE_BLEND_2X_ALPHA || replaceBlend == REPLACE_BLEND_PRE_SRC_2X_ALPHA) { - WRITE(p, " v.a = v.a * 2.0;\n"); - } - } - - std::string replacedAlpha = "0.0"; - char replacedAlphaTemp[64] = ""; - if (stencilToAlpha != REPLACE_ALPHA_NO) { - switch (replaceAlphaWithStencilType) { - case STENCIL_VALUE_UNIFORM: - replacedAlpha = "u_stencilReplaceValue"; - break; - - case STENCIL_VALUE_ZERO: - replacedAlpha = "0.0"; - break; - - case STENCIL_VALUE_ONE: - case STENCIL_VALUE_INVERT: - // In invert, we subtract by one, but we want to output one here. - replacedAlpha = "1.0"; - break; - - case STENCIL_VALUE_INCR_4: - case STENCIL_VALUE_DECR_4: - // We're adding/subtracting, just by the smallest value in 4-bit. - snprintf(replacedAlphaTemp, sizeof(replacedAlphaTemp), "%f", 1.0 / 15.0); - replacedAlpha = replacedAlphaTemp; - break; - - case STENCIL_VALUE_INCR_8: - case STENCIL_VALUE_DECR_8: - // We're adding/subtracting, just by the smallest value in 8-bit. - snprintf(replacedAlphaTemp, sizeof(replacedAlphaTemp), "%f", 1.0 / 255.0); - replacedAlpha = replacedAlphaTemp; - break; - - case STENCIL_VALUE_KEEP: - // Do nothing. We'll mask out the alpha using color mask. - break; - } - } - - switch (stencilToAlpha) { - case REPLACE_ALPHA_DUALSOURCE: - // Handled at the end. - break; - - case REPLACE_ALPHA_YES: - WRITE(p, " v.a = %s;\n", replacedAlpha.c_str()); - break; - - case REPLACE_ALPHA_NO: - // Do nothing, v is already fine. - break; - - default: - *errorString = "Bad stencil-to-alpha type, corrupt ID?"; - return false; - } - - LogicOpReplaceType replaceLogicOpType = (LogicOpReplaceType)id.Bits(FS_BIT_REPLACE_LOGIC_OP_TYPE, 2); - switch (replaceLogicOpType) { - case LOGICOPTYPE_ONE: - WRITE(p, " v.rgb = splat3(1.0);\n"); - break; - case LOGICOPTYPE_INVERT: - WRITE(p, " v.rgb = splat3(1.0) - v.rgb;\n"); - break; - case LOGICOPTYPE_NORMAL: - break; - - default: - *errorString = "Bad logic op type, corrupt ID?"; - return false; - } - - if (gstate_c.Supports(GPU_ROUND_FRAGMENT_DEPTH_TO_16BIT)) { - const double scale = DepthSliceFactor() * 65535.0; - - WRITE(p, " float z = In.pixelPos.z;\n"); - if (gstate_c.Supports(GPU_SUPPORTS_ACCURATE_DEPTH)) { - // We center the depth with an offset, but only its fraction matters. - // When (DepthSliceFactor() - 1) is odd, it will be 0.5, otherwise 0. - if (((int)(DepthSliceFactor() - 1.0f) & 1) == 1) { - WRITE(p, " z = (floor((z * %f) - (1.0 / 2.0)) + (1.0 / 2.0)) * (1.0 / %f);\n", scale, scale); - } else { - WRITE(p, " z = floor(z * %f) * (1.0 / %f);\n", scale, scale); - } - } else { - WRITE(p, " z = (1.0/65535.0) * floor(z * 65535.0);\n"); - } - WRITE(p, " outfragment.depth = z;\n"); - } - - if (lang == HLSL_D3D11) { - if (stencilToAlpha == REPLACE_ALPHA_DUALSOURCE) { - WRITE(p, " outfragment.target = vec4(v.rgb, %s);\n", replacedAlpha.c_str()); - WRITE(p, " outfragment.target1 = vec4(0.0, 0.0, 0.0, v.a);\n"); - WRITE(p, " return outfragment;\n"); - } - else { - WRITE(p, " outfragment.target = v;\n"); - WRITE(p, " return outfragment;\n"); - } - } else { - WRITE(p, " return v;\n"); - } - WRITE(p, "}\n"); - return true; -} diff --git a/GPU/Directx9/FragmentShaderGeneratorHLSL.h b/GPU/Directx9/FragmentShaderGeneratorHLSL.h deleted file mode 100644 index a3ec82cf14..0000000000 --- a/GPU/Directx9/FragmentShaderGeneratorHLSL.h +++ /dev/null @@ -1,24 +0,0 @@ -// Copyright (c) 2012- PPSSPP Project. - -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 2.0 or later versions. - -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License 2.0 for more details. - -// A copy of the GPL 2.0 should have been included with the program. -// If not, see http://www.gnu.org/licenses/ - -// Official git repository and contact information can be found at -// https://github.com/hrydgard/ppsspp and http://www.ppsspp.org/. - -#pragma once - -#include "GPU/Common/ShaderId.h" -#include "GPU/Common/ShaderCommon.h" -#include "GPU/GLES/FragmentShaderGeneratorGLES.h" - -bool GenerateFragmentShaderHLSL(const FShaderID &id, char *buffer, ShaderLanguage lang, std::string *errorString); diff --git a/GPU/GPU.vcxproj b/GPU/GPU.vcxproj index e63b0babdb..a407b12a0b 100644 --- a/GPU/GPU.vcxproj +++ b/GPU/GPU.vcxproj @@ -385,7 +385,6 @@ - @@ -560,7 +559,6 @@ - diff --git a/GPU/GPU.vcxproj.filters b/GPU/GPU.vcxproj.filters index 4df5470e9b..90f1f71525 100644 --- a/GPU/GPU.vcxproj.filters +++ b/GPU/GPU.vcxproj.filters @@ -273,9 +273,6 @@ DirectX9 - - DirectX9 - @@ -548,8 +545,5 @@ DirectX9 - - DirectX9 - \ No newline at end of file diff --git a/UWP/GPU_UWP/GPU_UWP.vcxproj b/UWP/GPU_UWP/GPU_UWP.vcxproj index 6b735f6a38..64aa7c966f 100644 --- a/UWP/GPU_UWP/GPU_UWP.vcxproj +++ b/UWP/GPU_UWP/GPU_UWP.vcxproj @@ -416,7 +416,6 @@ - @@ -476,7 +475,6 @@ - diff --git a/UWP/GPU_UWP/GPU_UWP.vcxproj.filters b/UWP/GPU_UWP/GPU_UWP.vcxproj.filters index 1a11e78ecd..dc84cf2ebb 100644 --- a/UWP/GPU_UWP/GPU_UWP.vcxproj.filters +++ b/UWP/GPU_UWP/GPU_UWP.vcxproj.filters @@ -41,7 +41,6 @@ - @@ -96,7 +95,6 @@ - diff --git a/libretro/Makefile.common b/libretro/Makefile.common index db8dbcd34f..839c6a9dba 100644 --- a/libretro/Makefile.common +++ b/libretro/Makefile.common @@ -661,7 +661,6 @@ ifeq ($(PLATFORM_EXT), win32) SOURCES_CXX += \ $(GPUDIR)/Directx9/DepalettizeShaderDX9.cpp \ $(GPUDIR)/Directx9/DrawEngineDX9.cpp \ - $(GPUDIR)/Directx9/FragmentShaderGeneratorHLSL.cpp \ $(GPUDIR)/Directx9/FramebufferManagerDX9.cpp \ $(GPUDIR)/Directx9/GPU_DX9.cpp \ $(GPUDIR)/Directx9/ShaderManagerDX9.cpp \ diff --git a/unittest/TestShaderGenerators.cpp b/unittest/TestShaderGenerators.cpp index c7691ce270..06156a9969 100644 --- a/unittest/TestShaderGenerators.cpp +++ b/unittest/TestShaderGenerators.cpp @@ -9,7 +9,6 @@ #include "GPU/Vulkan/VulkanContext.h" -#include "GPU/Directx9/FragmentShaderGeneratorHLSL.h" #include "GPU/GLES/FragmentShaderGeneratorGLES.h" #include "GPU/Directx9/VertexShaderGeneratorHLSL.h" @@ -24,10 +23,6 @@ bool GenerateFShader(FShaderID id, char *buffer, ShaderLanguage lang, std::string *errorString) { uint64_t uniformMask; switch (lang) { - case ShaderLanguage::HLSL_D3D11: - return GenerateFragmentShaderHLSL(id, buffer, ShaderLanguage::HLSL_D3D11, errorString); - case ShaderLanguage::HLSL_D3D9: - return GenerateFragmentShaderHLSL(id, buffer, ShaderLanguage::HLSL_D3D9, errorString); case ShaderLanguage::GLSL_VULKAN: { GLSLShaderCompat compat(ShaderLanguage::GLSL_VULKAN); @@ -45,12 +40,12 @@ bool GenerateFShader(FShaderID id, char *buffer, ShaderLanguage lang, std::strin return GenerateFragmentShaderGLSL(id, buffer, compat, &uniformMask, errorString); } - case ShaderLanguage::HLSL_D3D9_TEST: + case ShaderLanguage::HLSL_D3D9: { GLSLShaderCompat compat(ShaderLanguage::HLSL_D3D9); return GenerateFragmentShaderGLSL(id, buffer, compat, &uniformMask, errorString); } - case ShaderLanguage::HLSL_D3D11_TEST: + case ShaderLanguage::HLSL_D3D11: { GLSLShaderCompat compat(ShaderLanguage::HLSL_D3D11); return GenerateFragmentShaderGLSL(id, buffer, compat, &uniformMask, errorString); @@ -64,21 +59,28 @@ bool GenerateVShader(VShaderID id, char *buffer, ShaderLanguage lang, std::strin uint32_t attrMask; uint64_t uniformMask; switch (lang) { - case ShaderLanguage::HLSL_D3D11: - return GenerateVertexShaderHLSL(id, buffer, ShaderLanguage::HLSL_D3D11, errorString); - case ShaderLanguage::HLSL_D3D9: - return GenerateVertexShaderHLSL(id, buffer, ShaderLanguage::HLSL_D3D9, errorString); case ShaderLanguage::GLSL_VULKAN: { GLSLShaderCompat compat(ShaderLanguage::GLSL_VULKAN); return GenerateVertexShaderGLSL(id, buffer, compat, &attrMask, &uniformMask, errorString); } - case ShaderLanguage::HLSL_D3D9_TEST: + case ShaderLanguage::GLSL_140: + { + GLSLShaderCompat compat(ShaderLanguage::GLSL_140); + return GenerateVertexShaderGLSL(id, buffer, compat, &attrMask, &uniformMask, errorString); + } + + case ShaderLanguage::GLSL_300: + { + GLSLShaderCompat compat(ShaderLanguage::GLSL_140); + return GenerateVertexShaderGLSL(id, buffer, compat, &attrMask, &uniformMask, errorString); + } + case ShaderLanguage::HLSL_D3D9: { GLSLShaderCompat compat(ShaderLanguage::HLSL_D3D9); return GenerateVertexShaderGLSL(id, buffer, compat, &attrMask, &uniformMask, errorString); } - case ShaderLanguage::HLSL_D3D11_TEST: + case ShaderLanguage::HLSL_D3D11: { GLSLShaderCompat compat(ShaderLanguage::HLSL_D3D11); return GenerateVertexShaderGLSL(id, buffer, compat, &attrMask, &uniformMask, errorString); @@ -92,13 +94,11 @@ bool TestCompileShader(const char *buffer, ShaderLanguage lang, bool vertex, std std::vector spirv; switch (lang) { case ShaderLanguage::HLSL_D3D11: - case ShaderLanguage::HLSL_D3D11_TEST: { auto output = CompileShaderToBytecodeD3D11(buffer, strlen(buffer), vertex ? "vs_4_0" : "ps_4_0", 0); return !output.empty(); } case ShaderLanguage::HLSL_D3D9: - case ShaderLanguage::HLSL_D3D9_TEST: { LPD3DBLOB blob = CompileShaderToByteCodeD3D9(buffer, vertex ? "vs_2_0" : "ps_2_0", errorMessage); if (blob) { @@ -153,9 +153,7 @@ bool TestShaderGenerators() { LoadD3DCompilerDynamic(); ShaderLanguage languages[] = { - ShaderLanguage::HLSL_D3D9_TEST, ShaderLanguage::HLSL_D3D9, - ShaderLanguage::HLSL_D3D11_TEST, ShaderLanguage::HLSL_D3D11, ShaderLanguage::GLSL_VULKAN, ShaderLanguage::GLSL_140, @@ -237,6 +235,7 @@ bool TestShaderGenerators() { successes = 0; count = 200; + /* // Generate a bunch of random vertex shader IDs, try to generate shader source. // Then compile it and check that it's ok. for (int i = 0; i < count; i++) { @@ -287,6 +286,9 @@ bool TestShaderGenerators() { successes = 0; count = 200; + */ + + _CrtCheckMemory(); for (int i = 0; i < numLanguages; i++) { delete[] buffer[i]; From 3d4fc7c6960e12791d9e3c39ea08516ff5551b09 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Sat, 31 Oct 2020 10:41:49 +0100 Subject: [PATCH 148/275] Check for a couple additional GL extensions --- Common/GPU/OpenGL/GLFeatures.cpp | 8 ++++++-- Common/GPU/OpenGL/GLFeatures.h | 2 ++ 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/Common/GPU/OpenGL/GLFeatures.cpp b/Common/GPU/OpenGL/GLFeatures.cpp index 7048b6198a..ad4df92819 100644 --- a/Common/GPU/OpenGL/GLFeatures.cpp +++ b/Common/GPU/OpenGL/GLFeatures.cpp @@ -354,6 +354,8 @@ void CheckGLExtensions() { gl_extensions.EXT_draw_instanced = g_set_gl_extensions.count("GL_EXT_draw_instanced") != 0; gl_extensions.ARB_draw_instanced = g_set_gl_extensions.count("GL_ARB_draw_instanced") != 0; gl_extensions.ARB_cull_distance = g_set_gl_extensions.count("GL_ARB_cull_distance") != 0; + gl_extensions.ARB_depth_clamp = g_set_gl_extensions.count("GL_ARB_depth_clamp") != 0; + gl_extensions.ARB_uniform_buffer_object = g_set_gl_extensions.count("GL_ARB_uniform_buffer_object") != 0; if (gl_extensions.IsGLES) { gl_extensions.OES_texture_npot = g_set_gl_extensions.count("GL_OES_texture_npot") != 0; @@ -498,10 +500,10 @@ void CheckGLExtensions() { } if (gl_extensions.VersionGEThan(3, 1)) { gl_extensions.ARB_draw_instanced = true; - // ARB_uniform_buffer_object = true; + gl_extensions.ARB_uniform_buffer_object = true; } if (gl_extensions.VersionGEThan(3, 2)) { - // ARB_depth_clamp = true; + gl_extensions.ARB_depth_clamp = true; } if (gl_extensions.VersionGEThan(3, 3)) { gl_extensions.ARB_blend_func_extended = true; @@ -541,6 +543,8 @@ void CheckGLExtensions() { #ifdef __APPLE__ if (!gl_extensions.IsGLES && !gl_extensions.IsCoreContext) { // Apple doesn't allow OpenGL 3.x+ in compatibility contexts. + // TODO: But are we still ever creating these on Apple? Would really + // like to kill this ForceGL2 flag. gl_extensions.ForceGL2 = true; } #endif diff --git a/Common/GPU/OpenGL/GLFeatures.h b/Common/GPU/OpenGL/GLFeatures.h index 0c4a619b45..884b0a3df3 100644 --- a/Common/GPU/OpenGL/GLFeatures.h +++ b/Common/GPU/OpenGL/GLFeatures.h @@ -64,6 +64,8 @@ struct GLExtensions { bool ARB_draw_instanced; bool ARB_buffer_storage; bool ARB_cull_distance; + bool ARB_depth_clamp; + bool ARB_uniform_buffer_object; // EXT bool EXT_swap_control_tear; From 7a63b5e69e389dfb150b070678b975106ee02c47 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Sat, 31 Oct 2020 11:08:01 +0100 Subject: [PATCH 149/275] Cleanup --- Common/Net/Resolve.cpp | 3 ++- GPU/GLES/FragmentShaderGeneratorGLES.cpp | 17 +++++++++-------- GPU/GLES/ShaderManagerGLES.cpp | 12 ++++++------ 3 files changed, 17 insertions(+), 15 deletions(-) diff --git a/Common/Net/Resolve.cpp b/Common/Net/Resolve.cpp index aac2cdb6fd..37fde61481 100644 --- a/Common/Net/Resolve.cpp +++ b/Common/Net/Resolve.cpp @@ -24,10 +24,12 @@ #include #endif +#include "Common/Log.h" #include "Common/TimeUtil.h" namespace net { + void Init() { #ifdef _WIN32 @@ -45,7 +47,6 @@ void Shutdown() } bool DNSResolve(const std::string &host, const std::string &service, addrinfo **res, std::string &error, DNSType type) { - #if PPSSPP_PLATFORM(SWITCH) // Force IPv4 lookups. if (type == DNSType::IPV6) { diff --git a/GPU/GLES/FragmentShaderGeneratorGLES.cpp b/GPU/GLES/FragmentShaderGeneratorGLES.cpp index 101a2af019..a48c5a9b35 100644 --- a/GPU/GLES/FragmentShaderGeneratorGLES.cpp +++ b/GPU/GLES/FragmentShaderGeneratorGLES.cpp @@ -468,7 +468,8 @@ bool GenerateFragmentShaderGLSL(const FShaderID &id, char *buffer, const GLSLSha } if (doTexture) { - std::string texcoord = StringFromFormat("%sv_texcoord", compat.inPrefix); + char texcoord[64]; + snprintf(texcoord, sizeof(texcoord), "%sv_texcoord", compat.inPrefix); // TODO: Not sure the right way to do this for projection. // This path destroys resolution on older PowerVR no matter what I do if projection is needed, // so we disable it on SGX 540 and lesser, and live with the consequences. @@ -507,7 +508,7 @@ bool GenerateFragmentShaderGLSL(const FShaderID &id, char *buffer, const GLSLSha } WRITE(p, " vec2 fixedcoord = vec2(%s, %s);\n", ucoord.c_str(), vcoord.c_str()); - texcoord = "fixedcoord"; + truncate_cpy(texcoord, "fixedcoord"); // We already projected it. doTextureProjection = false; } @@ -517,28 +518,28 @@ bool GenerateFragmentShaderGLSL(const FShaderID &id, char *buffer, const GLSLSha if (doTextureProjection) { WRITE(p, " vec4 t = tex.Sample(samp, %sv_texcoord.xy / %sv_texcoord.z)%s;\n", compat.inPrefix, compat.inPrefix, bgraTexture ? ".bgra" : ""); } else { - WRITE(p, " vec4 t = tex.Sample(samp, %s.xy)%s;\n", texcoord.c_str(), bgraTexture ? ".bgra" : ""); + WRITE(p, " vec4 t = tex.Sample(samp, %s.xy)%s;\n", texcoord, bgraTexture ? ".bgra" : ""); } } else if (compat.shaderLanguage == HLSL_D3D9) { if (doTextureProjection) { WRITE(p, " vec4 t = tex2Dproj(tex, vec4(%sv_texcoord.x, %sv_texcoord.y, 0, %sv_texcoord.z))%s;\n", compat.inPrefix, compat.inPrefix, compat.inPrefix, bgraTexture ? ".bgra" : ""); } else { - WRITE(p, " vec4 t = tex2D(tex, %s.xy)%s;\n", texcoord.c_str(), bgraTexture ? ".bgra" : ""); + WRITE(p, " vec4 t = tex2D(tex, %s.xy)%s;\n", texcoord, bgraTexture ? ".bgra" : ""); } } else { if (doTextureProjection) { - WRITE(p, " vec4 t = %sProj(tex, %s);\n", compat.texture, texcoord.c_str()); + WRITE(p, " vec4 t = %sProj(tex, %s);\n", compat.texture, texcoord); } else { - WRITE(p, " vec4 t = %s(tex, %s.xy);\n", compat.texture, texcoord.c_str()); + WRITE(p, " vec4 t = %s(tex, %s.xy);\n", compat.texture, texcoord); } } } else { if (doTextureProjection) { // We don't use textureProj because we need better control and it's probably not much of a savings anyway. // However it is good for precision on older hardware like PowerVR. - WRITE(p, " vec2 uv = %s.xy/%s.z;\n vec2 uv_round;\n", texcoord.c_str(), texcoord.c_str()); + WRITE(p, " vec2 uv = %s.xy/%s.z;\n vec2 uv_round;\n", texcoord, texcoord); } else { - WRITE(p, " vec2 uv = %s.xy;\n vec2 uv_round;\n", texcoord.c_str()); + WRITE(p, " vec2 uv = %s.xy;\n vec2 uv_round;\n", texcoord); } WRITE(p, " vec2 tsize = vec2(textureSize(tex, 0));\n"); WRITE(p, " vec2 fraction;\n"); diff --git a/GPU/GLES/ShaderManagerGLES.cpp b/GPU/GLES/ShaderManagerGLES.cpp index c1303a1c29..86625deb38 100644 --- a/GPU/GLES/ShaderManagerGLES.cpp +++ b/GPU/GLES/ShaderManagerGLES.cpp @@ -597,6 +597,9 @@ void ShaderManagerGLES::DetectShaderLanguage() { compat.glslES30 = true; compat.bitwiseOps = true; compat.texelFetch = "texelFetch"; + compat.varying_vs = "out"; + compat.varying_fs = "in"; + compat.attribute = "in"; } else { compat.shaderLanguage = ShaderLanguage::GLSL_140; compat.glslVersionNumber = 100; // GLSL ES 1.0 @@ -619,6 +622,9 @@ void ShaderManagerGLES::DetectShaderLanguage() { compat.glslES30 = true; compat.bitwiseOps = true; compat.texelFetch = "texelFetch"; + compat.varying_vs = "out"; + compat.varying_fs = "in"; + compat.attribute = "in"; } else if (gl_extensions.VersionGEThan(3, 0, 0)) { compat.shaderLanguage = ShaderLanguage::GLSL_140; compat.glslVersionNumber = 130; @@ -652,12 +658,6 @@ void ShaderManagerGLES::DetectShaderLanguage() { compat.lastFragData = "gl_LastFragColorARM"; } } - - if (compat.glslES30 || gl_extensions.IsCoreContext) { - compat.varying_vs = "out"; - compat.varying_fs = "in"; - compat.attribute = "in"; - } } void ShaderManagerGLES::Clear() { From 2f1bbd314e0524cd70884f0a1ce1e900d8033289 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Sat, 31 Oct 2020 11:31:16 +0100 Subject: [PATCH 150/275] Fragment shader gen: Remove unnecessary allocations --- Common/GPU/D3D9/D3D9ShaderCompiler.cpp | 4 +++ GPU/Directx9/ShaderManagerDX9.cpp | 2 +- GPU/GLES/FragmentShaderGeneratorGLES.cpp | 31 ++++++++++-------------- 3 files changed, 18 insertions(+), 19 deletions(-) diff --git a/Common/GPU/D3D9/D3D9ShaderCompiler.cpp b/Common/GPU/D3D9/D3D9ShaderCompiler.cpp index a46131bda1..835fbbc9fa 100644 --- a/Common/GPU/D3D9/D3D9ShaderCompiler.cpp +++ b/Common/GPU/D3D9/D3D9ShaderCompiler.cpp @@ -36,6 +36,10 @@ LPD3DBLOB CompileShaderToByteCodeD3D9(const char *code, const char *target, std: OutputDebugStringUTF8(errorMessage->c_str()); pErrorMsg->Release(); + if (pShaderCode) { + pShaderCode->Release(); + pShaderCode = nullptr; + } pShaderCode = nullptr; } else if (FAILED(hr)) { *errorMessage = GetStringErrorMsg(hr); diff --git a/GPU/Directx9/ShaderManagerDX9.cpp b/GPU/Directx9/ShaderManagerDX9.cpp index 4b78d25860..775dd9015a 100644 --- a/GPU/Directx9/ShaderManagerDX9.cpp +++ b/GPU/Directx9/ShaderManagerDX9.cpp @@ -512,7 +512,7 @@ void ShaderManagerDX9::VSUpdateUniforms(u64 dirtyUniforms) { ShaderManagerDX9::ShaderManagerDX9(Draw::DrawContext *draw, LPDIRECT3DDEVICE9 device) : ShaderManagerCommon(draw), device_(device), compat_(HLSL_D3D9) { - codeBuffer_ = new char[16384]; + codeBuffer_ = new char[32768]; } ShaderManagerDX9::~ShaderManagerDX9() { diff --git a/GPU/GLES/FragmentShaderGeneratorGLES.cpp b/GPU/GLES/FragmentShaderGeneratorGLES.cpp index a48c5a9b35..91d585cd72 100644 --- a/GPU/GLES/FragmentShaderGeneratorGLES.cpp +++ b/GPU/GLES/FragmentShaderGeneratorGLES.cpp @@ -67,6 +67,7 @@ const char *hlsl_d3d9_preamble_fs = bool GenerateFragmentShaderGLSL(const FShaderID &id, char *buffer, const GLSLShaderCompat &compat, uint64_t *uniformMask, std::string *errorString) { *uniformMask = 0; + errorString->clear(); bool highpFog = false; bool highpTexcoord = false; @@ -695,20 +696,17 @@ bool GenerateFragmentShaderGLSL(const FShaderID &id, char *buffer, const GLSLSha if (enableFog) { WRITE(p, " float fogCoef = clamp(%sv_fogdepth, 0.0, 1.0);\n", compat.inPrefix); WRITE(p, " v = mix(vec4(u_fogcolor, v.a), v, fogCoef);\n"); - // WRITE(p, " v.x = v_depth;\n"); } // Texture access is at half texels [0.5/256, 255.5/256], but colors are normalized [0, 255]. // So we have to scale to account for the difference. - std::string alphaTestXCoord = "0"; + char alphaTestXCoord[64] = "0"; if (enableFragmentTestCache) { if (enableColorTest && !colorTestAgainstZero) { WRITE(p, " vec4 vScale256 = v * %f + %f;\n", 255.0 / 256.0, 0.5 / 256.0); - alphaTestXCoord = "vScale256.a"; + truncate_cpy(alphaTestXCoord, "vScale256.a"); } else if (enableAlphaTest && !alphaTestAgainstZero) { - char temp[64]; - snprintf(temp, sizeof(temp), "v.a * %f + %f", 255.0 / 256.0, 0.5 / 256.0); - alphaTestXCoord = temp; + snprintf(alphaTestXCoord, sizeof(alphaTestXCoord), "v.a * %f + %f", 255.0 / 256.0, 0.5 / 256.0); } } @@ -728,7 +726,7 @@ bool GenerateFragmentShaderGLSL(const FShaderID &id, char *buffer, const GLSLSha WRITE(p, " %s\n", discardStatement); } } else if (enableFragmentTestCache) { - WRITE(p, " float aResult = %s(testtex, vec2(%s, 0)).a;\n", compat.texture, alphaTestXCoord.c_str()); + WRITE(p, " float aResult = %s(testtex, vec2(%s, 0)).a;\n", compat.texture, alphaTestXCoord); WRITE(p, " if (aResult < 0.5) %s\n", discardStatement); } else { const char *alphaTestFuncs[] = { "#", "#", " != ", " == ", " >= ", " > ", " <= ", " < " }; @@ -919,36 +917,33 @@ bool GenerateFragmentShaderGLSL(const FShaderID &id, char *buffer, const GLSLSha } } - std::string replacedAlpha = "0.0"; - char replacedAlphaTemp[64] = ""; + char replacedAlpha[64] = "0.0"; if (stencilToAlpha != REPLACE_ALPHA_NO) { switch (replaceAlphaWithStencilType) { case STENCIL_VALUE_UNIFORM: - replacedAlpha = "u_stencilReplaceValue"; + truncate_cpy(replacedAlpha, "u_stencilReplaceValue"); break; case STENCIL_VALUE_ZERO: - replacedAlpha = "0.0"; + truncate_cpy(replacedAlpha, "0.0"); break; case STENCIL_VALUE_ONE: case STENCIL_VALUE_INVERT: // In invert, we subtract by one, but we want to output one here. - replacedAlpha = "1.0"; + truncate_cpy(replacedAlpha, "1.0"); break; case STENCIL_VALUE_INCR_4: case STENCIL_VALUE_DECR_4: // We're adding/subtracting, just by the smallest value in 4-bit. - snprintf(replacedAlphaTemp, sizeof(replacedAlphaTemp), "%f", 1.0 / 15.0); - replacedAlpha = replacedAlphaTemp; + snprintf(replacedAlpha, sizeof(replacedAlpha), "%f", 1.0 / 15.0); break; case STENCIL_VALUE_INCR_8: case STENCIL_VALUE_DECR_8: // We're adding/subtracting, just by the smallest value in 8-bit. - snprintf(replacedAlphaTemp, sizeof(replacedAlphaTemp), "%f", 1.0 / 255.0); - replacedAlpha = replacedAlphaTemp; + snprintf(replacedAlpha, sizeof(replacedAlpha), "%f", 1.0 / 255.0); break; case STENCIL_VALUE_KEEP: @@ -963,7 +958,7 @@ bool GenerateFragmentShaderGLSL(const FShaderID &id, char *buffer, const GLSLSha break; case REPLACE_ALPHA_YES: - WRITE(p, " v.a = %s;\n", replacedAlpha.c_str()); + WRITE(p, " v.a = %s;\n", replacedAlpha); break; case REPLACE_ALPHA_NO: @@ -1014,7 +1009,7 @@ bool GenerateFragmentShaderGLSL(const FShaderID &id, char *buffer, const GLSLSha } if (stencilToAlpha == REPLACE_ALPHA_DUALSOURCE) { - WRITE(p, " %s = vec4(v.rgb, %s);\n", compat.fragColor0, replacedAlpha.c_str()); + WRITE(p, " %s = vec4(v.rgb, %s);\n", compat.fragColor0, replacedAlpha); WRITE(p, " %s = vec4(0.0, 0.0, 0.0, v.a);\n", compat.fragColor1); } else if (compat.shaderLanguage != HLSL_D3D9) { WRITE(p, " %s = v;\n", compat.fragColor0); From dd00672d88dde3f9c5c03446c5fa5544ec938db3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Sat, 31 Oct 2020 18:26:11 +0100 Subject: [PATCH 151/275] Just some cleanups that get to tag along --- Core/HLE/sceKernelModule.cpp | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/Core/HLE/sceKernelModule.cpp b/Core/HLE/sceKernelModule.cpp index 9929fc19a1..da249aefb9 100644 --- a/Core/HLE/sceKernelModule.cpp +++ b/Core/HLE/sceKernelModule.cpp @@ -234,7 +234,6 @@ enum NativeModuleStatus { class PSPModule : public KernelObject { public: - PSPModule() : textStart(0), textEnd(0), libstub(0), libstubend(0), memoryBlockAddr(0), isFake(false), modulePtr(0) {} ~PSPModule() { if (memoryBlockAddr) { // If it's either below user memory, or using a high kernel bit, it's in kernel. @@ -431,20 +430,19 @@ public: std::vector exportedVars; std::vector importedVars; std::set impExpModuleNames; - // Keep track of the code region so we can throw out analysis results // when unloaded. - u32 textStart; - u32 textEnd; + u32 textStart = 0; + u32 textEnd = 0; // Keep track of the libstub pointers so we can recheck on load state. - u32 libstub; - u32 libstubend; + u32 libstub = 0; + u32 libstubend = 0; - u32 memoryBlockAddr; - u32 memoryBlockSize; - u32 modulePtr; - bool isFake; + u32 memoryBlockAddr = 0; + u32 memoryBlockSize = 0; + u32 modulePtr = 0; + bool isFake = false; }; KernelObject *__KernelModuleObject() From 0b1b36921e2ce52546f812037344ba923b4b42c0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Sat, 31 Oct 2020 18:56:44 +0100 Subject: [PATCH 152/275] Move the now-renamed fragment shader generator to GPU/Common. --- CMakeLists.txt | 4 +- .../FragmentShaderGenerator.cpp} | 6 +-- .../FragmentShaderGenerator.h} | 4 +- GPU/Common/ShaderCommon.cpp | 2 +- GPU/Common/ShaderCommon.h | 4 +- GPU/D3D11/ShaderManagerD3D11.cpp | 2 +- GPU/D3D11/ShaderManagerD3D11.h | 4 +- GPU/Directx9/ShaderManagerDX9.cpp | 4 +- GPU/Directx9/ShaderManagerDX9.h | 4 +- GPU/GLES/DrawEngineGLES.h | 2 +- GPU/GLES/ShaderManagerGLES.cpp | 4 +- GPU/GLES/ShaderManagerGLES.h | 4 +- GPU/GLES/StateMappingGLES.cpp | 2 +- GPU/GLES/TextureCacheGLES.cpp | 2 +- GPU/GLES/VertexShaderGeneratorGLES.cpp | 2 +- GPU/GLES/VertexShaderGeneratorGLES.h | 2 +- GPU/GPU.vcxproj | 14 +------ GPU/GPU.vcxproj.filters | 12 +++--- GPU/Vulkan/ShaderManagerVulkan.cpp | 6 +-- GPU/Vulkan/ShaderManagerVulkan.h | 4 +- android/jni/Android.mk | 2 +- libretro/Makefile.common | 2 +- unittest/TestShaderGenerators.cpp | 39 +++++++++---------- 23 files changed, 57 insertions(+), 74 deletions(-) rename GPU/{GLES/FragmentShaderGeneratorGLES.cpp => Common/FragmentShaderGenerator.cpp} (99%) rename GPU/{GLES/FragmentShaderGeneratorGLES.h => Common/FragmentShaderGenerator.h} (88%) diff --git a/CMakeLists.txt b/CMakeLists.txt index 2ad5fbdfeb..2164c02293 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1235,8 +1235,6 @@ set(GPU_GLES GPU/GLES/DepthBufferGLES.cpp GPU/GLES/GPU_GLES.cpp GPU/GLES/GPU_GLES.h - GPU/GLES/FragmentShaderGeneratorGLES.cpp - GPU/GLES/FragmentShaderGeneratorGLES.h GPU/GLES/FragmentTestCacheGLES.cpp GPU/GLES/FragmentTestCacheGLES.h GPU/GLES/FramebufferManagerGLES.cpp @@ -1340,6 +1338,8 @@ set(GPU_SOURCES ${GPU_NEON} GPU/Common/DepalettizeShaderCommon.cpp GPU/Common/DepalettizeShaderCommon.h + GPU/Common/FragmentShaderGenerator.cpp + GPU/Common/FragmentShaderGenerator.h GPU/Common/FramebufferManagerCommon.cpp GPU/Common/FramebufferManagerCommon.h GPU/Common/GPUDebugInterface.cpp diff --git a/GPU/GLES/FragmentShaderGeneratorGLES.cpp b/GPU/Common/FragmentShaderGenerator.cpp similarity index 99% rename from GPU/GLES/FragmentShaderGeneratorGLES.cpp rename to GPU/Common/FragmentShaderGenerator.cpp index 91d585cd72..a74008ca58 100644 --- a/GPU/GLES/FragmentShaderGeneratorGLES.cpp +++ b/GPU/Common/FragmentShaderGenerator.cpp @@ -26,9 +26,7 @@ #include "GPU/Common/GPUStateUtils.h" #include "GPU/Common/ShaderId.h" #include "GPU/Common/ShaderUniforms.h" -#include "GPU/GLES/FragmentShaderGeneratorGLES.h" -#include "GPU/GLES/FramebufferManagerGLES.h" -#include "GPU/GLES/ShaderManagerGLES.h" +#include "GPU/Common/FragmentShaderGenerator.h" #include "GPU/ge_constants.h" #include "GPU/GPUState.h" @@ -65,7 +63,7 @@ const char *hlsl_d3d9_preamble_fs = "#define DISCARD_BELOW(x) clip(x)\n"; -bool GenerateFragmentShaderGLSL(const FShaderID &id, char *buffer, const GLSLShaderCompat &compat, uint64_t *uniformMask, std::string *errorString) { +bool GenerateFragmentShader(const FShaderID &id, char *buffer, const ShaderLanguageDesc &compat, uint64_t *uniformMask, std::string *errorString) { *uniformMask = 0; errorString->clear(); diff --git a/GPU/GLES/FragmentShaderGeneratorGLES.h b/GPU/Common/FragmentShaderGenerator.h similarity index 88% rename from GPU/GLES/FragmentShaderGeneratorGLES.h rename to GPU/Common/FragmentShaderGenerator.h index a4c743ca04..7c75e35c2f 100644 --- a/GPU/GLES/FragmentShaderGeneratorGLES.h +++ b/GPU/Common/FragmentShaderGenerator.h @@ -23,7 +23,6 @@ struct FShaderID; // D3D9 constants - #define CONST_PS_TEXENV 0 #define CONST_PS_ALPHACOLORREF 1 #define CONST_PS_ALPHACOLORMASK 2 @@ -38,5 +37,4 @@ struct FShaderID; // For stencil upload #define CONST_PS_STENCILVALUE 10 - -bool GenerateFragmentShaderGLSL(const FShaderID &id, char *buffer, const GLSLShaderCompat &compat, uint64_t *uniformMask, std::string *errorString); +bool GenerateFragmentShader(const FShaderID &id, char *buffer, const ShaderLanguageDesc &compat, uint64_t *uniformMask, std::string *errorString); diff --git a/GPU/Common/ShaderCommon.cpp b/GPU/Common/ShaderCommon.cpp index 7decf40746..68ca321860 100644 --- a/GPU/Common/ShaderCommon.cpp +++ b/GPU/Common/ShaderCommon.cpp @@ -101,7 +101,7 @@ void init_resources(TBuiltInResource &Resources) { Resources.limits.generalConstantMatrixVectorIndexing = 1; } -GLSLShaderCompat::GLSLShaderCompat(ShaderLanguage lang) { +ShaderLanguageDesc::ShaderLanguageDesc(ShaderLanguage lang) { shaderLanguage = lang; switch (lang) { case GLSL_140: diff --git a/GPU/Common/ShaderCommon.h b/GPU/Common/ShaderCommon.h index d757ff9d20..b4b005b9f8 100644 --- a/GPU/Common/ShaderCommon.h +++ b/GPU/Common/ShaderCommon.h @@ -142,8 +142,8 @@ enum DoLightComputation { LIGHT_FULL, }; -struct GLSLShaderCompat { - explicit GLSLShaderCompat(ShaderLanguage lang); +struct ShaderLanguageDesc { + explicit ShaderLanguageDesc(ShaderLanguage lang); int glslVersionNumber = 0; ShaderLanguage shaderLanguage; diff --git a/GPU/D3D11/ShaderManagerD3D11.cpp b/GPU/D3D11/ShaderManagerD3D11.cpp index 2b10f9a7a4..9f13a9934f 100644 --- a/GPU/D3D11/ShaderManagerD3D11.cpp +++ b/GPU/D3D11/ShaderManagerD3D11.cpp @@ -222,7 +222,7 @@ void ShaderManagerD3D11::GetShaders(int prim, u32 vertType, D3D11VertexShader ** // Fragment shader not in cache. Let's compile it. std::string genErrorString; uint64_t uniformMask; - GenerateFragmentShaderGLSL(FSID, codeBuffer_, compat_, &uniformMask, &genErrorString); + GenerateFragmentShader(FSID, codeBuffer_, compat_, &uniformMask, &genErrorString); fs = new D3D11FragmentShader(device_, featureLevel_, FSID, codeBuffer_, useHWTransform); fsCache_[FSID] = fs; } else { diff --git a/GPU/D3D11/ShaderManagerD3D11.h b/GPU/D3D11/ShaderManagerD3D11.h index 43f174cad8..140a9a3656 100644 --- a/GPU/D3D11/ShaderManagerD3D11.h +++ b/GPU/D3D11/ShaderManagerD3D11.h @@ -25,7 +25,7 @@ #include "GPU/Common/ShaderCommon.h" #include "GPU/Common/ShaderId.h" #include "GPU/Common/ShaderUniforms.h" -#include "GPU/GLES/FragmentShaderGeneratorGLES.h" +#include "GPU/Common/FragmentShaderGenerator.h" class D3D11Context; class D3D11PushBuffer; @@ -110,7 +110,7 @@ private: ID3D11Device *device_; ID3D11DeviceContext *context_; D3D_FEATURE_LEVEL featureLevel_; - GLSLShaderCompat compat_; + ShaderLanguageDesc compat_; typedef std::map FSCache; FSCache fsCache_; diff --git a/GPU/Directx9/ShaderManagerDX9.cpp b/GPU/Directx9/ShaderManagerDX9.cpp index 775dd9015a..b3259d94a2 100644 --- a/GPU/Directx9/ShaderManagerDX9.cpp +++ b/GPU/Directx9/ShaderManagerDX9.cpp @@ -41,7 +41,7 @@ #include "GPU/GPUState.h" #include "GPU/ge_constants.h" #include "GPU/Common/ShaderUniforms.h" -#include "GPU/GLES/FragmentShaderGeneratorGLES.h" +#include "GPU/Common/FragmentShaderGenerator.h" #include "GPU/Directx9/ShaderManagerDX9.h" #include "GPU/Directx9/DrawEngineDX9.h" #include "GPU/Directx9/FramebufferManagerDX9.h" @@ -629,7 +629,7 @@ VSShader *ShaderManagerDX9::ApplyShader(bool useHWTransform, bool useHWTessellat // Fragment shader not in cache. Let's compile it. std::string errorString; uint64_t uniformMask; - bool success = GenerateFragmentShaderGLSL(FSID, codeBuffer_, compat_, &uniformMask, &errorString); + bool success = GenerateFragmentShader(FSID, codeBuffer_, compat_, &uniformMask, &errorString); // We're supposed to handle all possible cases. _assert_(success); fs = new PSShader(device_, FSID, codeBuffer_); diff --git a/GPU/Directx9/ShaderManagerDX9.h b/GPU/Directx9/ShaderManagerDX9.h index 3c644f236e..01d5928531 100644 --- a/GPU/Directx9/ShaderManagerDX9.h +++ b/GPU/Directx9/ShaderManagerDX9.h @@ -22,7 +22,7 @@ #include "Common/Common.h" #include "GPU/Directx9/VertexShaderGeneratorHLSL.h" -#include "GPU/GLES/FragmentShaderGeneratorGLES.h" +#include "GPU/Common/FragmentShaderGenerator.h" #include "GPU/Common/ShaderCommon.h" #include "GPU/Common/ShaderId.h" #include "Common/Math/lin/matrix4x4.h" @@ -112,7 +112,7 @@ private: void Clear(); LPDIRECT3DDEVICE9 device_; - GLSLShaderCompat compat_; + ShaderLanguageDesc compat_; FShaderID lastFSID_; VShaderID lastVSID_; diff --git a/GPU/GLES/DrawEngineGLES.h b/GPU/GLES/DrawEngineGLES.h index 9291543478..8c962dd141 100644 --- a/GPU/GLES/DrawEngineGLES.h +++ b/GPU/GLES/DrawEngineGLES.h @@ -27,7 +27,7 @@ #include "GPU/Common/VertexDecoderCommon.h" #include "GPU/Common/DrawEngineCommon.h" #include "GPU/Common/GPUStateUtils.h" -#include "GPU/GLES/FragmentShaderGeneratorGLES.h" +#include "GPU/Common/FragmentShaderGenerator.h" class LinkedShader; class ShaderManagerGLES; diff --git a/GPU/GLES/ShaderManagerGLES.cpp b/GPU/GLES/ShaderManagerGLES.cpp index 86625deb38..cc6669f74d 100644 --- a/GPU/GLES/ShaderManagerGLES.cpp +++ b/GPU/GLES/ShaderManagerGLES.cpp @@ -584,7 +584,7 @@ ShaderManagerGLES::~ShaderManagerGLES() { } void ShaderManagerGLES::DetectShaderLanguage() { - GLSLShaderCompat &compat = compat_; + ShaderLanguageDesc &compat = compat_; compat.gles = gl_extensions.IsGLES; @@ -708,7 +708,7 @@ void ShaderManagerGLES::DirtyLastShader() { Shader *ShaderManagerGLES::CompileFragmentShader(FShaderID FSID) { uint64_t uniformMask; std::string errorString; - if (!GenerateFragmentShaderGLSL(FSID, codeBuffer_, compat_, &uniformMask, &errorString)) { + if (!GenerateFragmentShader(FSID, codeBuffer_, compat_, &uniformMask, &errorString)) { ERROR_LOG(G3D, "Shader gen error: %s", errorString.c_str()); return nullptr; } diff --git a/GPU/GLES/ShaderManagerGLES.h b/GPU/GLES/ShaderManagerGLES.h index 8a636db49e..a075530ecd 100644 --- a/GPU/GLES/ShaderManagerGLES.h +++ b/GPU/GLES/ShaderManagerGLES.h @@ -24,7 +24,7 @@ #include "GPU/Common/ShaderCommon.h" #include "GPU/Common/ShaderId.h" #include "GPU/GLES/VertexShaderGeneratorGLES.h" -#include "GPU/GLES/FragmentShaderGeneratorGLES.h" +#include "GPU/Common/FragmentShaderGenerator.h" class Shader; @@ -196,7 +196,7 @@ private: typedef std::vector LinkedShaderCache; GLRenderManager *render_; - GLSLShaderCompat compat_; + ShaderLanguageDesc compat_; LinkedShaderCache linkedShaderCache_; bool lastVShaderSame_; diff --git a/GPU/GLES/StateMappingGLES.cpp b/GPU/GLES/StateMappingGLES.cpp index 46883171c7..25d178a293 100644 --- a/GPU/GLES/StateMappingGLES.cpp +++ b/GPU/GLES/StateMappingGLES.cpp @@ -35,7 +35,7 @@ #include "GPU/GLES/ShaderManagerGLES.h" #include "GPU/GLES/TextureCacheGLES.h" #include "GPU/GLES/FramebufferManagerGLES.h" -#include "GPU/GLES/FragmentShaderGeneratorGLES.h" +#include "GPU/Common/FragmentShaderGenerator.h" static const GLushort glBlendFactorLookup[(size_t)BlendFactor::COUNT] = { GL_ZERO, diff --git a/GPU/GLES/TextureCacheGLES.cpp b/GPU/GLES/TextureCacheGLES.cpp index 6389431226..7a62854e6f 100644 --- a/GPU/GLES/TextureCacheGLES.cpp +++ b/GPU/GLES/TextureCacheGLES.cpp @@ -33,7 +33,7 @@ #include "GPU/GPUState.h" #include "GPU/GLES/TextureCacheGLES.h" #include "GPU/GLES/FramebufferManagerGLES.h" -#include "GPU/GLES/FragmentShaderGeneratorGLES.h" +#include "GPU/Common/FragmentShaderGenerator.h" #include "GPU/GLES/DepalettizeShaderGLES.h" #include "GPU/GLES/ShaderManagerGLES.h" #include "GPU/GLES/DrawEngineGLES.h" diff --git a/GPU/GLES/VertexShaderGeneratorGLES.cpp b/GPU/GLES/VertexShaderGeneratorGLES.cpp index 885afed9e2..fdbcaa5f4a 100644 --- a/GPU/GLES/VertexShaderGeneratorGLES.cpp +++ b/GPU/GLES/VertexShaderGeneratorGLES.cpp @@ -105,7 +105,7 @@ const char *vulkan_glsl_preamble_vs = "#extension GL_ARB_shading_language_420pack : enable\n" "#define splat3(x) vec3(x)\n\n"; -bool GenerateVertexShaderGLSL(const VShaderID &id, char *buffer, const GLSLShaderCompat &compat, uint32_t *attrMask, uint64_t *uniformMask, std::string *errorString) { +bool GenerateVertexShaderGLSL(const VShaderID &id, char *buffer, const ShaderLanguageDesc &compat, uint32_t *attrMask, uint64_t *uniformMask, std::string *errorString) { *attrMask = 0; *uniformMask = 0; diff --git a/GPU/GLES/VertexShaderGeneratorGLES.h b/GPU/GLES/VertexShaderGeneratorGLES.h index 9617e47a97..df42bd4d11 100644 --- a/GPU/GLES/VertexShaderGeneratorGLES.h +++ b/GPU/GLES/VertexShaderGeneratorGLES.h @@ -21,4 +21,4 @@ struct VShaderID; -bool GenerateVertexShaderGLSL(const VShaderID &id, char *buffer, const GLSLShaderCompat &compat, uint32_t *attrMask, uint64_t *uniformMask, std::string *errorString); +bool GenerateVertexShaderGLSL(const VShaderID &id, char *buffer, const ShaderLanguageDesc &compat, uint32_t *attrMask, uint64_t *uniformMask, std::string *errorString); diff --git a/GPU/GPU.vcxproj b/GPU/GPU.vcxproj index a407b12a0b..09288fdf97 100644 --- a/GPU/GPU.vcxproj +++ b/GPU/GPU.vcxproj @@ -340,6 +340,7 @@ + @@ -398,12 +399,6 @@ true true - - true - true - true - true - true true @@ -488,6 +483,7 @@ + @@ -580,12 +576,6 @@ true true - - true - true - true - true - true true diff --git a/GPU/GPU.vcxproj.filters b/GPU/GPU.vcxproj.filters index 90f1f71525..ee96efb190 100644 --- a/GPU/GPU.vcxproj.filters +++ b/GPU/GPU.vcxproj.filters @@ -186,9 +186,6 @@ GLES - - GLES - GLES @@ -273,6 +270,9 @@ DirectX9 + + Common + @@ -443,9 +443,6 @@ GLES - - GLES - GLES @@ -545,5 +542,8 @@ DirectX9 + + Common + \ No newline at end of file diff --git a/GPU/Vulkan/ShaderManagerVulkan.cpp b/GPU/Vulkan/ShaderManagerVulkan.cpp index 3c7c84904f..3b4b8b7a63 100644 --- a/GPU/Vulkan/ShaderManagerVulkan.cpp +++ b/GPU/Vulkan/ShaderManagerVulkan.cpp @@ -39,7 +39,7 @@ #include "GPU/Vulkan/ShaderManagerVulkan.h" #include "GPU/Vulkan/DrawEngineVulkan.h" #include "GPU/Vulkan/FramebufferManagerVulkan.h" -#include "GPU/GLES/FragmentShaderGeneratorGLES.h" +#include "GPU/Common/FragmentShaderGenerator.h" #include "GPU/GLES/VertexShaderGeneratorGLES.h" VulkanFragmentShader::VulkanFragmentShader(VulkanContext *vulkan, FShaderID id, const char *code) @@ -278,7 +278,7 @@ void ShaderManagerVulkan::GetShaders(int prim, u32 vertType, VulkanVertexShader // Fragment shader not in cache. Let's compile it. std::string genErrorString; uint64_t uniformMask = 0; // Not used - bool success = GenerateFragmentShaderGLSL(FSID, codeBuffer_, compat_, &uniformMask, &genErrorString); + bool success = GenerateFragmentShader(FSID, codeBuffer_, compat_, &uniformMask, &genErrorString); _assert_(success); fs = new VulkanFragmentShader(vulkan_, FSID, codeBuffer_); fsCache_.Insert(FSID, fs); @@ -414,7 +414,7 @@ bool ShaderManagerVulkan::LoadCache(FILE *f) { } std::string genErrorString; uint64_t uniformMask = 0; - if (!GenerateFragmentShaderGLSL(id, codeBuffer_, compat_, &uniformMask, &genErrorString)) { + if (!GenerateFragmentShader(id, codeBuffer_, compat_, &uniformMask, &genErrorString)) { return false; } VulkanFragmentShader *fs = new VulkanFragmentShader(vulkan_, id, codeBuffer_); diff --git a/GPU/Vulkan/ShaderManagerVulkan.h b/GPU/Vulkan/ShaderManagerVulkan.h index a030422ba2..d48c7dcd99 100644 --- a/GPU/Vulkan/ShaderManagerVulkan.h +++ b/GPU/Vulkan/ShaderManagerVulkan.h @@ -25,7 +25,7 @@ #include "GPU/Common/ShaderCommon.h" #include "GPU/Common/ShaderId.h" #include "GPU/GLES/VertexShaderGeneratorGLES.h" -#include "GPU/GLES/FragmentShaderGeneratorGLES.h" +#include "GPU/Common/FragmentShaderGenerator.h" #include "GPU/Vulkan/VulkanUtil.h" #include "Common/Math/lin/matrix4x4.h" #include "GPU/Common/ShaderUniforms.h" @@ -131,7 +131,7 @@ private: void Clear(); VulkanContext *vulkan_; - GLSLShaderCompat compat_; + ShaderLanguageDesc compat_; typedef DenseHashMap FSCache; FSCache fsCache_; diff --git a/android/jni/Android.mk b/android/jni/Android.mk index 9a9bad4827..d9f3a34883 100644 --- a/android/jni/Android.mk +++ b/android/jni/Android.mk @@ -306,6 +306,7 @@ EXEC_AND_LIB_FILES := \ $(SRC)/GPU/GeConstants.cpp \ $(SRC)/GPU/GeDisasm.cpp \ $(SRC)/GPU/Common/DepalettizeShaderCommon.cpp \ + $(SRC)/GPU/Common/FragmentShaderGenerator.cpp \ $(SRC)/GPU/Common/FramebufferManagerCommon.cpp \ $(SRC)/GPU/Common/PresentationCommon.cpp \ $(SRC)/GPU/Common/GPUDebugInterface.cpp \ @@ -340,7 +341,6 @@ EXEC_AND_LIB_FILES := \ $(SRC)/GPU/GLES/StateMappingGLES.cpp.arm \ $(SRC)/GPU/GLES/ShaderManagerGLES.cpp.arm \ $(SRC)/GPU/GLES/VertexShaderGeneratorGLES.cpp.arm \ - $(SRC)/GPU/GLES/FragmentShaderGeneratorGLES.cpp.arm \ $(SRC)/GPU/GLES/FragmentTestCacheGLES.cpp.arm \ $(SRC)/GPU/GLES/TextureScalerGLES.cpp \ $(SRC)/GPU/Null/NullGpu.cpp \ diff --git a/libretro/Makefile.common b/libretro/Makefile.common index 839c6a9dba..ec02dcfe44 100644 --- a/libretro/Makefile.common +++ b/libretro/Makefile.common @@ -248,6 +248,7 @@ SOURCES_CXX += \ $(GPUDIR)/Debugger/Playback.cpp \ $(GPUDIR)/Debugger/Record.cpp \ $(GPUDIR)/Debugger/Stepping.cpp \ + $(GPUDIR)/Common/FragmentShaderGenerator.cpp \ $(GPUDIR)/Common/TextureCacheCommon.cpp \ $(GPUDIR)/Common/TextureScalerCommon.cpp \ $(GPUDIR)/Common/SoftwareTransformCommon.cpp \ @@ -271,7 +272,6 @@ SOURCES_CXX += \ $(GPUDIR)/GLES/VertexShaderGeneratorGLES.cpp \ $(GPUDIR)/GLES/DrawEngineGLES.cpp \ $(GPUDIR)/GLES/GPU_GLES.cpp \ - $(GPUDIR)/GLES/FragmentShaderGeneratorGLES.cpp \ $(GPUDIR)/GLES/FragmentTestCacheGLES.cpp \ $(GPUDIR)/GLES/FramebufferManagerGLES.cpp \ $(GPUDIR)/GLES/TextureCacheGLES.cpp \ diff --git a/unittest/TestShaderGenerators.cpp b/unittest/TestShaderGenerators.cpp index 06156a9969..bd91558ca1 100644 --- a/unittest/TestShaderGenerators.cpp +++ b/unittest/TestShaderGenerators.cpp @@ -9,7 +9,7 @@ #include "GPU/Vulkan/VulkanContext.h" -#include "GPU/GLES/FragmentShaderGeneratorGLES.h" +#include "GPU/Common/FragmentShaderGenerator.h" #include "GPU/Directx9/VertexShaderGeneratorHLSL.h" #include "GPU/GLES/VertexShaderGeneratorGLES.h" @@ -25,30 +25,28 @@ bool GenerateFShader(FShaderID id, char *buffer, ShaderLanguage lang, std::strin switch (lang) { case ShaderLanguage::GLSL_VULKAN: { - GLSLShaderCompat compat(ShaderLanguage::GLSL_VULKAN); - return GenerateFragmentShaderGLSL(id, buffer, compat, &uniformMask, errorString); + ShaderLanguageDesc compat(ShaderLanguage::GLSL_VULKAN); + return GenerateFragmentShader(id, buffer, compat, &uniformMask, errorString); } case ShaderLanguage::GLSL_140: { - GLSLShaderCompat compat(ShaderLanguage::GLSL_140); - return GenerateFragmentShaderGLSL(id, buffer, compat, &uniformMask, errorString); + ShaderLanguageDesc compat(ShaderLanguage::GLSL_140); + return GenerateFragmentShader(id, buffer, compat, &uniformMask, errorString); } - case ShaderLanguage::GLSL_300: { - GLSLShaderCompat compat(ShaderLanguage::GLSL_140); - return GenerateFragmentShaderGLSL(id, buffer, compat, &uniformMask, errorString); + ShaderLanguageDesc compat(ShaderLanguage::GLSL_140); + return GenerateFragmentShader(id, buffer, compat, &uniformMask, errorString); } - case ShaderLanguage::HLSL_D3D9: { - GLSLShaderCompat compat(ShaderLanguage::HLSL_D3D9); - return GenerateFragmentShaderGLSL(id, buffer, compat, &uniformMask, errorString); + ShaderLanguageDesc compat(ShaderLanguage::HLSL_D3D9); + return GenerateFragmentShader(id, buffer, compat, &uniformMask, errorString); } case ShaderLanguage::HLSL_D3D11: { - GLSLShaderCompat compat(ShaderLanguage::HLSL_D3D11); - return GenerateFragmentShaderGLSL(id, buffer, compat, &uniformMask, errorString); + ShaderLanguageDesc compat(ShaderLanguage::HLSL_D3D11); + return GenerateFragmentShader(id, buffer, compat, &uniformMask, errorString); } default: return false; @@ -61,29 +59,28 @@ bool GenerateVShader(VShaderID id, char *buffer, ShaderLanguage lang, std::strin switch (lang) { case ShaderLanguage::GLSL_VULKAN: { - GLSLShaderCompat compat(ShaderLanguage::GLSL_VULKAN); + ShaderLanguageDesc compat(ShaderLanguage::GLSL_VULKAN); return GenerateVertexShaderGLSL(id, buffer, compat, &attrMask, &uniformMask, errorString); } case ShaderLanguage::GLSL_140: { - GLSLShaderCompat compat(ShaderLanguage::GLSL_140); + ShaderLanguageDesc compat(ShaderLanguage::GLSL_140); return GenerateVertexShaderGLSL(id, buffer, compat, &attrMask, &uniformMask, errorString); } - case ShaderLanguage::GLSL_300: { - GLSLShaderCompat compat(ShaderLanguage::GLSL_140); + ShaderLanguageDesc compat(ShaderLanguage::GLSL_140); return GenerateVertexShaderGLSL(id, buffer, compat, &attrMask, &uniformMask, errorString); } case ShaderLanguage::HLSL_D3D9: { - GLSLShaderCompat compat(ShaderLanguage::HLSL_D3D9); - return GenerateVertexShaderGLSL(id, buffer, compat, &attrMask, &uniformMask, errorString); + //ShaderLanguageDesc compat(ShaderLanguage::HLSL_D3D9); + return GenerateVertexShaderHLSL(id, buffer, ShaderLanguage::HLSL_D3D9, errorString); } case ShaderLanguage::HLSL_D3D11: { - GLSLShaderCompat compat(ShaderLanguage::HLSL_D3D11); - return GenerateVertexShaderGLSL(id, buffer, compat, &attrMask, &uniformMask, errorString); + //ShaderLanguageDesc compat(ShaderLanguage::HLSL_D3D11); + return GenerateVertexShaderHLSL(id, buffer, ShaderLanguage::HLSL_D3D11, errorString); } default: return false; From 99d63714b54310d145a732400d1966659479d8f1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Sat, 31 Oct 2020 22:52:54 +0100 Subject: [PATCH 153/275] UWP buildfix --- UWP/GPU_UWP/GPU_UWP.vcxproj | 4 +++- UWP/GPU_UWP/GPU_UWP.vcxproj.filters | 4 +++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/UWP/GPU_UWP/GPU_UWP.vcxproj b/UWP/GPU_UWP/GPU_UWP.vcxproj index 64aa7c966f..5fd5c99998 100644 --- a/UWP/GPU_UWP/GPU_UWP.vcxproj +++ b/UWP/GPU_UWP/GPU_UWP.vcxproj @@ -381,6 +381,7 @@ + @@ -437,6 +438,7 @@ + @@ -521,4 +523,4 @@ - + \ No newline at end of file diff --git a/UWP/GPU_UWP/GPU_UWP.vcxproj.filters b/UWP/GPU_UWP/GPU_UWP.vcxproj.filters index dc84cf2ebb..331a8c82e6 100644 --- a/UWP/GPU_UWP/GPU_UWP.vcxproj.filters +++ b/UWP/GPU_UWP/GPU_UWP.vcxproj.filters @@ -56,6 +56,7 @@ + @@ -112,5 +113,6 @@ + - + \ No newline at end of file From 042f79957302412af6f3aa8c434b3fef24515a60 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Sat, 31 Oct 2020 22:59:38 +0100 Subject: [PATCH 154/275] Fix silly issue in vertex shader gen --- GPU/GLES/VertexShaderGeneratorGLES.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/GPU/GLES/VertexShaderGeneratorGLES.cpp b/GPU/GLES/VertexShaderGeneratorGLES.cpp index fdbcaa5f4a..d9e26c69bc 100644 --- a/GPU/GLES/VertexShaderGeneratorGLES.cpp +++ b/GPU/GLES/VertexShaderGeneratorGLES.cpp @@ -126,7 +126,7 @@ bool GenerateVertexShaderGLSL(const VShaderID &id, char *buffer, const ShaderLan WRITE(p, "#define splat3(x) vec3(x)\n"); } - if (!ShaderLanguageIsOpenGL(compat.shaderLanguage) && gl_extensions.EXT_gpu_shader4) { + if (ShaderLanguageIsOpenGL(compat.shaderLanguage) && gl_extensions.EXT_gpu_shader4) { WRITE(p, "#extension GL_EXT_gpu_shader4 : enable\n"); } From d32fc34b2b335a9e1396d0158de5983d6dd65757 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Sat, 31 Oct 2020 23:22:06 +0100 Subject: [PATCH 155/275] Remove inPrefix. HLSL shaders gets slightly longer but probably no biggie. The extra variable should be optimized out anyway. Tried doing it with the preprocessor, couldn't get it to work. --- Common/GPU/D3D9/D3D9ShaderCompiler.cpp | 1 - GPU/Common/FragmentShaderGenerator.cpp | 38 +++++++++++++++++--------- GPU/Common/ShaderCommon.cpp | 2 -- GPU/Common/ShaderCommon.h | 1 - 4 files changed, 25 insertions(+), 17 deletions(-) diff --git a/Common/GPU/D3D9/D3D9ShaderCompiler.cpp b/Common/GPU/D3D9/D3D9ShaderCompiler.cpp index 835fbbc9fa..e8585f15f3 100644 --- a/Common/GPU/D3D9/D3D9ShaderCompiler.cpp +++ b/Common/GPU/D3D9/D3D9ShaderCompiler.cpp @@ -40,7 +40,6 @@ LPD3DBLOB CompileShaderToByteCodeD3D9(const char *code, const char *target, std: pShaderCode->Release(); pShaderCode = nullptr; } - pShaderCode = nullptr; } else if (FAILED(hr)) { *errorMessage = GetStringErrorMsg(hr); if (pShaderCode) { diff --git a/GPU/Common/FragmentShaderGenerator.cpp b/GPU/Common/FragmentShaderGenerator.cpp index a74008ca58..03fd832e43 100644 --- a/GPU/Common/FragmentShaderGenerator.cpp +++ b/GPU/Common/FragmentShaderGenerator.cpp @@ -453,22 +453,34 @@ bool GenerateFragmentShader(const FShaderID &id, char *buffer, const ShaderLangu } else { WRITE(p, "void main() {\n"); } + + if (compat.shaderLanguage == HLSL_D3D11 || compat.shaderLanguage == HLSL_D3D9) { + WRITE(p, " vec4 v_color0 = In.v_color0;\n"); + if (lmode) + WRITE(p, " vec3 v_color1 = In.v_color1;\n"); + if (enableFog) { + WRITE(p, " float v_fogdepth = In.v_fogdepth;\n"); + } + if (doTexture) { + WRITE(p, " vec3 v_texcoord = In.v_texcoord;\n"); + } + } + if (isModeClear) { // Clear mode does not allow any fancy shading. - WRITE(p, " vec4 v = %sv_color0;\n", compat.inPrefix); + WRITE(p, " vec4 v = v_color0;\n"); } else { const char *secondary = ""; // Secondary color for specular on top of texture if (lmode) { - WRITE(p, " vec4 s = vec4(%sv_color1, 0.0);\n", compat.inPrefix); + WRITE(p, " vec4 s = vec4(v_color1, 0.0);\n"); secondary = " + s"; } else { secondary = ""; } if (doTexture) { - char texcoord[64]; - snprintf(texcoord, sizeof(texcoord), "%sv_texcoord", compat.inPrefix); + char texcoord[64] = "v_texcoord"; // TODO: Not sure the right way to do this for projection. // This path destroys resolution on older PowerVR no matter what I do if projection is needed, // so we disable it on SGX 540 and lesser, and live with the consequences. @@ -482,11 +494,11 @@ bool GenerateFragmentShader(const FShaderID &id, char *buffer, const ShaderLangu // We may be clamping inside a larger surface (tex = 64x64, buffer=480x272). // We may also be wrapping in such a surface, or either one in a too-small surface. // Obviously, clamping to a smaller surface won't work. But better to clamp to something. - std::string ucoord = StringFromFormat("%sv_texcoord.x", compat.inPrefix); - std::string vcoord = StringFromFormat("%sv_texcoord.y", compat.inPrefix); + std::string ucoord = "v_texcoord.x"; + std::string vcoord = "v_texcoord.y"; if (doTextureProjection) { - ucoord = StringFromFormat("(%sv_texcoord.x / %sv_texcoord.z)", compat.inPrefix, compat.inPrefix); - vcoord = StringFromFormat("(%sv_texcoord.y / %sv_texcoord.z)", compat.inPrefix, compat.inPrefix); + ucoord = "(v_texcoord.x / v_texcoord.z)"; + vcoord = "(v_texcoord.y / v_texcoord.z)"; } std::string modulo = (gl_extensions.bugs & BUG_PVR_SHADER_PRECISION_BAD) ? "mymod" : "mod"; @@ -515,13 +527,13 @@ bool GenerateFragmentShader(const FShaderID &id, char *buffer, const ShaderLangu if (!shaderDepal) { if (compat.shaderLanguage == HLSL_D3D11) { if (doTextureProjection) { - WRITE(p, " vec4 t = tex.Sample(samp, %sv_texcoord.xy / %sv_texcoord.z)%s;\n", compat.inPrefix, compat.inPrefix, bgraTexture ? ".bgra" : ""); + WRITE(p, " vec4 t = tex.Sample(samp, v_texcoord.xy / v_texcoord.z)%s;\n", bgraTexture ? ".bgra" : ""); } else { WRITE(p, " vec4 t = tex.Sample(samp, %s.xy)%s;\n", texcoord, bgraTexture ? ".bgra" : ""); } } else if (compat.shaderLanguage == HLSL_D3D9) { if (doTextureProjection) { - WRITE(p, " vec4 t = tex2Dproj(tex, vec4(%sv_texcoord.x, %sv_texcoord.y, 0, %sv_texcoord.z))%s;\n", compat.inPrefix, compat.inPrefix, compat.inPrefix, bgraTexture ? ".bgra" : ""); + WRITE(p, " vec4 t = tex2Dproj(tex, vec4(v_texcoord.x, v_texcoord.y, 0, v_texcoord.z))%s;\n", bgraTexture ? ".bgra" : ""); } else { WRITE(p, " vec4 t = tex2D(tex, %s.xy)%s;\n", texcoord, bgraTexture ? ".bgra" : ""); } @@ -625,7 +637,7 @@ bool GenerateFragmentShader(const FShaderID &id, char *buffer, const ShaderLangu } if (texFunc != GE_TEXFUNC_REPLACE || !doTextureAlpha) - WRITE(p, " vec4 p = %sv_color0;\n", compat.inPrefix); + WRITE(p, " vec4 p = v_color0;\n"); if (doTextureAlpha) { // texfmt == RGBA switch (texFunc) { @@ -688,11 +700,11 @@ bool GenerateFragmentShader(const FShaderID &id, char *buffer, const ShaderLangu } } else { // No texture mapping - WRITE(p, " vec4 v = %sv_color0 %s;\n", compat.inPrefix, secondary); + WRITE(p, " vec4 v = v_color0 %s;\n", secondary); } if (enableFog) { - WRITE(p, " float fogCoef = clamp(%sv_fogdepth, 0.0, 1.0);\n", compat.inPrefix); + WRITE(p, " float fogCoef = clamp(v_fogdepth, 0.0, 1.0);\n"); WRITE(p, " v = mix(vec4(u_fogcolor, v.a), v, fogCoef);\n"); } diff --git a/GPU/Common/ShaderCommon.cpp b/GPU/Common/ShaderCommon.cpp index 68ca321860..43cd7c1a17 100644 --- a/GPU/Common/ShaderCommon.cpp +++ b/GPU/Common/ShaderCommon.cpp @@ -153,7 +153,6 @@ ShaderLanguageDesc::ShaderLanguageDesc(ShaderLanguage lang) { texelFetch = "texelFetch"; forceMatrix4x4 = false; coefsFromBuffers = true; - inPrefix = ""; break; case HLSL_D3D9: case HLSL_D3D11: @@ -172,7 +171,6 @@ ShaderLanguageDesc::ShaderLanguageDesc(ShaderLanguage lang) { texelFetch = "texelFetch"; forceMatrix4x4 = false; coefsFromBuffers = true; - inPrefix = "In."; break; } } diff --git a/GPU/Common/ShaderCommon.h b/GPU/Common/ShaderCommon.h index b4b005b9f8..c2e77563ad 100644 --- a/GPU/Common/ShaderCommon.h +++ b/GPU/Common/ShaderCommon.h @@ -157,7 +157,6 @@ struct ShaderLanguageDesc { const char *texelFetch = nullptr; const char *lastFragData = nullptr; const char *framebufferFetchExtension = nullptr; - const char *inPrefix = ""; bool glslES30 = false; bool bitwiseOps = false; bool forceMatrix4x4 = false; From fb785f5f0dbfc9ed75d5c9f4c25a0b93d7ece799 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Sun, 1 Nov 2020 11:35:23 +0100 Subject: [PATCH 156/275] Fix an old inconsistency between D3D9 and D3D11 projection matrices. --- GPU/Directx9/ShaderManagerDX9.cpp | 11 +----- GPU/Directx9/ShaderManagerDX9.h | 1 - GPU/Directx9/VertexShaderGeneratorHLSL.cpp | 39 +++++----------------- 3 files changed, 10 insertions(+), 41 deletions(-) diff --git a/GPU/Directx9/ShaderManagerDX9.cpp b/GPU/Directx9/ShaderManagerDX9.cpp index b3259d94a2..14ddf01540 100644 --- a/GPU/Directx9/ShaderManagerDX9.cpp +++ b/GPU/Directx9/ShaderManagerDX9.cpp @@ -224,13 +224,6 @@ void ShaderManagerDX9::VSSetColorUniform3ExtraFloat(int creg, u32 color, float e device_->SetVertexShaderConstantF(creg, col, 1); } -// Utility -void ShaderManagerDX9::VSSetMatrix4x3(int creg, const float *m4x3) { - float m4x4[16]; - ConvertMatrix4x3To4x4Transposed(m4x4, m4x3); - device_->SetVertexShaderConstantF(creg, m4x4, 4); -} - void ShaderManagerDX9::VSSetMatrix4x3_3(int creg, const float *m4x3) { float m3x4[12]; ConvertMatrix4x3To3x4Transposed(m3x4, m4x3); @@ -238,9 +231,7 @@ void ShaderManagerDX9::VSSetMatrix4x3_3(int creg, const float *m4x3) { } void ShaderManagerDX9::VSSetMatrix(int creg, const float* pMatrix) { - float transp[16]; - Transpose4x4(transp, pMatrix); - device_->SetVertexShaderConstantF(creg, transp, 4); + device_->SetVertexShaderConstantF(creg, pMatrix, 4); } // Depth in ogl is between -1;1 we need between 0;1 and optionally reverse it diff --git a/GPU/Directx9/ShaderManagerDX9.h b/GPU/Directx9/ShaderManagerDX9.h index 01d5928531..4f5be85150 100644 --- a/GPU/Directx9/ShaderManagerDX9.h +++ b/GPU/Directx9/ShaderManagerDX9.h @@ -98,7 +98,6 @@ private: inline void PSSetFloat(int creg, float value); inline void PSSetFloatArray(int creg, const float *value, int count); - void VSSetMatrix4x3(int creg, const float *m4x3); void VSSetMatrix4x3_3(int creg, const float *m4x3); inline void VSSetColorUniform3(int creg, u32 color); inline void VSSetColorUniform3ExtraFloat(int creg, u32 color, float extra); diff --git a/GPU/Directx9/VertexShaderGeneratorHLSL.cpp b/GPU/Directx9/VertexShaderGeneratorHLSL.cpp index 1a71e1ce03..926dac1728 100644 --- a/GPU/Directx9/VertexShaderGeneratorHLSL.cpp +++ b/GPU/Directx9/VertexShaderGeneratorHLSL.cpp @@ -382,25 +382,13 @@ bool GenerateVertexShaderHLSL(const VShaderID &id, char *buffer, ShaderLanguage if (enableFog) { WRITE(p, " Out.v_fogdepth = In.position.w;\n"); } - if (lang == HLSL_D3D11) { - if (isModeThrough) { - WRITE(p, " float4 outPos = mul(u_proj_through, vec4(In.position.xyz, 1.0));\n"); - } else { - if (gstate_c.Supports(GPU_ROUND_DEPTH_TO_16BIT)) { - WRITE(p, " vec4 outPos = depthRoundZVP(mul(u_proj, vec4(In.position.xyz, 1.0)));\n"); - } else { - WRITE(p, " vec4 outPos = mul(u_proj, vec4(In.position.xyz, 1.0));\n"); - } - } + if (isModeThrough) { + WRITE(p, " float4 outPos = mul(u_proj_through, vec4(In.position.xyz, 1.0));\n"); } else { - if (isModeThrough) { - WRITE(p, " vec4 outPos = mul(vec4(In.position.xyz, 1.0), u_proj_through);\n"); + if (gstate_c.Supports(GPU_ROUND_DEPTH_TO_16BIT)) { + WRITE(p, " vec4 outPos = depthRoundZVP(mul(u_proj, vec4(In.position.xyz, 1.0)));\n"); } else { - if (gstate_c.Supports(GPU_ROUND_DEPTH_TO_16BIT)) { - WRITE(p, " vec4 outPos = depthRoundZVP(mul(vec4(In.position.xyz, 1.0), u_proj));\n"); - } else { - WRITE(p, " vec4 outPos = mul(vec4(In.position.xyz, 1.0), u_proj);\n"); - } + WRITE(p, " vec4 outPos = mul(u_proj, vec4(In.position.xyz, 1.0));\n"); } } } else { @@ -472,20 +460,11 @@ bool GenerateVertexShaderHLSL(const VShaderID &id, char *buffer, ShaderLanguage WRITE(p, " vec4 viewPos = vec4(mul(vec4(worldpos, 1.0), u_view), 1.0);\n"); - if (lang == HLSL_D3D11) { - // Final view and projection transforms. - if (gstate_c.Supports(GPU_ROUND_DEPTH_TO_16BIT)) { - WRITE(p, " vec4 outPos = depthRoundZVP(mul(u_proj, viewPos));\n"); - } else { - WRITE(p, " vec4 outPos = mul(u_proj, viewPos);\n"); - } + // Final view and projection transforms. + if (gstate_c.Supports(GPU_ROUND_DEPTH_TO_16BIT)) { + WRITE(p, " vec4 outPos = depthRoundZVP(mul(u_proj, viewPos));\n"); } else { - // Final view and projection transforms. - if (gstate_c.Supports(GPU_ROUND_DEPTH_TO_16BIT)) { - WRITE(p, " vec4 outPos = depthRoundZVP(mul(viewPos, u_proj));\n"); - } else { - WRITE(p, " vec4 outPos = mul(viewPos, u_proj);\n"); - } + WRITE(p, " vec4 outPos = mul(u_proj, viewPos);\n"); } // TODO: Declare variables for dots for shade mapping if needed. From 0938d495d974f7d6b73a79ac3e1e1f0001df0e4b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Sun, 1 Nov 2020 11:48:55 +0100 Subject: [PATCH 157/275] Remove a redundant bit from vertex shader IDs. (complicates automated testing of shader generation) Should have no noticeable effects. --- GPU/Common/ShaderId.cpp | 8 +++----- GPU/Common/ShaderId.h | 2 +- GPU/Directx9/VertexShaderGeneratorHLSL.cpp | 2 +- GPU/GLES/ShaderManagerGLES.cpp | 2 +- GPU/GLES/VertexShaderGeneratorGLES.cpp | 2 +- GPU/Vulkan/ShaderManagerVulkan.cpp | 2 +- 6 files changed, 8 insertions(+), 10 deletions(-) diff --git a/GPU/Common/ShaderId.cpp b/GPU/Common/ShaderId.cpp index 3f5864161a..37b01d0c1b 100644 --- a/GPU/Common/ShaderId.cpp +++ b/GPU/Common/ShaderId.cpp @@ -23,12 +23,12 @@ std::string VertexShaderDesc(const VShaderID &id) { if (id.Bit(VS_BIT_ENABLE_FOG)) desc << "Fog "; if (id.Bit(VS_BIT_NORM_REVERSE)) desc << "RevN "; if (id.Bit(VS_BIT_DO_TEXTURE)) desc << "Tex "; - if (id.Bit(VS_BIT_DO_TEXTURE_TRANSFORM)) { + int uvgMode = id.Bits(VS_BIT_UVGEN_MODE, 2); + if (uvgMode == GE_TEXMAP_TEXTURE_MATRIX) { int uvprojMode = id.Bits(VS_BIT_UVPROJ_MODE, 2); const char *uvprojModes[4] = { "TexProjPos ", "TexProjUV ", "TexProjNNrm ", "TexProjNrm " }; desc << uvprojModes[uvprojMode]; } - int uvgMode = id.Bits(VS_BIT_UVGEN_MODE, 2); const char *uvgModes[4] = { "UV ", "UVMtx ", "UVEnv ", "UVUnk " }; int ls0 = id.Bits(VS_BIT_LS0, 2); int ls1 = id.Bits(VS_BIT_LS1, 2); @@ -63,7 +63,6 @@ std::string VertexShaderDesc(const VShaderID &id) { void ComputeVertexShaderID(VShaderID *id_out, u32 vertType, bool useHWTransform, bool useHWTessellation) { bool isModeThrough = (vertType & GE_VTYPE_THROUGH) != 0; bool doTexture = gstate.isTextureMapEnabled() && !gstate.isModeClear(); - bool doTextureTransform = gstate.getUVGenMode() == GE_TEXMAP_TEXTURE_MATRIX; bool doShadeMapping = doTexture && (gstate.getUVGenMode() == GE_TEXMAP_ENVIRONMENT_MAP); bool doFlatShading = gstate.getShadeMode() == GE_SHADE_FLAT && !gstate.isModeClear(); @@ -85,7 +84,6 @@ void ComputeVertexShaderID(VShaderID *id_out, u32 vertType, bool useHWTransform, if (doTexture) { id.SetBit(VS_BIT_DO_TEXTURE); - id.SetBit(VS_BIT_DO_TEXTURE_TRANSFORM, doTextureTransform); } if (useHWTransform) { @@ -96,7 +94,7 @@ void ComputeVertexShaderID(VShaderID *id_out, u32 vertType, bool useHWTransform, id.SetBits(VS_BIT_UVGEN_MODE, 2, gstate.getUVGenMode()); // The next bits are used differently depending on UVgen mode - if (doTextureTransform) { + if (gstate.getUVGenMode() == GE_TEXMAP_TEXTURE_MATRIX) { id.SetBits(VS_BIT_UVPROJ_MODE, 2, gstate.getUVProjMode()); } else if (doShadeMapping) { id.SetBits(VS_BIT_LS0, 2, gstate.getUVLS0()); diff --git a/GPU/Common/ShaderId.h b/GPU/Common/ShaderId.h index e6cf46be68..1c8c5f93d4 100644 --- a/GPU/Common/ShaderId.h +++ b/GPU/Common/ShaderId.h @@ -16,7 +16,7 @@ enum VShaderBit : uint8_t { VS_BIT_HAS_COLOR = 3, VS_BIT_DO_TEXTURE = 4, // 5 is free. - VS_BIT_DO_TEXTURE_TRANSFORM = 6, + // 6 is free, // 7 is free. VS_BIT_USE_HW_TRANSFORM = 8, VS_BIT_HAS_NORMAL = 9, // conditioned on hw transform diff --git a/GPU/Directx9/VertexShaderGeneratorHLSL.cpp b/GPU/Directx9/VertexShaderGeneratorHLSL.cpp index 926dac1728..e0a4b57887 100644 --- a/GPU/Directx9/VertexShaderGeneratorHLSL.cpp +++ b/GPU/Directx9/VertexShaderGeneratorHLSL.cpp @@ -49,9 +49,9 @@ bool GenerateVertexShaderHLSL(const VShaderID &id, char *buffer, ShaderLanguage bool isModeThrough = id.Bit(VS_BIT_IS_THROUGH); bool lmode = id.Bit(VS_BIT_LMODE); bool doTexture = id.Bit(VS_BIT_DO_TEXTURE); - bool doTextureTransform = id.Bit(VS_BIT_DO_TEXTURE_TRANSFORM); GETexMapMode uvGenMode = static_cast(id.Bits(VS_BIT_UVGEN_MODE, 2)); + bool doTextureTransform = uvGenMode == GE_TEXMAP_TEXTURE_MATRIX; // this is only valid for some settings of uvGenMode GETexProjMapMode uvProjMode = static_cast(id.Bits(VS_BIT_UVPROJ_MODE, 2)); diff --git a/GPU/GLES/ShaderManagerGLES.cpp b/GPU/GLES/ShaderManagerGLES.cpp index cc6669f74d..44ce55e9dc 100644 --- a/GPU/GLES/ShaderManagerGLES.cpp +++ b/GPU/GLES/ShaderManagerGLES.cpp @@ -910,7 +910,7 @@ std::string ShaderManagerGLES::DebugGetShaderString(std::string id, DebugShaderT // as sometimes these features might have an effect on the ID bits. #define CACHE_HEADER_MAGIC 0x83277592 -#define CACHE_VERSION 14 +#define CACHE_VERSION 15 struct CacheHeader { uint32_t magic; uint32_t version; diff --git a/GPU/GLES/VertexShaderGeneratorGLES.cpp b/GPU/GLES/VertexShaderGeneratorGLES.cpp index d9e26c69bc..63ffba3d29 100644 --- a/GPU/GLES/VertexShaderGeneratorGLES.cpp +++ b/GPU/GLES/VertexShaderGeneratorGLES.cpp @@ -141,9 +141,9 @@ bool GenerateVertexShaderGLSL(const VShaderID &id, char *buffer, const ShaderLan bool isModeThrough = id.Bit(VS_BIT_IS_THROUGH); bool lmode = id.Bit(VS_BIT_LMODE); bool doTexture = id.Bit(VS_BIT_DO_TEXTURE); - bool doTextureTransform = id.Bit(VS_BIT_DO_TEXTURE_TRANSFORM); GETexMapMode uvGenMode = static_cast(id.Bits(VS_BIT_UVGEN_MODE, 2)); + bool doTextureTransform = uvGenMode == GE_TEXMAP_TEXTURE_MATRIX; // this is only valid for some settings of uvGenMode GETexProjMapMode uvProjMode = static_cast(id.Bits(VS_BIT_UVPROJ_MODE, 2)); diff --git a/GPU/Vulkan/ShaderManagerVulkan.cpp b/GPU/Vulkan/ShaderManagerVulkan.cpp index 3b4b8b7a63..e1c6cbee59 100644 --- a/GPU/Vulkan/ShaderManagerVulkan.cpp +++ b/GPU/Vulkan/ShaderManagerVulkan.cpp @@ -368,7 +368,7 @@ VulkanFragmentShader *ShaderManagerVulkan::GetFragmentShaderFromModule(VkShaderM // instantaneous. #define CACHE_HEADER_MAGIC 0xff51f420 -#define CACHE_VERSION 18 +#define CACHE_VERSION 19 struct VulkanCacheHeader { uint32_t magic; uint32_t version; From 2e9f42a75f494779517a8c6953025d4f6cba7314 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Sun, 1 Nov 2020 18:05:39 +0100 Subject: [PATCH 158/275] Fix #version statement in GLES 2 fragment shaders --- GPU/Common/FragmentShaderGenerator.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/GPU/Common/FragmentShaderGenerator.cpp b/GPU/Common/FragmentShaderGenerator.cpp index 03fd832e43..1518ddbc1a 100644 --- a/GPU/Common/FragmentShaderGenerator.cpp +++ b/GPU/Common/FragmentShaderGenerator.cpp @@ -96,7 +96,7 @@ bool GenerateFragmentShader(const FShaderID &id, char *buffer, const ShaderLangu break; default: // OpenGL - WRITE(p, "#version %d%s\n", compat.glslVersionNumber, compat.gles ? " es" : ""); + WRITE(p, "#version %d%s\n", compat.glslVersionNumber, compat.glslES30 ? " es" : ""); WRITE(p, "#define DISCARD discard\n"); if (stencilToAlpha == REPLACE_ALPHA_DUALSOURCE && gl_extensions.EXT_blend_func_extended) { From 4053c3d1ecf3dfdcde94bf9e197c20bcf13b3e66 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Sun, 1 Nov 2020 18:06:03 +0100 Subject: [PATCH 159/275] Fix #version statement for GLES 2.0 vertex shaders --- GPU/GLES/VertexShaderGeneratorGLES.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/GPU/GLES/VertexShaderGeneratorGLES.cpp b/GPU/GLES/VertexShaderGeneratorGLES.cpp index 63ffba3d29..4bcd6963e7 100644 --- a/GPU/GLES/VertexShaderGeneratorGLES.cpp +++ b/GPU/GLES/VertexShaderGeneratorGLES.cpp @@ -122,7 +122,7 @@ bool GenerateVertexShaderGLSL(const VShaderID &id, char *buffer, const ShaderLan highpFog = (gl_extensions.bugs & BUG_PVR_SHADER_PRECISION_BAD) ? true : false; highpTexcoord = highpFog; } - WRITE(p, "#version %d%s\n", compat.glslVersionNumber, compat.gles ? " es" : ""); + WRITE(p, "#version %d%s\n", compat.glslVersionNumber, compat.glslES30 ? " es" : ""); WRITE(p, "#define splat3(x) vec3(x)\n"); } From 105a6ce920bfb3baf19e6625bf8b387e43f7b649 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Sun, 1 Nov 2020 19:53:08 +0100 Subject: [PATCH 160/275] Oops, seems I screwed those #version statements up worse. --- GPU/Common/FragmentShaderGenerator.cpp | 2 +- GPU/GLES/VertexShaderGeneratorGLES.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/GPU/Common/FragmentShaderGenerator.cpp b/GPU/Common/FragmentShaderGenerator.cpp index 1518ddbc1a..f593c82115 100644 --- a/GPU/Common/FragmentShaderGenerator.cpp +++ b/GPU/Common/FragmentShaderGenerator.cpp @@ -96,7 +96,7 @@ bool GenerateFragmentShader(const FShaderID &id, char *buffer, const ShaderLangu break; default: // OpenGL - WRITE(p, "#version %d%s\n", compat.glslVersionNumber, compat.glslES30 ? " es" : ""); + WRITE(p, "#version %d%s\n", compat.glslVersionNumber, compat.gles && compat.glslES30 ? " es" : ""); WRITE(p, "#define DISCARD discard\n"); if (stencilToAlpha == REPLACE_ALPHA_DUALSOURCE && gl_extensions.EXT_blend_func_extended) { diff --git a/GPU/GLES/VertexShaderGeneratorGLES.cpp b/GPU/GLES/VertexShaderGeneratorGLES.cpp index 4bcd6963e7..e412f50232 100644 --- a/GPU/GLES/VertexShaderGeneratorGLES.cpp +++ b/GPU/GLES/VertexShaderGeneratorGLES.cpp @@ -122,7 +122,7 @@ bool GenerateVertexShaderGLSL(const VShaderID &id, char *buffer, const ShaderLan highpFog = (gl_extensions.bugs & BUG_PVR_SHADER_PRECISION_BAD) ? true : false; highpTexcoord = highpFog; } - WRITE(p, "#version %d%s\n", compat.glslVersionNumber, compat.glslES30 ? " es" : ""); + WRITE(p, "#version %d%s\n", compat.glslVersionNumber, compat.gles && compat.glslES30 ? " es" : ""); WRITE(p, "#define splat3(x) vec3(x)\n"); } From fbb7f72eec6248b790732a24c1d4707add5acc63 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Sat, 31 Oct 2020 22:48:40 +0100 Subject: [PATCH 161/275] Vertex shader merge work --- GPU/Common/ShaderCommon.h | 3 + GPU/Directx9/VertexShaderGeneratorHLSL.cpp | 13 +- GPU/Directx9/VertexShaderGeneratorHLSL.h | 36 +--- GPU/GLES/VertexShaderGeneratorGLES.cpp | 212 ++++++++++++++++++--- GPU/GLES/VertexShaderGeneratorGLES.h | 35 ++++ unittest/TestShaderGenerators.cpp | 120 ++++++------ 6 files changed, 296 insertions(+), 123 deletions(-) diff --git a/GPU/Common/ShaderCommon.h b/GPU/Common/ShaderCommon.h index c2e77563ad..456ff0f392 100644 --- a/GPU/Common/ShaderCommon.h +++ b/GPU/Common/ShaderCommon.h @@ -30,6 +30,9 @@ enum ShaderLanguage { GLSL_VULKAN, HLSL_D3D9, HLSL_D3D11, + + HLSL_D3D9_TEST, + HLSL_D3D11_TEST, }; inline bool ShaderLanguageIsOpenGL(ShaderLanguage lang) { diff --git a/GPU/Directx9/VertexShaderGeneratorHLSL.cpp b/GPU/Directx9/VertexShaderGeneratorHLSL.cpp index e0a4b57887..5e301cb1fa 100644 --- a/GPU/Directx9/VertexShaderGeneratorHLSL.cpp +++ b/GPU/Directx9/VertexShaderGeneratorHLSL.cpp @@ -43,6 +43,8 @@ static const char * const boneWeightAttrDecl[9] = { "vec4 a_w1:TEXCOORD1;\n vec4 a_w2:TEXCOORD2;\n", }; +extern const char *hlsl_preamble_vs; + bool GenerateVertexShaderHLSL(const VShaderID &id, char *buffer, ShaderLanguage lang, std::string *errorString) { char *p = buffer; @@ -101,12 +103,7 @@ bool GenerateVertexShaderHLSL(const VShaderID &id, char *buffer, ShaderLanguage } // Output some compatibility defines - WRITE(p, "#define vec2 float2\n"); - WRITE(p, "#define vec3 float3\n"); - WRITE(p, "#define vec4 float4\n"); - WRITE(p, "#define mat4 float4x4\n"); - WRITE(p, "#define mat3x4 float4x3\n"); // note how the conventions are backwards - WRITE(p, "#define splat3(x) vec3(x, x, x)\n"); + WRITE(p, "%s", hlsl_preamble_vs); if (lang == HLSL_D3D9) { WRITE(p, "#pragma warning( disable : 3571 )\n"); @@ -399,9 +396,9 @@ bool GenerateVertexShaderHLSL(const VShaderID &id, char *buffer, ShaderLanguage WRITE(p, " Tess tess;\n"); WRITE(p, " tessellate(In, tess);\n"); - WRITE(p, " vec3 worldpos = mul(vec4(tess.pos.xyz, 1.0), u_world);\n"); + WRITE(p, " vec3 worldpos = mul(vec4(tess.pos.xyz, 1.0), u_world).xyz;\n"); if (hasNormalTess) - WRITE(p, " vec3 worldnormal = normalize(mul(vec4(%stess.nrm, 0.0), u_world));\n", flipNormalTess ? "-" : ""); + WRITE(p, " vec3 worldnormal = normalize(mul(vec4(%stess.nrm, 0.0), u_world)).xyz;\n", flipNormalTess ? "-" : ""); else WRITE(p, " vec3 worldnormal = vec3(0.0, 0.0, 1.0);\n"); } else { diff --git a/GPU/Directx9/VertexShaderGeneratorHLSL.h b/GPU/Directx9/VertexShaderGeneratorHLSL.h index 08adab846c..90900328d5 100644 --- a/GPU/Directx9/VertexShaderGeneratorHLSL.h +++ b/GPU/Directx9/VertexShaderGeneratorHLSL.h @@ -18,40 +18,8 @@ #pragma once #include + #include "GPU/Common/ShaderID.h" +#include "GPU/GLES/VertexShaderGeneratorGLES.h" bool GenerateVertexShaderHLSL(const VShaderID &id, char *buffer, ShaderLanguage lang, std::string *errorString); - -enum { - CONST_VS_PROJ = 0, - CONST_VS_PROJ_THROUGH = 4, - CONST_VS_VIEW = 8, - CONST_VS_WORLD = 11, - CONST_VS_TEXMTX = 14, - CONST_VS_UVSCALEOFFSET = 17, - CONST_VS_FOGCOEF = 18, - CONST_VS_AMBIENT = 19, - CONST_VS_MATAMBIENTALPHA = 20, - CONST_VS_MATDIFFUSE = 21, - CONST_VS_MATSPECULAR = 22, - CONST_VS_MATEMISSIVE = 23, - CONST_VS_LIGHTPOS = 24, - CONST_VS_LIGHTDIR = 28, - CONST_VS_LIGHTATT = 32, - CONST_VS_LIGHTANGLE_SPOTCOEF = 36, - CONST_VS_LIGHTDIFFUSE = 40, - CONST_VS_LIGHTSPECULAR = 44, - CONST_VS_LIGHTAMBIENT = 48, - CONST_VS_DEPTHRANGE = 52, - CONST_VS_BONE0 = 53, - CONST_VS_BONE1 = 56, - CONST_VS_BONE2 = 59, - CONST_VS_BONE3 = 62, - CONST_VS_BONE4 = 65, - CONST_VS_BONE5 = 68, - CONST_VS_BONE6 = 71, - CONST_VS_BONE7 = 74, - CONST_VS_BONE8 = 77, - CONST_VS_CULLRANGEMIN = 80, - CONST_VS_CULLRANGEMAX = 81, -}; diff --git a/GPU/GLES/VertexShaderGeneratorGLES.cpp b/GPU/GLES/VertexShaderGeneratorGLES.cpp index e412f50232..065a1e5647 100644 --- a/GPU/GLES/VertexShaderGeneratorGLES.cpp +++ b/GPU/GLES/VertexShaderGeneratorGLES.cpp @@ -103,7 +103,19 @@ const char *vulkan_glsl_preamble_vs = "#version 450\n" "#extension GL_ARB_separate_shader_objects : enable\n" "#extension GL_ARB_shading_language_420pack : enable\n" -"#define splat3(x) vec3(x)\n\n"; +"#define mul(x, y) x * y\n" +"#define splat3(x) vec3(x)\n" +"#define lowp\n" +"#define mediump\n" +"#define highp\n\n"; + +const char *hlsl_preamble_vs = +"#define vec2 float2\n" +"#define vec3 float3\n" +"#define vec4 float4\n" +"#define mat4 float4x4\n" +"#define mat3x4 float4x3\n" // note how the conventions are backwards +"#define splat3(x) vec3(x, x, x)\n"; bool GenerateVertexShaderGLSL(const VShaderID &id, char *buffer, const ShaderLanguageDesc &compat, uint32_t *attrMask, uint64_t *uniformMask, std::string *errorString) { *attrMask = 0; @@ -115,7 +127,9 @@ bool GenerateVertexShaderGLSL(const VShaderID &id, char *buffer, const ShaderLan char *p = buffer; if (compat.shaderLanguage == GLSL_VULKAN) { WRITE(p, "%s", vulkan_glsl_preamble_vs); - } else { + } else if (compat.shaderLanguage == HLSL_D3D11 || compat.shaderLanguage == HLSL_D3D9) { + WRITE(p, "%s", hlsl_preamble_vs); + } else if (ShaderLanguageIsOpenGL(compat.shaderLanguage)) { if (compat.gles) { // PowerVR needs highp to do the fog in MHU correctly. // Others don't, and some can't handle highp in the fragment shader. @@ -123,19 +137,18 @@ bool GenerateVertexShaderGLSL(const VShaderID &id, char *buffer, const ShaderLan highpTexcoord = highpFog; } WRITE(p, "#version %d%s\n", compat.glslVersionNumber, compat.gles && compat.glslES30 ? " es" : ""); + if (gl_extensions.EXT_gpu_shader4) { + WRITE(p, "#extension GL_EXT_gpu_shader4 : enable\n"); + } + if (compat.gles) { + WRITE(p, "precision highp float;\n"); + } else { + WRITE(p, "#define lowp\n"); + WRITE(p, "#define mediump\n"); + WRITE(p, "#define highp\n"); + } WRITE(p, "#define splat3(x) vec3(x)\n"); - } - - if (ShaderLanguageIsOpenGL(compat.shaderLanguage) && gl_extensions.EXT_gpu_shader4) { - WRITE(p, "#extension GL_EXT_gpu_shader4 : enable\n"); - } - - if (compat.gles) { - WRITE(p, "precision highp float;\n"); - } else if (compat.shaderLanguage != GLSL_VULKAN) { - WRITE(p, "#define lowp\n"); - WRITE(p, "#define mediump\n"); - WRITE(p, "#define highp\n"); + WRITE(p, "#define mul(x, y) x * y\n"); } bool isModeThrough = id.Bit(VS_BIT_IS_THROUGH); @@ -175,15 +188,6 @@ bool GenerateVertexShaderGLSL(const VShaderID &id, char *buffer, const ShaderLan bool hasNormalTess = id.Bit(VS_BIT_HAS_NORMAL_TESS); bool flipNormalTess = id.Bit(VS_BIT_NORM_REVERSE_TESS); - if (compat.shaderLanguage == GLSL_VULKAN) { - WRITE(p, "\n"); - WRITE(p, "layout (std140, set = 0, binding = 3) uniform baseVars {\n%s};\n", ub_baseStr); - if (enableLighting || doShadeMapping) - WRITE(p, "layout (std140, set = 0, binding = 4) uniform lightVars {\n%s};\n", ub_vs_lightsStr); - if (enableBones) - WRITE(p, "layout (std140, set = 0, binding = 5) uniform boneVars {\n%s};\n", ub_vs_bonesStr); - } - const char *shading = ""; if (compat.glslES30 || compat.shaderLanguage == GLSL_VULKAN) shading = doFlatShading ? "flat " : ""; @@ -205,6 +209,13 @@ bool GenerateVertexShaderGLSL(const VShaderID &id, char *buffer, const ShaderLan bool texcoordInVec3 = false; if (compat.shaderLanguage == GLSL_VULKAN) { + WRITE(p, "\n"); + WRITE(p, "layout (std140, set = 0, binding = 3) uniform baseVars {\n%s};\n", ub_baseStr); + if (enableLighting || doShadeMapping) + WRITE(p, "layout (std140, set = 0, binding = 4) uniform lightVars {\n%s};\n", ub_vs_lightsStr); + if (enableBones) + WRITE(p, "layout (std140, set = 0, binding = 5) uniform boneVars {\n%s};\n", ub_vs_bonesStr); + if (enableBones) { numBoneWeights = 1 + id.Bits(VS_BIT_BONES, 3); WRITE(p, "%s", boneWeightDecl[numBoneWeights]); @@ -245,6 +256,146 @@ bool GenerateVertexShaderGLSL(const VShaderID &id, char *buffer, const ShaderLan // See the fragment shader generator WRITE(p, "layout (location = 3) out float v_fogdepth;\n"); } + } else if (compat.shaderLanguage == HLSL_D3D11 || compat.shaderLanguage == HLSL_D3D9) { + // Note: These two share some code after this hellishly large if/else. + if (compat.shaderLanguage == HLSL_D3D11) { + WRITE(p, "cbuffer base : register(b0) {\n%s};\n", cb_baseStr); + WRITE(p, "cbuffer lights: register(b1) {\n%s};\n", cb_vs_lightsStr); + WRITE(p, "cbuffer bones : register(b2) {\n%s};\n", cb_vs_bonesStr); + } else { + WRITE(p, "#pragma warning( disable : 3571 )\n"); + if (isModeThrough) { + WRITE(p, "float4x4 u_proj_through : register(c%i);\n", CONST_VS_PROJ_THROUGH); + } else { + WRITE(p, "float4x4 u_proj : register(c%i);\n", CONST_VS_PROJ); + // Add all the uniforms we'll need to transform properly. + } + + if (enableFog) { + WRITE(p, "vec2 u_fogcoef : register(c%i);\n", CONST_VS_FOGCOEF); + } + if (useHWTransform || !hasColor) + WRITE(p, "vec4 u_matambientalpha : register(c%i);\n", CONST_VS_MATAMBIENTALPHA); // matambient + matalpha + + if (useHWTransform) { + // When transforming by hardware, we need a great deal more uniforms... + WRITE(p, "mat3x4 u_world : register(c%i);\n", CONST_VS_WORLD); + WRITE(p, "mat3x4 u_view : register(c%i);\n", CONST_VS_VIEW); + if (doTextureTransform) + WRITE(p, "mat3x4 u_texmtx : register(c%i);\n", CONST_VS_TEXMTX); + if (enableBones) { +#ifdef USE_BONE_ARRAY + WRITE(p, "mat3x4 u_bone[%i] : register(c%i);\n", numBones, CONST_VS_BONE0); +#else + for (int i = 0; i < numBoneWeights; i++) { + WRITE(p, "mat3x4 u_bone%i : register(c%i);\n", i, CONST_VS_BONE0 + i * 3); + } +#endif + } + if (doTexture) { + WRITE(p, "vec4 u_uvscaleoffset : register(c%i);\n", CONST_VS_UVSCALEOFFSET); + } + for (int i = 0; i < 4; i++) { + if (doLight[i] != LIGHT_OFF) { + // This is needed for shade mapping + WRITE(p, "vec3 u_lightpos%i : register(c%i);\n", i, CONST_VS_LIGHTPOS + i); + } + if (doLight[i] == LIGHT_FULL) { + GELightType type = static_cast(id.Bits(VS_BIT_LIGHT0_TYPE + 4 * i, 2)); + GELightComputation comp = static_cast(id.Bits(VS_BIT_LIGHT0_COMP + 4 * i, 2)); + + if (type != GE_LIGHTTYPE_DIRECTIONAL) + WRITE(p, "vec3 u_lightatt%i : register(c%i);\n", i, CONST_VS_LIGHTATT + i); + + if (type == GE_LIGHTTYPE_SPOT || type == GE_LIGHTTYPE_UNKNOWN) { + WRITE(p, "vec3 u_lightdir%i : register(c%i);\n", i, CONST_VS_LIGHTDIR + i); + WRITE(p, "vec4 u_lightangle_spotCoef%i : register(c%i);\n", i, CONST_VS_LIGHTANGLE_SPOTCOEF + i); + } + WRITE(p, "vec3 u_lightambient%i : register(c%i);\n", i, CONST_VS_LIGHTAMBIENT + i); + WRITE(p, "vec3 u_lightdiffuse%i : register(c%i);\n", i, CONST_VS_LIGHTDIFFUSE + i); + + if (comp == GE_LIGHTCOMP_BOTH) { + WRITE(p, "vec3 u_lightspecular%i : register(c%i);\n", i, CONST_VS_LIGHTSPECULAR + i); + } + } + } + if (enableLighting) { + WRITE(p, "vec4 u_ambient : register(c%i);\n", CONST_VS_AMBIENT); + if ((matUpdate & 2) == 0 || !hasColor) + WRITE(p, "vec3 u_matdiffuse : register(c%i);\n", CONST_VS_MATDIFFUSE); + // if ((matUpdate & 4) == 0) + WRITE(p, "vec4 u_matspecular : register(c%i);\n", CONST_VS_MATSPECULAR); // Specular coef is contained in alpha + WRITE(p, "vec3 u_matemissive : register(c%i);\n", CONST_VS_MATEMISSIVE); + } + } + + if (!isModeThrough && gstate_c.Supports(GPU_ROUND_DEPTH_TO_16BIT)) { + WRITE(p, "vec4 u_depthRange : register(c%i);\n", CONST_VS_DEPTHRANGE); + } + if (!isModeThrough) { + WRITE(p, "vec4 u_cullRangeMin : register(c%i);\n", CONST_VS_CULLRANGEMIN); + WRITE(p, "vec4 u_cullRangeMax : register(c%i);\n", CONST_VS_CULLRANGEMAX); + } + } + + // And the "varyings". + if (useHWTransform) { + WRITE(p, "struct VS_IN { \n"); + if ((doSpline || doBezier) && compat.shaderLanguage == HLSL_D3D11) { + WRITE(p, " uint instanceId : SV_InstanceID;\n"); + } + if (enableBones) { + WRITE(p, " %s", boneWeightAttrDecl[numBoneWeights]); + } + if (doTexture && hasTexcoord) { + WRITE(p, " vec2 texcoord : TEXCOORD0;\n"); + } + if (hasColor) { + WRITE(p, " vec4 color0 : COLOR0;\n"); + } + if (hasNormal) { + WRITE(p, " vec3 normal : NORMAL;\n"); + } + WRITE(p, " vec3 position : POSITION;\n"); + WRITE(p, "};\n"); + } else { + WRITE(p, "struct VS_IN {\n"); + WRITE(p, " vec4 position : POSITION;\n"); + if (doTexture && hasTexcoord) { + if (doTextureTransform && !isModeThrough) { + texcoordInVec3 = true; + WRITE(p, " vec3 texcoord : TEXCOORD0;\n"); + } else + WRITE(p, " vec2 texcoord : TEXCOORD0;\n"); + } + if (hasColor) { + WRITE(p, " vec4 color0 : COLOR0;\n"); + } + // only software transform supplies color1 as vertex data + if (lmode) { + WRITE(p, " vec4 color1 : COLOR1;\n"); + } + WRITE(p, "};\n"); + } + + WRITE(p, "struct VS_OUT {\n"); + if (doTexture) { + WRITE(p, " vec3 v_texcoord : TEXCOORD0;\n"); + } + const char *colorInterpolation = doFlatShading && compat.shaderLanguage == HLSL_D3D11 ? "nointerpolation " : ""; + WRITE(p, " %svec4 v_color0 : COLOR0;\n", colorInterpolation); + if (lmode) + WRITE(p, " vec3 v_color1 : COLOR1;\n"); + + if (enableFog) { + WRITE(p, " float v_fogdepth: TEXCOORD1;\n"); + } + if (compat.shaderLanguage == HLSL_D3D9) { + WRITE(p, " vec4 gl_Position : POSITION;\n"); + } else { + WRITE(p, " vec4 gl_Position : SV_Position;\n"); + } + WRITE(p, "};\n"); } else { if (enableBones) { numBoneWeights = 1 + id.Bits(VS_BIT_BONES, 3); @@ -542,7 +693,12 @@ bool GenerateVertexShaderGLSL(const VShaderID &id, char *buffer, const ShaderLan WRITE(p, "}\n"); } - WRITE(p, "void main() {\n"); + if (ShaderLanguageIsOpenGL(compat.shaderLanguage) || compat.shaderLanguage == GLSL_VULKAN) { + WRITE(p, "void main() {\n"); + } else if (compat.shaderLanguage == HLSL_D3D9 || compat.shaderLanguage == HLSL_D3D11) { + WRITE(p, "VS_OUT main(VS_IN In) {\n"); + WRITE(p, " VS_OUT Out;\n"); + } if (!useHWTransform) { // Simple pass-through of vertex data to fragment shader @@ -583,17 +739,17 @@ bool GenerateVertexShaderGLSL(const VShaderID &id, char *buffer, const ShaderLan WRITE(p, " Tess tess;\n"); WRITE(p, " tessellate(tess);\n"); - WRITE(p, " vec3 worldpos = (vec4(tess.pos.xyz, 1.0) * u_world).xyz;\n"); + WRITE(p, " vec3 worldpos = mul(vec4(tess.pos.xyz, 1.0), u_world).xyz;\n"); if (hasNormalTess) { - WRITE(p, " mediump vec3 worldnormal = normalize((vec4(%stess.nrm, 0.0) * u_world).xyz);\n", flipNormalTess ? "-" : ""); + WRITE(p, " mediump vec3 worldnormal = normalize(mul(vec4(%stess.nrm, 0.0), u_world).xyz);\n", flipNormalTess ? "-" : ""); } else { WRITE(p, " mediump vec3 worldnormal = vec3(0.0, 0.0, 1.0);\n"); } } else { // No skinning, just standard T&L. - WRITE(p, " vec3 worldpos = (vec4(position.xyz, 1.0) * u_world).xyz;\n"); + WRITE(p, " vec3 worldpos = mul(vec4(position.xyz, 1.0), u_world).xyz;\n"); if (hasNormal) - WRITE(p, " mediump vec3 worldnormal = normalize((vec4(%snormal, 0.0) * u_world).xyz);\n", flipNormal ? "-" : ""); + WRITE(p, " mediump vec3 worldnormal = normalize(mul(vec4(%snormal, 0.0), u_world).xyz);\n", flipNormal ? "-" : ""); else WRITE(p, " mediump vec3 worldnormal = vec3(0.0, 0.0, 1.0);\n"); } diff --git a/GPU/GLES/VertexShaderGeneratorGLES.h b/GPU/GLES/VertexShaderGeneratorGLES.h index df42bd4d11..743cea026a 100644 --- a/GPU/GLES/VertexShaderGeneratorGLES.h +++ b/GPU/GLES/VertexShaderGeneratorGLES.h @@ -22,3 +22,38 @@ struct VShaderID; bool GenerateVertexShaderGLSL(const VShaderID &id, char *buffer, const ShaderLanguageDesc &compat, uint32_t *attrMask, uint64_t *uniformMask, std::string *errorString); + +// D3D9 constants. +enum { + CONST_VS_PROJ = 0, + CONST_VS_PROJ_THROUGH = 4, + CONST_VS_VIEW = 8, + CONST_VS_WORLD = 11, + CONST_VS_TEXMTX = 14, + CONST_VS_UVSCALEOFFSET = 17, + CONST_VS_FOGCOEF = 18, + CONST_VS_AMBIENT = 19, + CONST_VS_MATAMBIENTALPHA = 20, + CONST_VS_MATDIFFUSE = 21, + CONST_VS_MATSPECULAR = 22, + CONST_VS_MATEMISSIVE = 23, + CONST_VS_LIGHTPOS = 24, + CONST_VS_LIGHTDIR = 28, + CONST_VS_LIGHTATT = 32, + CONST_VS_LIGHTANGLE_SPOTCOEF = 36, + CONST_VS_LIGHTDIFFUSE = 40, + CONST_VS_LIGHTSPECULAR = 44, + CONST_VS_LIGHTAMBIENT = 48, + CONST_VS_DEPTHRANGE = 52, + CONST_VS_BONE0 = 53, + CONST_VS_BONE1 = 56, + CONST_VS_BONE2 = 59, + CONST_VS_BONE3 = 62, + CONST_VS_BONE4 = 65, + CONST_VS_BONE5 = 68, + CONST_VS_BONE6 = 71, + CONST_VS_BONE7 = 74, + CONST_VS_BONE8 = 77, + CONST_VS_CULLRANGEMIN = 80, + CONST_VS_CULLRANGEMAX = 81, +}; diff --git a/unittest/TestShaderGenerators.cpp b/unittest/TestShaderGenerators.cpp index bd91558ca1..eed6e9b9d0 100644 --- a/unittest/TestShaderGenerators.cpp +++ b/unittest/TestShaderGenerators.cpp @@ -39,11 +39,13 @@ bool GenerateFShader(FShaderID id, char *buffer, ShaderLanguage lang, std::strin return GenerateFragmentShader(id, buffer, compat, &uniformMask, errorString); } case ShaderLanguage::HLSL_D3D9: + case ShaderLanguage::HLSL_D3D9_TEST: { ShaderLanguageDesc compat(ShaderLanguage::HLSL_D3D9); return GenerateFragmentShader(id, buffer, compat, &uniformMask, errorString); } case ShaderLanguage::HLSL_D3D11: + case ShaderLanguage::HLSL_D3D11_TEST: { ShaderLanguageDesc compat(ShaderLanguage::HLSL_D3D11); return GenerateFragmentShader(id, buffer, compat, &uniformMask, errorString); @@ -72,6 +74,16 @@ bool GenerateVShader(VShaderID id, char *buffer, ShaderLanguage lang, std::strin ShaderLanguageDesc compat(ShaderLanguage::GLSL_140); return GenerateVertexShaderGLSL(id, buffer, compat, &attrMask, &uniformMask, errorString); } + case ShaderLanguage::HLSL_D3D9_TEST: + { + ShaderLanguageDesc compat(ShaderLanguage::HLSL_D3D9); + return GenerateVertexShaderGLSL(id, buffer, compat, &attrMask, &uniformMask, errorString); + } + case ShaderLanguage::HLSL_D3D11_TEST: + { + ShaderLanguageDesc compat(ShaderLanguage::HLSL_D3D11); + return GenerateVertexShaderGLSL(id, buffer, compat, &attrMask, &uniformMask, errorString); + } case ShaderLanguage::HLSL_D3D9: { //ShaderLanguageDesc compat(ShaderLanguage::HLSL_D3D9); @@ -91,10 +103,12 @@ bool TestCompileShader(const char *buffer, ShaderLanguage lang, bool vertex, std std::vector spirv; switch (lang) { case ShaderLanguage::HLSL_D3D11: + case ShaderLanguage::HLSL_D3D11_TEST: { auto output = CompileShaderToBytecodeD3D11(buffer, strlen(buffer), vertex ? "vs_4_0" : "ps_4_0", 0); return !output.empty(); } + case ShaderLanguage::HLSL_D3D9_TEST: case ShaderLanguage::HLSL_D3D9: { LPD3DBLOB blob = CompileShaderToByteCodeD3D9(buffer, vertex ? "vs_2_0" : "ps_2_0", errorMessage); @@ -150,8 +164,9 @@ bool TestShaderGenerators() { LoadD3DCompilerDynamic(); ShaderLanguage languages[] = { - ShaderLanguage::HLSL_D3D9, + ShaderLanguage::HLSL_D3D11_TEST, ShaderLanguage::HLSL_D3D11, + ShaderLanguage::HLSL_D3D9, ShaderLanguage::GLSL_VULKAN, ShaderLanguage::GLSL_140, ShaderLanguage::GLSL_300, @@ -167,6 +182,57 @@ bool TestShaderGenerators() { int successes = 0; int count = 700; + // Generate a bunch of random vertex shader IDs, try to generate shader source. + // Then compile it and check that it's ok. + for (int i = 0; i < count; i++) { + uint32_t bottom = rng.R32(); + uint32_t top = rng.R32(); + VShaderID id; + id.d[0] = bottom; + id.d[1] = top; + + bool generateSuccess[numLanguages]{}; + std::string genErrorString[numLanguages]; + + for (int j = 0; j < numLanguages; j++) { + generateSuccess[j] = GenerateVShader(id, buffer[j], languages[j], &genErrorString[j]); + if (!genErrorString[j].empty()) { + printf("%s\n", genErrorString[j].c_str()); + } + } + + // KEEPING FOR REUSE LATER: Defunct temporary test: Compare GLSL-in-Vulkan-mode vs Vulkan + if (generateSuccess[0] != generateSuccess[1]) { + printf("mismatching success! '%s' '%s'\n", genErrorString[0].c_str(), genErrorString[1].c_str()); + printf("%s\n", buffer[0]); + printf("%s\n", buffer[1]); + return false; + } + if (generateSuccess[0] && strcmp(buffer[0], buffer[1])) { + printf("mismatching shaders!\n"); + PrintDiff(buffer[0], buffer[1]); + return false; + } + + // Now that we have the strings ready for easy comparison (buffer,4 in the watch window), + // let's try to compile them. + for (int j = 0; j < numLanguages; j++) { + if (generateSuccess[j]) { + std::string errorMessage; + if (!TestCompileShader(buffer[j], languages[j], true, &errorMessage)) { + printf("Error compiling vertex shader:\n\n%s\n\n%s\n", LineNumberString(buffer[j]).c_str(), errorMessage.c_str()); + return false; + } + successes++; + } + } + } + + printf("%d/%d vertex shaders generated (it's normal that it's not all, there are invalid bit combos)\n", successes, count * numLanguages); + + successes = 0; + count = 200; + // Generate a bunch of random fragment shader IDs, try to generate shader source. // Then compile it and check that it's ok. for (int i = 0; i < count; i++) { @@ -232,58 +298,6 @@ bool TestShaderGenerators() { successes = 0; count = 200; - /* - // Generate a bunch of random vertex shader IDs, try to generate shader source. - // Then compile it and check that it's ok. - for (int i = 0; i < count; i++) { - uint32_t bottom = rng.R32(); - uint32_t top = rng.R32(); - VShaderID id; - id.d[0] = bottom; - id.d[1] = top; - - bool generateSuccess[numLanguages]{}; - std::string genErrorString[numLanguages]; - - for (int j = 0; j < numLanguages; j++) { - generateSuccess[j] = GenerateVShader(id, buffer[j], languages[j], &genErrorString[j]); - if (!genErrorString[j].empty()) { - printf("%s\n", genErrorString[j].c_str()); - } - } - - // KEEPING FOR REUSE LATER: Defunct temporary test: Compare GLSL-in-Vulkan-mode vs Vulkan - if (generateSuccess[0] != generateSuccess[1]) { - printf("mismatching success! '%s' '%s'\n", genErrorString[0].c_str(), genErrorString[1].c_str()); - printf("%s\n", buffer[0]); - printf("%s\n", buffer[1]); - return false; - } - if (generateSuccess[0] && strcmp(buffer[0], buffer[1])) { - printf("mismatching shaders!\n"); - PrintDiff(buffer[0], buffer[1]); - return false; - } - - // Now that we have the strings ready for easy comparison (buffer,4 in the watch window), - // let's try to compile them. - for (int j = 0; j < numLanguages; j++) { - if (generateSuccess[j]) { - std::string errorMessage; - if (!TestCompileShader(buffer[j], languages[j], true, &errorMessage)) { - printf("Error compiling vertex shader:\n\n%s\n\n%s\n", LineNumberString(buffer[j]).c_str(), errorMessage.c_str()); - return false; - } - successes++; - } - } - } - - printf("%d/%d vertex shaders generated (it's normal that it's not all, there are invalid bit combos)\n", successes, count * numLanguages); - - successes = 0; - count = 200; - */ _CrtCheckMemory(); From b6992e428b8153a8d75ab9de213eda8b83c05ba5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Sun, 1 Nov 2020 10:29:28 +0100 Subject: [PATCH 162/275] More HLSL work. Some vertex shaders are starting to pass. --- GPU/Common/ShaderCommon.cpp | 1 + GPU/Common/ShaderCommon.h | 1 + GPU/Directx9/VertexShaderGeneratorHLSL.cpp | 78 +++++++++++------ GPU/GLES/VertexShaderGeneratorGLES.cpp | 99 ++++++++++++++-------- 4 files changed, 116 insertions(+), 63 deletions(-) diff --git a/GPU/Common/ShaderCommon.cpp b/GPU/Common/ShaderCommon.cpp index 43cd7c1a17..1f13458b93 100644 --- a/GPU/Common/ShaderCommon.cpp +++ b/GPU/Common/ShaderCommon.cpp @@ -171,6 +171,7 @@ ShaderLanguageDesc::ShaderLanguageDesc(ShaderLanguage lang) { texelFetch = "texelFetch"; forceMatrix4x4 = false; coefsFromBuffers = true; + vsOutPrefix = "Out."; break; } } diff --git a/GPU/Common/ShaderCommon.h b/GPU/Common/ShaderCommon.h index 456ff0f392..a12033376f 100644 --- a/GPU/Common/ShaderCommon.h +++ b/GPU/Common/ShaderCommon.h @@ -160,6 +160,7 @@ struct ShaderLanguageDesc { const char *texelFetch = nullptr; const char *lastFragData = nullptr; const char *framebufferFetchExtension = nullptr; + const char *vsOutPrefix = ""; bool glslES30 = false; bool bitwiseOps = false; bool forceMatrix4x4 = false; diff --git a/GPU/Directx9/VertexShaderGeneratorHLSL.cpp b/GPU/Directx9/VertexShaderGeneratorHLSL.cpp index 5e301cb1fa..c489e34ec2 100644 --- a/GPU/Directx9/VertexShaderGeneratorHLSL.cpp +++ b/GPU/Directx9/VertexShaderGeneratorHLSL.cpp @@ -357,30 +357,52 @@ bool GenerateVertexShaderHLSL(const VShaderID &id, char *buffer, ShaderLanguage } WRITE(p, "VS_OUT main(VS_IN In) {\n"); - WRITE(p, " VS_OUT Out;\n"); + WRITE(p, " VS_OUT Out;\n"); + if (doTexture) { + if (texCoordInVec3) { + WRITE(p, " vec3 texcoord = In.texcoord;\n"); + } else { + WRITE(p, " vec2 texcoord = In.texcoord;\n"); + } + } + if (hasColor) { + WRITE(p, " vec4 color0 = In.color0;\n"); + if (lmode && !useHWTransform) { + WRITE(p, " vec4 color1 = In.color1;\n"); + } + } + if (hasNormal) { + WRITE(p, " vec3 normal = In.normal;\n"); + } + if (useHWTransform) { + WRITE(p, " vec3 position = In.position;\n"); + } else { + WRITE(p, " vec4 position = In.position;\n"); + } + if (!useHWTransform) { // Simple pass-through of vertex data to fragment shader if (doTexture) { if (texCoordInVec3) { - WRITE(p, " Out.v_texcoord = In.texcoord;\n"); + WRITE(p, " Out.v_texcoord = texcoord;\n"); } else { - WRITE(p, " Out.v_texcoord = vec3(In.texcoord, 1.0);\n"); + WRITE(p, " Out.v_texcoord = vec3(texcoord, 1.0);\n"); } } if (hasColor) { - WRITE(p, " Out.v_color0 = In.color0;\n"); + WRITE(p, " Out.v_color0 = color0;\n"); if (lmode) - WRITE(p, " Out.v_color1 = In.color1.rgb;\n"); + WRITE(p, " Out.v_color1 = color1.rgb;\n"); } else { - WRITE(p, " Out.v_color0 = In.u_matambientalpha;\n"); + WRITE(p, " Out.v_color0 = u_matambientalpha;\n"); if (lmode) WRITE(p, " Out.v_color1 = vec3(0.0);\n"); } if (enableFog) { - WRITE(p, " Out.v_fogdepth = In.position.w;\n"); + WRITE(p, " Out.v_fogdepth = position.w;\n"); } if (isModeThrough) { - WRITE(p, " float4 outPos = mul(u_proj_through, vec4(In.position.xyz, 1.0));\n"); + WRITE(p, " vec4 outPos = mul(u_proj_through, vec4(In.position.xyz, 1.0));\n"); } else { if (gstate_c.Supports(GPU_ROUND_DEPTH_TO_16BIT)) { WRITE(p, " vec4 outPos = depthRoundZVP(mul(u_proj, vec4(In.position.xyz, 1.0)));\n"); @@ -400,14 +422,14 @@ bool GenerateVertexShaderHLSL(const VShaderID &id, char *buffer, ShaderLanguage if (hasNormalTess) WRITE(p, " vec3 worldnormal = normalize(mul(vec4(%stess.nrm, 0.0), u_world)).xyz;\n", flipNormalTess ? "-" : ""); else - WRITE(p, " vec3 worldnormal = vec3(0.0, 0.0, 1.0);\n"); + WRITE(p, " mediump vec3 worldnormal = vec3(0.0, 0.0, 1.0);\n"); } else { // No skinning, just standard T&L. - WRITE(p, " vec3 worldpos = mul(vec4(In.position.xyz, 1.0), u_world);\n"); + WRITE(p, " vec3 worldpos = mul(vec4(position.xyz, 1.0), u_world).xyz;\n"); if (hasNormal) - WRITE(p, " vec3 worldnormal = normalize(mul(vec4(%sIn.normal, 0.0), u_world));\n", flipNormal ? "-" : ""); + WRITE(p, " mediump vec3 worldnormal = normalize(mul(vec4(%snormal, 0.0), u_world).xyz);\n", flipNormal ? "-" : ""); else - WRITE(p, " vec3 worldnormal = vec3(0.0, 0.0, 1.0);\n"); + WRITE(p, " mediump vec3 worldnormal = vec3(0.0, 0.0, 1.0);\n"); } } else { static const char * const boneWeightAttr[8] = { @@ -444,18 +466,18 @@ bool GenerateVertexShaderHLSL(const VShaderID &id, char *buffer, ShaderLanguage WRITE(p, ";\n"); // Trying to simplify this results in bugs in LBP... - WRITE(p, " vec3 skinnedpos = mul(float4(In.position.xyz, 1.0), skinMatrix);\n"); - WRITE(p, " vec3 worldpos = mul(float4(skinnedpos, 1.0), u_world);\n"); + WRITE(p, " vec3 skinnedpos = mul(float4(position.xyz, 1.0), skinMatrix).xyz;\n"); + WRITE(p, " vec3 worldpos = mul(float4(skinnedpos, 1.0), u_world).xyz;\n"); if (hasNormal) { - WRITE(p, " vec3 skinnednormal = mul(float4(%sIn.normal, 0.0), skinMatrix);\n", flipNormal ? "-" : ""); + WRITE(p, " vec3 skinnednormal = mul(float4(%snormal, 0.0), skinMatrix).xyz;\n", flipNormal ? "-" : ""); } else { - WRITE(p, " vec3 skinnednormal = mul(float4(0.0, 0.0, %s1.0, 0.0), skinMatrix);\n", flipNormal ? "-" : ""); + WRITE(p, " vec3 skinnednormal = mul(float4(0.0, 0.0, %s1.0, 0.0), skinMatrix).xyz;\n", flipNormal ? "-" : ""); } - WRITE(p, " vec3 worldnormal = normalize(mul(float4(skinnednormal, 0.0), u_world));\n"); + WRITE(p, " mediump vec3 worldnormal = normalize(mul(float4(skinnednormal, 0.0), u_world).xyz);\n"); } - WRITE(p, " vec4 viewPos = vec4(mul(vec4(worldpos, 1.0), u_view), 1.0);\n"); + WRITE(p, " vec4 viewPos = vec4(mul(vec4(worldpos, 1.0), u_view).xyz, 1.0);\n"); // Final view and projection transforms. if (gstate_c.Supports(GPU_ROUND_DEPTH_TO_16BIT)) { @@ -466,9 +488,9 @@ bool GenerateVertexShaderHLSL(const VShaderID &id, char *buffer, ShaderLanguage // TODO: Declare variables for dots for shade mapping if needed. - const char *ambientStr = (matUpdate & 1) && hasColor ? "In.color0" : "u_matambientalpha"; - const char *diffuseStr = (matUpdate & 2) && hasColor ? "In.color0.rgb" : "u_matdiffuse"; - const char *specularStr = (matUpdate & 4) && hasColor ? "In.color0.rgb" : "u_matspecular.rgb"; + const char *ambientStr = (matUpdate & 1) && hasColor ? "color0" : "u_matambientalpha"; + const char *diffuseStr = (matUpdate & 2) && hasColor ? "color0.rgb" : "u_matdiffuse"; + const char *specularStr = (matUpdate & 4) && hasColor ? "color0.rgb" : "u_matspecular.rgb"; if (doBezier || doSpline) { // TODO: Probably, should use hasColorTess but FF4 has a problem with drawing the background. ambientStr = (matUpdate & 1) && hasColor ? "tess.col" : "u_matambientalpha"; @@ -609,7 +631,7 @@ bool GenerateVertexShaderHLSL(const VShaderID &id, char *buffer, ShaderLanguage if (doBezier || doSpline) WRITE(p, " Out.v_color0 = tess.col;\n"); else - WRITE(p, " Out.v_color0 = In.color0;\n"); + WRITE(p, " Out.v_color0 = color0;\n"); } else { WRITE(p, " Out.v_color0 = u_matambientalpha;\n"); } @@ -627,13 +649,13 @@ bool GenerateVertexShaderHLSL(const VShaderID &id, char *buffer, ShaderLanguage if (doBezier || doSpline) WRITE(p, " Out.v_texcoord = vec3(tess.tex.xy * u_uvscaleoffset.xy + u_uvscaleoffset.zw, 0.0);\n"); else - WRITE(p, " Out.v_texcoord = vec3(In.texcoord.xy * u_uvscaleoffset.xy, 0.0);\n"); + WRITE(p, " Out.v_texcoord = vec3(texcoord.xy * u_uvscaleoffset.xy, 0.0);\n"); } else { WRITE(p, " Out.v_texcoord = splat3(0.0);\n"); } } else { if (hasTexcoord) { - WRITE(p, " Out.v_texcoord = vec3(In.texcoord.xy * u_uvscaleoffset.xy + u_uvscaleoffset.zw, 0.0);\n"); + WRITE(p, " Out.v_texcoord = vec3(texcoord.xy * u_uvscaleoffset.xy + u_uvscaleoffset.zw, 0.0);\n"); } else { WRITE(p, " Out.v_texcoord = vec3(u_uvscaleoffset.zw, 0.0);\n"); } @@ -645,12 +667,12 @@ bool GenerateVertexShaderHLSL(const VShaderID &id, char *buffer, ShaderLanguage std::string temp_tc; switch (uvProjMode) { case GE_PROJMAP_POSITION: // Use model space XYZ as source - temp_tc = "vec4(In.position.xyz, 1.0)"; + temp_tc = "vec4(position.xyz, 1.0)"; break; case GE_PROJMAP_UV: // Use unscaled UV as source { if (hasTexcoord) { - temp_tc = StringFromFormat("vec4(In.texcoord.xy, 0.0, 1.0)"); + temp_tc = StringFromFormat("vec4(texcoord.xy, 0.0, 1.0)"); } else { temp_tc = "vec4(0.0, 0.0, 0.0, 1.0)"; } @@ -658,13 +680,13 @@ bool GenerateVertexShaderHLSL(const VShaderID &id, char *buffer, ShaderLanguage break; case GE_PROJMAP_NORMALIZED_NORMAL: // Use normalized transformed normal as source if (hasNormal) - temp_tc = flipNormal ? "vec4(normalize(-In.normal), 1.0)" : "vec4(normalize(In.normal), 1.0)"; + temp_tc = flipNormal ? "vec4(normalize(-normal), 1.0)" : "vec4(normalize(normal), 1.0)"; else temp_tc = "vec4(0.0, 0.0, 1.0, 1.0)"; break; case GE_PROJMAP_NORMAL: // Use non-normalized transformed normal as source if (hasNormal) - temp_tc = flipNormal ? "vec4(-In.normal, 1.0)" : "vec4(In.normal, 1.0)"; + temp_tc = flipNormal ? "vec4(-normal, 1.0)" : "vec4(normal, 1.0)"; else temp_tc = "vec4(0.0, 0.0, 1.0, 1.0)"; break; diff --git a/GPU/GLES/VertexShaderGeneratorGLES.cpp b/GPU/GLES/VertexShaderGeneratorGLES.cpp index 065a1e5647..4fb6ce63b8 100644 --- a/GPU/GLES/VertexShaderGeneratorGLES.cpp +++ b/GPU/GLES/VertexShaderGeneratorGLES.cpp @@ -103,11 +103,12 @@ const char *vulkan_glsl_preamble_vs = "#version 450\n" "#extension GL_ARB_separate_shader_objects : enable\n" "#extension GL_ARB_shading_language_420pack : enable\n" -"#define mul(x, y) x * y\n" +"#define mul(x, y) ((x) * (y))\n" "#define splat3(x) vec3(x)\n" "#define lowp\n" "#define mediump\n" -"#define highp\n\n"; +"#define highp\n" +"\n"; const char *hlsl_preamble_vs = "#define vec2 float2\n" @@ -115,7 +116,10 @@ const char *hlsl_preamble_vs = "#define vec4 float4\n" "#define mat4 float4x4\n" "#define mat3x4 float4x3\n" // note how the conventions are backwards -"#define splat3(x) vec3(x, x, x)\n"; +"#define splat3(x) vec3(x, x, x)\n" +"#define mediump\n" +"#define highp\n" +"\n"; bool GenerateVertexShaderGLSL(const VShaderID &id, char *buffer, const ShaderLanguageDesc &compat, uint32_t *attrMask, uint64_t *uniformMask, std::string *errorString) { *attrMask = 0; @@ -148,7 +152,7 @@ bool GenerateVertexShaderGLSL(const VShaderID &id, char *buffer, const ShaderLan WRITE(p, "#define highp\n"); } WRITE(p, "#define splat3(x) vec3(x)\n"); - WRITE(p, "#define mul(x, y) x * y\n"); + WRITE(p, "#define mul(x, y) ((x) * (y))\n"); } bool isModeThrough = id.Bit(VS_BIT_IS_THROUGH); @@ -206,7 +210,7 @@ bool GenerateVertexShaderGLSL(const VShaderID &id, char *buffer, const ShaderLan int numBoneWeights = 0; int boneWeightScale = id.Bits(VS_BIT_WEIGHT_FMTSCALE, 2); - bool texcoordInVec3 = false; + bool texCoordInVec3 = false; if (compat.shaderLanguage == GLSL_VULKAN) { WRITE(p, "\n"); @@ -233,7 +237,7 @@ bool GenerateVertexShaderGLSL(const VShaderID &id, char *buffer, const ShaderLan if (doTexture && hasTexcoord) { if (!useHWTransform && doTextureTransform && !isModeThrough) { WRITE(p, "layout (location = %d) in vec3 texcoord;\n", (int)PspAttributeLocation::TEXCOORD); - texcoordInVec3 = true; + texCoordInVec3 = true; } else WRITE(p, "layout (location = %d) in vec2 texcoord;\n", (int)PspAttributeLocation::TEXCOORD); } @@ -363,7 +367,7 @@ bool GenerateVertexShaderGLSL(const VShaderID &id, char *buffer, const ShaderLan WRITE(p, " vec4 position : POSITION;\n"); if (doTexture && hasTexcoord) { if (doTextureTransform && !isModeThrough) { - texcoordInVec3 = true; + texCoordInVec3 = true; WRITE(p, " vec3 texcoord : TEXCOORD0;\n"); } else WRITE(p, " vec2 texcoord : TEXCOORD0;\n"); @@ -423,7 +427,7 @@ bool GenerateVertexShaderGLSL(const VShaderID &id, char *buffer, const ShaderLan if (doTexture && hasTexcoord) { if (!useHWTransform && doTextureTransform && !isModeThrough) { WRITE(p, "%s vec3 texcoord;\n", compat.attribute); - texcoordInVec3 = true; + texCoordInVec3 = true; } else { WRITE(p, "%s vec2 texcoord;\n", compat.attribute); } @@ -698,12 +702,33 @@ bool GenerateVertexShaderGLSL(const VShaderID &id, char *buffer, const ShaderLan } else if (compat.shaderLanguage == HLSL_D3D9 || compat.shaderLanguage == HLSL_D3D11) { WRITE(p, "VS_OUT main(VS_IN In) {\n"); WRITE(p, " VS_OUT Out;\n"); + if (doTexture) { + if (texCoordInVec3) { + WRITE(p, " vec3 texcoord = In.texcoord;\n"); + } else { + WRITE(p, " vec2 texcoord = In.texcoord;\n"); + } + } + if (hasColor) { + WRITE(p, " vec4 color0 = In.color0;\n"); + if (lmode && !useHWTransform) { + WRITE(p, " vec4 color1 = In.color1;\n"); + } + } + if (hasNormal) { + WRITE(p, " vec3 normal = In.normal;\n"); + } + if (useHWTransform) { + WRITE(p, " vec3 position = In.position;\n"); + } else { + WRITE(p, " vec4 position = In.position;\n"); + } } if (!useHWTransform) { // Simple pass-through of vertex data to fragment shader if (doTexture) { - if (texcoordInVec3) { + if (texCoordInVec3) { WRITE(p, " v_texcoord = texcoord;\n"); } else { WRITE(p, " v_texcoord = vec3(texcoord, 1.0);\n"); @@ -726,9 +751,9 @@ bool GenerateVertexShaderGLSL(const VShaderID &id, char *buffer, const ShaderLan } else { // The viewport is used in this case, so need to compensate for that. if (gstate_c.Supports(GPU_ROUND_DEPTH_TO_16BIT)) { - WRITE(p, " vec4 outPos = depthRoundZVP(u_proj * vec4(position.xyz, 1.0));\n"); + WRITE(p, " vec4 outPos = depthRoundZVP(mul(u_proj, vec4(position.xyz, 1.0)));\n"); } else { - WRITE(p, " vec4 outPos = u_proj * vec4(position.xyz, 1.0);\n"); + WRITE(p, " vec4 outPos = mul(u_proj, vec4(position.xyz, 1.0));\n"); } } } else { @@ -793,13 +818,13 @@ bool GenerateVertexShaderGLSL(const VShaderID &id, char *buffer, const ShaderLan WRITE(p, " mediump vec3 worldnormal = normalize((vec4(skinnednormal, 0.0) * u_world).xyz);\n"); } - WRITE(p, " vec4 viewPos = vec4((vec4(worldpos, 1.0) * u_view).xyz, 1.0);\n"); + WRITE(p, " vec4 viewPos = vec4(mul(vec4(worldpos, 1.0), u_view).xyz, 1.0);\n"); // Final view and projection transforms. if (gstate_c.Supports(GPU_ROUND_DEPTH_TO_16BIT)) { - WRITE(p, " vec4 outPos = depthRoundZVP(u_proj * viewPos);\n"); + WRITE(p, " vec4 outPos = depthRoundZVP(mul(u_proj, viewPos));\n"); } else { - WRITE(p, " vec4 outPos = u_proj * viewPos;\n"); + WRITE(p, " vec4 outPos = mul(u_proj, viewPos);\n"); } // TODO: Declare variables for dots for shade mapping if needed. @@ -927,32 +952,32 @@ bool GenerateVertexShaderGLSL(const VShaderID &id, char *buffer, const ShaderLan if (enableLighting) { // Sum up ambient, emissive here. if (lmode) { - WRITE(p, " v_color0 = clamp(lightSum0, 0.0, 1.0);\n"); + WRITE(p, " %sv_color0 = clamp(lightSum0, 0.0, 1.0);\n", compat.vsOutPrefix); // v_color1 only exists when lmode = 1. if (specularIsZero) { - WRITE(p, " v_color1 = vec3(0.0);\n"); + WRITE(p, " %sv_color1 = vec3(0.0);\n", compat.vsOutPrefix); } else { - WRITE(p, " v_color1 = clamp(lightSum1, 0.0, 1.0);\n"); + WRITE(p, " %sv_color1 = clamp(lightSum1, 0.0, 1.0);\n", compat.vsOutPrefix); } } else { if (specularIsZero) { - WRITE(p, " v_color0 = clamp(lightSum0, 0.0, 1.0);\n"); + WRITE(p, " %sv_color0 = clamp(lightSum0, 0.0, 1.0);\n", compat.vsOutPrefix); } else { - WRITE(p, " v_color0 = clamp(clamp(lightSum0, 0.0, 1.0) + vec4(lightSum1, 0.0), 0.0, 1.0);\n"); + WRITE(p, " %sv_color0 = clamp(clamp(lightSum0, 0.0, 1.0) + vec4(lightSum1, 0.0), 0.0, 1.0);\n", compat.vsOutPrefix); } } } else { // Lighting doesn't affect color. if (hasColor) { if (doBezier || doSpline) - WRITE(p, " v_color0 = tess.col;\n"); + WRITE(p, " %sv_color0 = tess.col;\n", compat.vsOutPrefix); else - WRITE(p, " v_color0 = color0;\n"); + WRITE(p, " %sv_color0 = color0;\n", compat.vsOutPrefix); } else { - WRITE(p, " v_color0 = u_matambientalpha;\n"); + WRITE(p, " %sv_color0 = u_matambientalpha;\n", compat.vsOutPrefix); } if (lmode) - WRITE(p, " v_color1 = vec3(0.0);\n"); + WRITE(p, " %sv_color1 = vec3(0.0);\n", compat.vsOutPrefix); } bool scaleUV = !isModeThrough && (uvGenMode == GE_TEXMAP_TEXTURE_COORDS || uvGenMode == GE_TEXMAP_UNKNOWN); @@ -965,17 +990,17 @@ bool GenerateVertexShaderGLSL(const VShaderID &id, char *buffer, const ShaderLan if (scaleUV) { if (hasTexcoord) { if (doBezier || doSpline) - WRITE(p, " v_texcoord = vec3(tess.tex.xy * u_uvscaleoffset.xy + u_uvscaleoffset.zw, 0.0);\n"); + WRITE(p, " %sv_texcoord = vec3(tess.tex.xy * u_uvscaleoffset.xy + u_uvscaleoffset.zw, 0.0);\n", compat.vsOutPrefix); else - WRITE(p, " v_texcoord = vec3(texcoord.xy * u_uvscaleoffset.xy, 0.0);\n"); + WRITE(p, " %sv_texcoord = vec3(texcoord.xy * u_uvscaleoffset.xy, 0.0);\n", compat.vsOutPrefix); } else { - WRITE(p, " v_texcoord = vec3(0.0);\n"); + WRITE(p, " %sv_texcoord = vec3(0.0);\n", compat.vsOutPrefix); } } else { if (hasTexcoord) { - WRITE(p, " v_texcoord = vec3(texcoord.xy * u_uvscaleoffset.xy + u_uvscaleoffset.zw, 0.0);\n"); + WRITE(p, " %sv_texcoord = vec3(texcoord.xy * u_uvscaleoffset.xy + u_uvscaleoffset.zw, 0.0);\n", compat.vsOutPrefix); } else { - WRITE(p, " v_texcoord = vec3(u_uvscaleoffset.zw, 0.0);\n"); + WRITE(p, " %sv_texcoord = vec3(u_uvscaleoffset.zw, 0.0);\n", compat.vsOutPrefix); } } break; @@ -1011,7 +1036,7 @@ bool GenerateVertexShaderGLSL(const VShaderID &id, char *buffer, const ShaderLan break; } // Transform by texture matrix. XYZ as we are doing projection mapping. - WRITE(p, " v_texcoord = (%s * u_texmtx).xyz * vec3(u_uvscaleoffset.xy, 1.0);\n", temp_tc.c_str()); + WRITE(p, " %sv_texcoord = (%s * u_texmtx).xyz * vec3(u_uvscaleoffset.xy, 1.0);\n", compat.vsOutPrefix, temp_tc.c_str()); } break; @@ -1019,7 +1044,7 @@ bool GenerateVertexShaderGLSL(const VShaderID &id, char *buffer, const ShaderLan { std::string lightFactor0 = StringFromFormat("(length(u_lightpos%i) == 0.0 ? worldnormal.z : dot(normalize(u_lightpos%i), worldnormal))", ls0, ls0); std::string lightFactor1 = StringFromFormat("(length(u_lightpos%i) == 0.0 ? worldnormal.z : dot(normalize(u_lightpos%i), worldnormal))", ls1, ls1); - WRITE(p, " v_texcoord = vec3(u_uvscaleoffset.xy * vec2(1.0 + %s, 1.0 + %s) * 0.5, 1.0);\n", lightFactor0.c_str(), lightFactor1.c_str()); + WRITE(p, " %sv_texcoord = vec3(u_uvscaleoffset.xy * vec2(1.0 + %s, 1.0 + %s) * 0.5, 1.0);\n", compat.vsOutPrefix, lightFactor0.c_str(), lightFactor1.c_str()); } break; @@ -1031,7 +1056,7 @@ bool GenerateVertexShaderGLSL(const VShaderID &id, char *buffer, const ShaderLan // Compute fogdepth if (enableFog) - WRITE(p, " v_fogdepth = (viewPos.z + u_fogcoef.x) * u_fogcoef.y;\n"); + WRITE(p, " %sv_fogdepth = (viewPos.z + u_fogcoef.x) * u_fogcoef.y;\n", compat.vsOutPrefix); } if (!isModeThrough && gstate_c.Supports(GPU_SUPPORTS_VS_RANGE_CULLING)) { @@ -1045,11 +1070,15 @@ bool GenerateVertexShaderGLSL(const VShaderID &id, char *buffer, const ShaderLan WRITE(p, " }\n"); WRITE(p, " }\n"); } - WRITE(p, " gl_Position = outPos;\n"); - if (compat.shaderLanguage == GLSL_VULKAN) { - WRITE(p, " gl_PointSize = 1.0;\n"); - } + // We've named the output gl_Position in HLSL as well. + WRITE(p, " %sgl_Position = outPos;\n", compat.vsOutPrefix); + if (compat.shaderLanguage == GLSL_VULKAN) { + WRITE(p, " gl_PointSize = 1.0;\n"); + } + if (compat.shaderLanguage == HLSL_D3D11 || compat.shaderLanguage == HLSL_D3D9) { + WRITE(p, " return Out;\n"); + } WRITE(p, "}\n"); return true; } From 8efb40180e50870c6845014ad408c58dae715fc5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Sun, 1 Nov 2020 11:06:52 +0100 Subject: [PATCH 163/275] Make the hardware skinning code match --- GPU/Common/ShaderUniforms.h | 4 +- GPU/D3D11/D3D11Util.cpp | 7 +- GPU/Directx9/VertexShaderGeneratorHLSL.cpp | 82 +++++++--------------- GPU/GLES/VertexShaderGeneratorGLES.cpp | 49 ++++++++++--- unittest/TestShaderGenerators.cpp | 3 + 5 files changed, 76 insertions(+), 69 deletions(-) diff --git a/GPU/Common/ShaderUniforms.h b/GPU/Common/ShaderUniforms.h index fd13956eec..fc8ac8e95e 100644 --- a/GPU/Common/ShaderUniforms.h +++ b/GPU/Common/ShaderUniforms.h @@ -92,7 +92,7 @@ R"( float4x4 u_proj; float4 u_cullRangeMax; float3 u_fogcolor; float3 u_texenv; - uint4 u_alphacolorref; + int4 u_alphacolorref; uint4 u_alphacolormask; float3 u_blendFixA; float3 u_blendFixB; @@ -198,7 +198,7 @@ R"( mat3x4 u_bone0; mat3x4 u_bone1; mat3x4 u_bone2; mat3x4 u_bone3; mat3x4 u_bon )"; static const char *cb_vs_bonesStr = -R"( float4x3 u_bone[8]; +R"( mat3x4 u_bone0; mat3x4 u_bone1; mat3x4 u_bone2; mat3x4 u_bone3; mat3x4 u_bone4; mat3x4 u_bone5; mat3x4 u_bone6; mat3x4 u_bone7; mat3x4 u_bone8; )"; void CalcCullRange(float minValues[4], float maxValues[4], bool flipViewport, bool hasNegZ); diff --git a/GPU/D3D11/D3D11Util.cpp b/GPU/D3D11/D3D11Util.cpp index acbdfc8e35..d8a68c5f14 100644 --- a/GPU/D3D11/D3D11Util.cpp +++ b/GPU/D3D11/D3D11Util.cpp @@ -26,8 +26,13 @@ std::vector CompileShaderToBytecodeD3D11(const char *code, size_t codeS std::string errors; if (errorMsgs) { errors = std::string((const char *)errorMsgs->GetBufferPointer(), errorMsgs->GetBufferSize()); - ERROR_LOG(G3D, "%s: %s", SUCCEEDED(result) ? "warnings" : "errors", errors.c_str()); + if (SUCCEEDED(result)) { + WARN_LOG(G3D, "%s: %s", "warnings", errors.c_str()); + } else { + ERROR_LOG(G3D, "%s: %s", "errors", errors.c_str()); + } OutputDebugStringA(LineNumberString(code).c_str()); + OutputDebugStringA(errors.c_str()); errorMsgs->Release(); } if (compiledCode) { diff --git a/GPU/Directx9/VertexShaderGeneratorHLSL.cpp b/GPU/Directx9/VertexShaderGeneratorHLSL.cpp index c489e34ec2..86209250b0 100644 --- a/GPU/Directx9/VertexShaderGeneratorHLSL.cpp +++ b/GPU/Directx9/VertexShaderGeneratorHLSL.cpp @@ -31,17 +31,8 @@ #define WRITE p+=sprintf -static const char * const boneWeightAttrDecl[9] = { - "#ERROR#", - "float a_w1:TEXCOORD1;\n", - "vec2 a_w1:TEXCOORD1;\n", - "vec3 a_w1:TEXCOORD1;\n", - "vec4 a_w1:TEXCOORD1;\n", - "vec4 a_w1:TEXCOORD1;\n float a_w2:TEXCOORD2;\n", - "vec4 a_w1:TEXCOORD1;\n vec2 a_w2:TEXCOORD2;\n", - "vec4 a_w1:TEXCOORD1;\n vec3 a_w2:TEXCOORD2;\n", - "vec4 a_w1:TEXCOORD1;\n vec4 a_w2:TEXCOORD2;\n", -}; +extern const char *boneWeightAttrDeclHLSL[9]; +extern const char *boneWeightAttrInitHLSL[9]; extern const char *hlsl_preamble_vs; @@ -108,9 +99,9 @@ bool GenerateVertexShaderHLSL(const VShaderID &id, char *buffer, ShaderLanguage if (lang == HLSL_D3D9) { WRITE(p, "#pragma warning( disable : 3571 )\n"); if (isModeThrough) { - WRITE(p, "float4x4 u_proj_through : register(c%i);\n", CONST_VS_PROJ_THROUGH); + WRITE(p, "mat4 u_proj_through : register(c%i);\n", CONST_VS_PROJ_THROUGH); } else { - WRITE(p, "float4x4 u_proj : register(c%i);\n", CONST_VS_PROJ); + WRITE(p, "mat4 u_proj : register(c%i);\n", CONST_VS_PROJ); // Add all the uniforms we'll need to transform properly. } @@ -127,13 +118,9 @@ bool GenerateVertexShaderHLSL(const VShaderID &id, char *buffer, ShaderLanguage if (doTextureTransform) WRITE(p, "mat3x4 u_texmtx : register(c%i);\n", CONST_VS_TEXMTX); if (enableBones) { -#ifdef USE_BONE_ARRAY - WRITE(p, "mat3x4 u_bone[%i] : register(c%i);\n", numBones, CONST_VS_BONE0); -#else for (int i = 0; i < numBoneWeights; i++) { WRITE(p, "mat3x4 u_bone%i : register(c%i);\n", i, CONST_VS_BONE0 + i * 3); } -#endif } if (doTexture) { WRITE(p, "vec4 u_uvscaleoffset : register(c%i);\n", CONST_VS_UVSCALEOFFSET); @@ -195,7 +182,7 @@ bool GenerateVertexShaderHLSL(const VShaderID &id, char *buffer, ShaderLanguage WRITE(p, " uint instanceId : SV_InstanceID;\n"); } if (enableBones) { - WRITE(p, " %s", boneWeightAttrDecl[numBoneWeights]); + WRITE(p, " %s", boneWeightAttrDeclHLSL[numBoneWeights]); } if (doTexture && hasTexcoord) { WRITE(p, " vec2 texcoord : TEXCOORD0;\n"); @@ -284,7 +271,7 @@ bool GenerateVertexShaderHLSL(const VShaderID &id, char *buffer, ShaderLanguage const char *init[3] = { "0.0, 0.0", "0.0, 0.0, 0.0", "0.0, 0.0, 0.0, 0.0" }; for (int i = 2; i <= 4; i++) { // Define 3 types vec2, vec3, vec4 - WRITE(p, "float%d tess_sample(in float%d points[16], float4x4 weights) {\n", i, i); + WRITE(p, "float%d tess_sample(in float%d points[16], mat4 weights) {\n", i, i); WRITE(p, " float%d pos = float%d(%s);\n", i, i, init[i - 2]); for (int v = 0; v < 4; ++v) { for (int u = 0; u < 4; ++u) { @@ -295,7 +282,7 @@ bool GenerateVertexShaderHLSL(const VShaderID &id, char *buffer, ShaderLanguage WRITE(p, "}\n"); } - WRITE(p, "float4x4 outerProduct(vec4 u, vec4 v) {\n"); + WRITE(p, "mat4 outerProduct(vec4 u, vec4 v) {\n"); WRITE(p, " return mul((float4x1)v, (float1x4)u);\n"); WRITE(p, "}\n"); @@ -330,7 +317,7 @@ bool GenerateVertexShaderHLSL(const VShaderID &id, char *buffer, ShaderLanguage // Basis polynomials as weight coefficients WRITE(p, " vec4 basis_u = tess_weights_u[weight_idx.x].basis;\n"); WRITE(p, " vec4 basis_v = tess_weights_v[weight_idx.y].basis;\n"); - WRITE(p, " float4x4 basis = outerProduct(basis_u, basis_v);\n"); + WRITE(p, " mat4 basis = outerProduct(basis_u, basis_v);\n"); // Tessellate WRITE(p, " tess.pos = tess_sample(_pos, basis);\n"); @@ -379,6 +366,9 @@ bool GenerateVertexShaderHLSL(const VShaderID &id, char *buffer, ShaderLanguage } else { WRITE(p, " vec4 position = In.position;\n"); } + if (enableBones) { + WRITE(p, "%s", boneWeightAttrInitHLSL[numBoneWeights]); + } if (!useHWTransform) { // Simple pass-through of vertex data to fragment shader @@ -425,7 +415,7 @@ bool GenerateVertexShaderHLSL(const VShaderID &id, char *buffer, ShaderLanguage WRITE(p, " mediump vec3 worldnormal = vec3(0.0, 0.0, 1.0);\n"); } else { // No skinning, just standard T&L. - WRITE(p, " vec3 worldpos = mul(vec4(position.xyz, 1.0), u_world).xyz;\n"); + WRITE(p, " vec3 worldpos = mul(vec4(position, 1.0), u_world).xyz;\n"); if (hasNormal) WRITE(p, " mediump vec3 worldnormal = normalize(mul(vec4(%snormal, 0.0), u_world).xyz);\n", flipNormal ? "-" : ""); else @@ -433,48 +423,28 @@ bool GenerateVertexShaderHLSL(const VShaderID &id, char *buffer, ShaderLanguage } } else { static const char * const boneWeightAttr[8] = { - "a_w1.x", "a_w1.y", "a_w1.z", "a_w1.w", - "a_w2.x", "a_w2.y", "a_w2.z", "a_w2.w", + "w1.x", "w1.y", "w1.z", "w1.w", + "w2.x", "w2.y", "w2.z", "w2.w", }; - if (lang == HLSL_D3D11) { - if (numBoneWeights == 1) - WRITE(p, " mat3x4 skinMatrix = mul(In.a_w1, u_bone[0])"); - else - WRITE(p, " float4x3 skinMatrix = mul(In.a_w1.x, u_bone[0])"); - for (int i = 1; i < numBoneWeights; i++) { - const char *weightAttr = boneWeightAttr[i]; - // workaround for "cant do .x of scalar" issue - if (numBoneWeights == 1 && i == 0) weightAttr = "a_w1"; - if (numBoneWeights == 5 && i == 4) weightAttr = "a_w2"; - WRITE(p, " + mul(In.%s, u_bone[%i])", weightAttr, i); - } - } else { - if (numBoneWeights == 1) - WRITE(p, " float4x3 skinMatrix = mul(In.a_w1, u_bone0)"); - else - WRITE(p, " float4x3 skinMatrix = mul(In.a_w1.x, u_bone0)"); - for (int i = 1; i < numBoneWeights; i++) { - const char *weightAttr = boneWeightAttr[i]; - // workaround for "cant do .x of scalar" issue - if (numBoneWeights == 1 && i == 0) weightAttr = "a_w1"; - if (numBoneWeights == 5 && i == 4) weightAttr = "a_w2"; - WRITE(p, " + mul(In.%s, u_bone%i)", weightAttr, i); - } + WRITE(p, " mat3x4 skinMatrix = w1.x * u_bone0"); + for (int i = 1; i < numBoneWeights; i++) { + const char *weightAttr = boneWeightAttr[i]; + WRITE(p, " + %s * u_bone%d", weightAttr, i); } WRITE(p, ";\n"); // Trying to simplify this results in bugs in LBP... - WRITE(p, " vec3 skinnedpos = mul(float4(position.xyz, 1.0), skinMatrix).xyz;\n"); - WRITE(p, " vec3 worldpos = mul(float4(skinnedpos, 1.0), u_world).xyz;\n"); + WRITE(p, " vec3 skinnedpos = mul(vec4(position, 1.0), skinMatrix).xyz;\n"); + WRITE(p, " vec3 worldpos = mul(vec4(skinnedpos, 1.0), u_world).xyz;\n"); if (hasNormal) { - WRITE(p, " vec3 skinnednormal = mul(float4(%snormal, 0.0), skinMatrix).xyz;\n", flipNormal ? "-" : ""); + WRITE(p, " mediump vec3 skinnednormal = mul(vec4(%snormal, 0.0), skinMatrix).xyz;\n", flipNormal ? "-" : ""); } else { - WRITE(p, " vec3 skinnednormal = mul(float4(0.0, 0.0, %s1.0, 0.0), skinMatrix).xyz;\n", flipNormal ? "-" : ""); + WRITE(p, " mediump vec3 skinnednormal = mul(vec4(0.0, 0.0, %s1.0, 0.0), skinMatrix).xyz;\n", flipNormal ? "-" : ""); } - WRITE(p, " mediump vec3 worldnormal = normalize(mul(float4(skinnednormal, 0.0), u_world).xyz);\n"); + WRITE(p, " mediump vec3 worldnormal = normalize(mul(vec4(skinnednormal, 0.0), u_world).xyz);\n"); } WRITE(p, " vec4 viewPos = vec4(mul(vec4(worldpos, 1.0), u_view).xyz, 1.0);\n"); @@ -503,7 +473,7 @@ bool GenerateVertexShaderHLSL(const VShaderID &id, char *buffer, ShaderLanguage bool distanceNeeded = false; bool anySpots = false; if (enableLighting) { - WRITE(p, " vec4 lightSum0 = u_ambient * %s + float4(u_matemissive, 0.0);\n", ambientStr); + WRITE(p, " lowp vec4 lightSum0 = u_ambient * %s + vec4(u_matemissive, 0.0);\n", ambientStr); for (int i = 0; i < 4; i++) { GELightType type = static_cast(id.Bits(VS_BIT_LIGHT0_TYPE + 4 * i, 2)); @@ -622,7 +592,7 @@ bool GenerateVertexShaderHLSL(const VShaderID &id, char *buffer, ShaderLanguage if (specularIsZero) { WRITE(p, " Out.v_color0 = clamp(lightSum0, 0.0, 1.0);\n"); } else { - WRITE(p, " Out.v_color0 = clamp(clamp(lightSum0, 0.0, 1.0) + float4(lightSum1, 0.0), 0.0, 1.0);\n"); + WRITE(p, " Out.v_color0 = clamp(clamp(lightSum0, 0.0, 1.0) + vec4(lightSum1, 0.0), 0.0, 1.0);\n"); } } } else { @@ -667,7 +637,7 @@ bool GenerateVertexShaderHLSL(const VShaderID &id, char *buffer, ShaderLanguage std::string temp_tc; switch (uvProjMode) { case GE_PROJMAP_POSITION: // Use model space XYZ as source - temp_tc = "vec4(position.xyz, 1.0)"; + temp_tc = "vec4(position, 1.0)"; break; case GE_PROJMAP_UV: // Use unscaled UV as source { diff --git a/GPU/GLES/VertexShaderGeneratorGLES.cpp b/GPU/GLES/VertexShaderGeneratorGLES.cpp index 4fb6ce63b8..75d3afdbc8 100644 --- a/GPU/GLES/VertexShaderGeneratorGLES.cpp +++ b/GPU/GLES/VertexShaderGeneratorGLES.cpp @@ -58,6 +58,30 @@ static const char * const boneWeightInDecl[9] = { "in mediump vec4 w1, w2;\n", }; +const char *boneWeightAttrDeclHLSL[9] = { + "#ERROR boneWeightAttrDecl#\n", + "float a_w1:TEXCOORD1;\n", + "vec2 a_w1:TEXCOORD1;\n", + "vec3 a_w1:TEXCOORD1;\n", + "vec4 a_w1:TEXCOORD1;\n", + "vec4 a_w1:TEXCOORD1;\n float a_w2:TEXCOORD2;\n", + "vec4 a_w1:TEXCOORD1;\n vec2 a_w2:TEXCOORD2;\n", + "vec4 a_w1:TEXCOORD1;\n vec3 a_w2:TEXCOORD2;\n", + "vec4 a_w1:TEXCOORD1;\n vec4 a_w2:TEXCOORD2;\n", +}; + +const char *boneWeightAttrInitHLSL[9] = { + " #ERROR#\n", + " vec4 w1 = vec4(In.a_w1, 0.0, 0.0, 0.0);\n", + " vec4 w1 = vec4(In.a_w1.xy, 0.0, 0.0);\n", + " vec4 w1 = vec4(In.a_w1.xyz, 0.0);\n", + " vec4 w1 = In.a_w1;\n", + " vec4 w1 = In.a_w1;\n vec4 w2 = vec4(In.a_w2, 0.0, 0.0, 0.0);\n", + " vec4 w1 = In.a_w1;\n vec4 w2 = vec4(In.a_w2.xy, 0.0, 0.0);\n", + " vec4 w1 = In.a_w1;\n vec4 w2 = vec4(In.a_w2.xyz, 0.0);\n", + " vec4 w1 = In.a_w1;\n vec4 w2 = In.a_w2;\n", +}; + // Depth range and viewport // // After the multiplication with the projection matrix, we have a 4D vector in clip space. @@ -117,6 +141,7 @@ const char *hlsl_preamble_vs = "#define mat4 float4x4\n" "#define mat3x4 float4x3\n" // note how the conventions are backwards "#define splat3(x) vec3(x, x, x)\n" +"#define lowp\n" "#define mediump\n" "#define highp\n" "\n"; @@ -210,6 +235,9 @@ bool GenerateVertexShaderGLSL(const VShaderID &id, char *buffer, const ShaderLan int numBoneWeights = 0; int boneWeightScale = id.Bits(VS_BIT_WEIGHT_FMTSCALE, 2); + if (enableBones) { + numBoneWeights = 1 + id.Bits(VS_BIT_BONES, 3); + } bool texCoordInVec3 = false; if (compat.shaderLanguage == GLSL_VULKAN) { @@ -221,7 +249,6 @@ bool GenerateVertexShaderGLSL(const VShaderID &id, char *buffer, const ShaderLan WRITE(p, "layout (std140, set = 0, binding = 5) uniform boneVars {\n%s};\n", ub_vs_bonesStr); if (enableBones) { - numBoneWeights = 1 + id.Bits(VS_BIT_BONES, 3); WRITE(p, "%s", boneWeightDecl[numBoneWeights]); } @@ -349,7 +376,7 @@ bool GenerateVertexShaderGLSL(const VShaderID &id, char *buffer, const ShaderLan WRITE(p, " uint instanceId : SV_InstanceID;\n"); } if (enableBones) { - WRITE(p, " %s", boneWeightAttrDecl[numBoneWeights]); + WRITE(p, " %s", boneWeightAttrDeclHLSL[numBoneWeights]); } if (doTexture && hasTexcoord) { WRITE(p, " vec2 texcoord : TEXCOORD0;\n"); @@ -402,7 +429,6 @@ bool GenerateVertexShaderGLSL(const VShaderID &id, char *buffer, const ShaderLan WRITE(p, "};\n"); } else { if (enableBones) { - numBoneWeights = 1 + id.Bits(VS_BIT_BONES, 3); const char * const * boneWeightDecl = boneWeightAttrDecl; if (!strcmp(compat.attribute, "in")) { boneWeightDecl = boneWeightInDecl; @@ -723,6 +749,9 @@ bool GenerateVertexShaderGLSL(const VShaderID &id, char *buffer, const ShaderLan } else { WRITE(p, " vec4 position = In.position;\n"); } + if (enableBones) { + WRITE(p, "%s", boneWeightAttrInitHLSL[numBoneWeights]); + } } if (!useHWTransform) { @@ -772,7 +801,7 @@ bool GenerateVertexShaderGLSL(const VShaderID &id, char *buffer, const ShaderLan } } else { // No skinning, just standard T&L. - WRITE(p, " vec3 worldpos = mul(vec4(position.xyz, 1.0), u_world).xyz;\n"); + WRITE(p, " vec3 worldpos = mul(vec4(position, 1.0), u_world).xyz;\n"); if (hasNormal) WRITE(p, " mediump vec3 worldnormal = normalize(mul(vec4(%snormal, 0.0), u_world).xyz);\n", flipNormal ? "-" : ""); else @@ -807,15 +836,15 @@ bool GenerateVertexShaderGLSL(const VShaderID &id, char *buffer, const ShaderLan WRITE(p, ";\n"); - WRITE(p, " vec3 skinnedpos = (vec4(position, 1.0) * skinMatrix).xyz %s;\n", factor); - WRITE(p, " vec3 worldpos = (vec4(skinnedpos, 1.0) * u_world).xyz;\n"); + WRITE(p, " vec3 skinnedpos = mul(vec4(position, 1.0), skinMatrix).xyz%s;\n", factor); + WRITE(p, " vec3 worldpos = mul(vec4(skinnedpos, 1.0), u_world).xyz;\n"); if (hasNormal) { - WRITE(p, " mediump vec3 skinnednormal = (vec4(%snormal, 0.0) * skinMatrix).xyz %s;\n", flipNormal ? "-" : "", factor); + WRITE(p, " mediump vec3 skinnednormal = mul(vec4(%snormal, 0.0), skinMatrix).xyz%s;\n", flipNormal ? "-" : "", factor); } else { - WRITE(p, " mediump vec3 skinnednormal = (vec4(0.0, 0.0, %s1.0, 0.0) * skinMatrix).xyz %s;\n", flipNormal ? "-" : "", factor); + WRITE(p, " mediump vec3 skinnednormal = mul(vec4(0.0, 0.0, %s1.0, 0.0), skinMatrix).xyz%s;\n", flipNormal ? "-" : "", factor); } - WRITE(p, " mediump vec3 worldnormal = normalize((vec4(skinnednormal, 0.0) * u_world).xyz);\n"); + WRITE(p, " mediump vec3 worldnormal = normalize(mul(vec4(skinnednormal, 0.0), u_world).xyz);\n"); } WRITE(p, " vec4 viewPos = vec4(mul(vec4(worldpos, 1.0), u_view).xyz, 1.0);\n"); @@ -1010,7 +1039,7 @@ bool GenerateVertexShaderGLSL(const VShaderID &id, char *buffer, const ShaderLan std::string temp_tc; switch (uvProjMode) { case GE_PROJMAP_POSITION: // Use model space XYZ as source - temp_tc = "vec4(position.xyz, 1.0)"; + temp_tc = "vec4(position, 1.0)"; break; case GE_PROJMAP_UV: // Use unscaled UV as source { diff --git a/unittest/TestShaderGenerators.cpp b/unittest/TestShaderGenerators.cpp index eed6e9b9d0..0437499265 100644 --- a/unittest/TestShaderGenerators.cpp +++ b/unittest/TestShaderGenerators.cpp @@ -191,6 +191,9 @@ bool TestShaderGenerators() { id.d[0] = bottom; id.d[1] = top; + // We don't use these bits in the HLSL shader generator. + id.SetBits(VS_BIT_WEIGHT_FMTSCALE, 2, 0); + bool generateSuccess[numLanguages]{}; std::string genErrorString[numLanguages]; From 9b3662460c7435b44977024434bcdce1df0a3a91 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Sun, 1 Nov 2020 11:15:28 +0100 Subject: [PATCH 164/275] Make the lighting code match --- GPU/Directx9/VertexShaderGeneratorHLSL.cpp | 16 ++++++++-------- GPU/GLES/VertexShaderGeneratorGLES.cpp | 6 +++--- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/GPU/Directx9/VertexShaderGeneratorHLSL.cpp b/GPU/Directx9/VertexShaderGeneratorHLSL.cpp index 86209250b0..7ffdf5826b 100644 --- a/GPU/Directx9/VertexShaderGeneratorHLSL.cpp +++ b/GPU/Directx9/VertexShaderGeneratorHLSL.cpp @@ -345,7 +345,7 @@ bool GenerateVertexShaderHLSL(const VShaderID &id, char *buffer, ShaderLanguage WRITE(p, "VS_OUT main(VS_IN In) {\n"); WRITE(p, " VS_OUT Out;\n"); - if (doTexture) { + if (doTexture && hasTexcoord) { if (texCoordInVec3) { WRITE(p, " vec3 texcoord = In.texcoord;\n"); } else { @@ -490,19 +490,19 @@ bool GenerateVertexShaderHLSL(const VShaderID &id, char *buffer, ShaderLanguage } if (!specularIsZero) { - WRITE(p, " vec3 lightSum1 = 0;\n"); + WRITE(p, " lowp vec3 lightSum1 = splat3(0.0);\n"); } if (!diffuseIsZero) { WRITE(p, " vec3 toLight;\n"); - WRITE(p, " vec3 diffuse;\n"); + WRITE(p, " lowp vec3 diffuse;\n"); } if (distanceNeeded) { WRITE(p, " float distance;\n"); - WRITE(p, " float lightScale;\n"); + WRITE(p, " lowp float lightScale;\n"); } - WRITE(p, " float ldot;\n"); + WRITE(p, " mediump float ldot;\n"); if (anySpots) { - WRITE(p, " float angle;\n"); + WRITE(p, " lowp float angle;\n"); } } @@ -656,13 +656,13 @@ bool GenerateVertexShaderHLSL(const VShaderID &id, char *buffer, ShaderLanguage break; case GE_PROJMAP_NORMAL: // Use non-normalized transformed normal as source if (hasNormal) - temp_tc = flipNormal ? "vec4(-normal, 1.0)" : "vec4(normal, 1.0)"; + temp_tc = flipNormal ? "vec4(-normal, 1.0)" : "vec4(normal, 1.0)"; else temp_tc = "vec4(0.0, 0.0, 1.0, 1.0)"; break; } // Transform by texture matrix. XYZ as we are doing projection mapping. - WRITE(p, " Out.v_texcoord.xyz = mul(%s, u_texmtx) * vec3(u_uvscaleoffset.xy, 1.0);\n", temp_tc.c_str()); + WRITE(p, " Out.v_texcoord = mul(%s, u_texmtx).xyz * vec3(u_uvscaleoffset.xy, 1.0);\n", temp_tc.c_str()); } break; diff --git a/GPU/GLES/VertexShaderGeneratorGLES.cpp b/GPU/GLES/VertexShaderGeneratorGLES.cpp index 75d3afdbc8..7d0cd6730f 100644 --- a/GPU/GLES/VertexShaderGeneratorGLES.cpp +++ b/GPU/GLES/VertexShaderGeneratorGLES.cpp @@ -728,7 +728,7 @@ bool GenerateVertexShaderGLSL(const VShaderID &id, char *buffer, const ShaderLan } else if (compat.shaderLanguage == HLSL_D3D9 || compat.shaderLanguage == HLSL_D3D11) { WRITE(p, "VS_OUT main(VS_IN In) {\n"); WRITE(p, " VS_OUT Out;\n"); - if (doTexture) { + if (doTexture && hasTexcoord) { if (texCoordInVec3) { WRITE(p, " vec3 texcoord = In.texcoord;\n"); } else { @@ -890,7 +890,7 @@ bool GenerateVertexShaderGLSL(const VShaderID &id, char *buffer, const ShaderLan } if (!specularIsZero) { - WRITE(p, " lowp vec3 lightSum1 = vec3(0.0);\n"); + WRITE(p, " lowp vec3 lightSum1 = splat3(0.0);\n"); } if (!diffuseIsZero) { WRITE(p, " vec3 toLight;\n"); @@ -1065,7 +1065,7 @@ bool GenerateVertexShaderGLSL(const VShaderID &id, char *buffer, const ShaderLan break; } // Transform by texture matrix. XYZ as we are doing projection mapping. - WRITE(p, " %sv_texcoord = (%s * u_texmtx).xyz * vec3(u_uvscaleoffset.xy, 1.0);\n", compat.vsOutPrefix, temp_tc.c_str()); + WRITE(p, " %sv_texcoord = mul(%s, u_texmtx).xyz * vec3(u_uvscaleoffset.xy, 1.0);\n", compat.vsOutPrefix, temp_tc.c_str()); } break; From ba7c2e856b4c48ef0ce896222219d7100b654505 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Sun, 1 Nov 2020 12:07:40 +0100 Subject: [PATCH 165/275] Fix through mode differences --- GPU/Directx9/VertexShaderGeneratorHLSL.cpp | 14 +++++++------- GPU/GLES/VertexShaderGeneratorGLES.cpp | 22 +++++++++++----------- unittest/TestShaderGenerators.cpp | 11 ++++++++++- 3 files changed, 28 insertions(+), 19 deletions(-) diff --git a/GPU/Directx9/VertexShaderGeneratorHLSL.cpp b/GPU/Directx9/VertexShaderGeneratorHLSL.cpp index 7ffdf5826b..8369271ba4 100644 --- a/GPU/Directx9/VertexShaderGeneratorHLSL.cpp +++ b/GPU/Directx9/VertexShaderGeneratorHLSL.cpp @@ -59,7 +59,7 @@ bool GenerateVertexShaderHLSL(const VShaderID &id, char *buffer, ShaderLanguage bool flipNormal = id.Bit(VS_BIT_NORM_REVERSE); int ls0 = id.Bits(VS_BIT_LS0, 2); int ls1 = id.Bits(VS_BIT_LS1, 2); - bool enableBones = id.Bit(VS_BIT_ENABLE_BONES); + bool enableBones = id.Bit(VS_BIT_ENABLE_BONES) && !useHWTransform; bool enableLighting = id.Bit(VS_BIT_LIGHTING_ENABLE); int matUpdate = id.Bits(VS_BIT_MATERIAL_UPDATE, 3); @@ -212,7 +212,7 @@ bool GenerateVertexShaderHLSL(const VShaderID &id, char *buffer, ShaderLanguage } // only software transform supplies color1 as vertex data if (lmode) { - WRITE(p, " vec4 color1 : COLOR1;\n"); + WRITE(p, " vec3 color1 : COLOR1;\n"); } WRITE(p, "};\n"); } @@ -355,7 +355,7 @@ bool GenerateVertexShaderHLSL(const VShaderID &id, char *buffer, ShaderLanguage if (hasColor) { WRITE(p, " vec4 color0 = In.color0;\n"); if (lmode && !useHWTransform) { - WRITE(p, " vec4 color1 = In.color1;\n"); + WRITE(p, " vec3 color1 = In.color1;\n"); } } if (hasNormal) { @@ -382,7 +382,7 @@ bool GenerateVertexShaderHLSL(const VShaderID &id, char *buffer, ShaderLanguage if (hasColor) { WRITE(p, " Out.v_color0 = color0;\n"); if (lmode) - WRITE(p, " Out.v_color1 = color1.rgb;\n"); + WRITE(p, " Out.v_color1 = color1;\n"); } else { WRITE(p, " Out.v_color0 = u_matambientalpha;\n"); if (lmode) @@ -392,12 +392,12 @@ bool GenerateVertexShaderHLSL(const VShaderID &id, char *buffer, ShaderLanguage WRITE(p, " Out.v_fogdepth = position.w;\n"); } if (isModeThrough) { - WRITE(p, " vec4 outPos = mul(u_proj_through, vec4(In.position.xyz, 1.0));\n"); + WRITE(p, " vec4 outPos = mul(u_proj_through, vec4(position.xyz, 1.0));\n"); } else { if (gstate_c.Supports(GPU_ROUND_DEPTH_TO_16BIT)) { - WRITE(p, " vec4 outPos = depthRoundZVP(mul(u_proj, vec4(In.position.xyz, 1.0)));\n"); + WRITE(p, " vec4 outPos = depthRoundZVP(mul(u_proj, vec4(position.xyz, 1.0)));\n"); } else { - WRITE(p, " vec4 outPos = mul(u_proj, vec4(In.position.xyz, 1.0));\n"); + WRITE(p, " vec4 outPos = mul(u_proj, vec4(position.xyz, 1.0));\n"); } } } else { diff --git a/GPU/GLES/VertexShaderGeneratorGLES.cpp b/GPU/GLES/VertexShaderGeneratorGLES.cpp index 7d0cd6730f..adf37fdfdb 100644 --- a/GPU/GLES/VertexShaderGeneratorGLES.cpp +++ b/GPU/GLES/VertexShaderGeneratorGLES.cpp @@ -200,7 +200,7 @@ bool GenerateVertexShaderGLSL(const VShaderID &id, char *buffer, const ShaderLan bool flipNormal = id.Bit(VS_BIT_NORM_REVERSE); int ls0 = id.Bits(VS_BIT_LS0, 2); int ls1 = id.Bits(VS_BIT_LS1, 2); - bool enableBones = id.Bit(VS_BIT_ENABLE_BONES); + bool enableBones = id.Bit(VS_BIT_ENABLE_BONES) && useHWTransform; bool enableLighting = id.Bit(VS_BIT_LIGHTING_ENABLE); int matUpdate = id.Bits(VS_BIT_MATERIAL_UPDATE, 3); @@ -404,7 +404,7 @@ bool GenerateVertexShaderGLSL(const VShaderID &id, char *buffer, const ShaderLan } // only software transform supplies color1 as vertex data if (lmode) { - WRITE(p, " vec4 color1 : COLOR1;\n"); + WRITE(p, " vec3 color1 : COLOR1;\n"); } WRITE(p, "};\n"); } @@ -738,7 +738,7 @@ bool GenerateVertexShaderGLSL(const VShaderID &id, char *buffer, const ShaderLan if (hasColor) { WRITE(p, " vec4 color0 = In.color0;\n"); if (lmode && !useHWTransform) { - WRITE(p, " vec4 color1 = In.color1;\n"); + WRITE(p, " vec3 color1 = In.color1;\n"); } } if (hasNormal) { @@ -758,25 +758,25 @@ bool GenerateVertexShaderGLSL(const VShaderID &id, char *buffer, const ShaderLan // Simple pass-through of vertex data to fragment shader if (doTexture) { if (texCoordInVec3) { - WRITE(p, " v_texcoord = texcoord;\n"); + WRITE(p, " %sv_texcoord = texcoord;\n", compat.vsOutPrefix); } else { - WRITE(p, " v_texcoord = vec3(texcoord, 1.0);\n"); + WRITE(p, " %sv_texcoord = vec3(texcoord, 1.0);\n", compat.vsOutPrefix); } } if (hasColor) { - WRITE(p, " v_color0 = color0;\n"); + WRITE(p, " %sv_color0 = color0;\n", compat.vsOutPrefix); if (lmode) - WRITE(p, " v_color1 = color1;\n"); + WRITE(p, " %sv_color1 = color1;\n", compat.vsOutPrefix); } else { - WRITE(p, " v_color0 = u_matambientalpha;\n"); + WRITE(p, " %sv_color0 = u_matambientalpha;\n", compat.vsOutPrefix); if (lmode) - WRITE(p, " v_color1 = vec3(0.0);\n"); + WRITE(p, " %sv_color1 = vec3(0.0);\n", compat.vsOutPrefix); } if (enableFog) { - WRITE(p, " v_fogdepth = position.w;\n"); + WRITE(p, " %sv_fogdepth = position.w;\n", compat.vsOutPrefix); } if (isModeThrough) { - WRITE(p, " vec4 outPos = u_proj_through * vec4(position.xyz, 1.0);\n"); + WRITE(p, " vec4 outPos = mul(u_proj_through, vec4(position.xyz, 1.0));\n"); } else { // The viewport is used in this case, so need to compensate for that. if (gstate_c.Supports(GPU_ROUND_DEPTH_TO_16BIT)) { diff --git a/unittest/TestShaderGenerators.cpp b/unittest/TestShaderGenerators.cpp index 0437499265..d0f1e4bc01 100644 --- a/unittest/TestShaderGenerators.cpp +++ b/unittest/TestShaderGenerators.cpp @@ -191,8 +191,17 @@ bool TestShaderGenerators() { id.d[0] = bottom; id.d[1] = top; + // The generated bits need some adjustment: + // We don't use these bits in the HLSL shader generator. id.SetBits(VS_BIT_WEIGHT_FMTSCALE, 2, 0); + // If mode is through, we won't do hardware transform. + if (id.Bit(VS_BIT_IS_THROUGH)) { + id.SetBit(VS_BIT_USE_HW_TRANSFORM, 0); + } + if (!id.Bit(VS_BIT_USE_HW_TRANSFORM)) { + id.SetBit(VS_BIT_ENABLE_BONES, 0); + } bool generateSuccess[numLanguages]{}; std::string genErrorString[numLanguages]; @@ -223,7 +232,7 @@ bool TestShaderGenerators() { if (generateSuccess[j]) { std::string errorMessage; if (!TestCompileShader(buffer[j], languages[j], true, &errorMessage)) { - printf("Error compiling vertex shader:\n\n%s\n\n%s\n", LineNumberString(buffer[j]).c_str(), errorMessage.c_str()); + printf("Error compiling vertex shader %d:\n\n%s\n\n%s\n", (int)j, LineNumberString(buffer[j]).c_str(), errorMessage.c_str()); return false; } successes++; From 642f2004d3be9dbacede005278c53301f2a6fb54 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Sun, 1 Nov 2020 12:23:46 +0100 Subject: [PATCH 166/275] Start working on getting tess to match --- GPU/Directx9/VertexShaderGeneratorHLSL.cpp | 12 ++--- GPU/GLES/VertexShaderGeneratorGLES.cpp | 52 ++++++++++++++++++---- 2 files changed, 50 insertions(+), 14 deletions(-) diff --git a/GPU/Directx9/VertexShaderGeneratorHLSL.cpp b/GPU/Directx9/VertexShaderGeneratorHLSL.cpp index 8369271ba4..6183b3433d 100644 --- a/GPU/Directx9/VertexShaderGeneratorHLSL.cpp +++ b/GPU/Directx9/VertexShaderGeneratorHLSL.cpp @@ -271,8 +271,8 @@ bool GenerateVertexShaderHLSL(const VShaderID &id, char *buffer, ShaderLanguage const char *init[3] = { "0.0, 0.0", "0.0, 0.0, 0.0", "0.0, 0.0, 0.0, 0.0" }; for (int i = 2; i <= 4; i++) { // Define 3 types vec2, vec3, vec4 - WRITE(p, "float%d tess_sample(in float%d points[16], mat4 weights) {\n", i, i); - WRITE(p, " float%d pos = float%d(%s);\n", i, i, init[i - 2]); + WRITE(p, "vec%d tess_sample(in vec%d points[16], mat4 weights) {\n", i, i); + WRITE(p, " vec%d pos = vec%d(%s);\n", i, i, init[i - 2]); for (int v = 0; v < 4; ++v) { for (int u = 0; u < 4; ++u) { WRITE(p, " pos += weights[%i][%i] * points[%i];\n", v, u, v * 4 + u); @@ -296,8 +296,10 @@ bool GenerateVertexShaderHLSL(const VShaderID &id, char *buffer, ShaderLanguage WRITE(p, "};\n"); WRITE(p, "void tessellate(in VS_IN In, out Tess tess) {\n"); - WRITE(p, " int2 point_pos = int2(In.position.z, In.normal.z)%s;\n", doBezier ? " * 3" : ""); - WRITE(p, " int2 weight_idx = int2(In.position.xy);\n"); + WRITE(p, " vec3 position = In.position;\n"); + WRITE(p, " vec3 normal = In.normal;\n"); + WRITE(p, " ivec2 point_pos = ivec2(position.z, normal.z)%s;\n", doBezier ? " * 3" : ""); + WRITE(p, " ivec2 weight_idx = ivec2(position.xy);\n"); // Load 4x4 control points WRITE(p, " vec3 _pos[16];\n"); WRITE(p, " vec2 _tex[16];\n"); @@ -305,7 +307,7 @@ bool GenerateVertexShaderHLSL(const VShaderID &id, char *buffer, ShaderLanguage WRITE(p, " int index;\n"); for (int i = 0; i < 4; i++) { for (int j = 0; j < 4; j++) { - WRITE(p, " index = (%i + point_pos.y) * u_spline_counts + (%i + point_pos.x);\n", i, j); + WRITE(p, " index = (%i + point_pos.y) * int(u_spline_counts) + (%i + point_pos.x);\n", i, j); WRITE(p, " _pos[%i] = tess_data[index].pos;\n", i * 4 + j); if (doTexture && hasTexcoordTess) WRITE(p, " _tex[%i] = tess_data[index].tex;\n", i * 4 + j); diff --git a/GPU/GLES/VertexShaderGeneratorGLES.cpp b/GPU/GLES/VertexShaderGeneratorGLES.cpp index adf37fdfdb..fe32991563 100644 --- a/GPU/GLES/VertexShaderGeneratorGLES.cpp +++ b/GPU/GLES/VertexShaderGeneratorGLES.cpp @@ -138,6 +138,7 @@ const char *hlsl_preamble_vs = "#define vec2 float2\n" "#define vec3 float3\n" "#define vec4 float4\n" +"#define int2 ivec2\n" "#define mat4 float4x4\n" "#define mat3x4 float4x3\n" // note how the conventions are backwards "#define splat3(x) vec3(x, x, x)\n" @@ -207,10 +208,12 @@ bool GenerateVertexShaderGLSL(const VShaderID &id, char *buffer, const ShaderLan // Apparently we don't support bezier/spline together with bones. bool doBezier = id.Bit(VS_BIT_BEZIER) && !enableBones && useHWTransform; bool doSpline = id.Bit(VS_BIT_SPLINE) && !enableBones && useHWTransform; - if ((doBezier || doSpline) && !hasNormal) { - // Bad usage. - *errorString = "Invalid flags - tess requires normal."; - return false; + if (doBezier || doSpline) { + if (!hasNormal) { + // Bad usage. + *errorString = "Invalid flags - tess requires normal."; + return false; + } } bool hasColorTess = id.Bit(VS_BIT_HAS_COLOR_TESS); bool hasTexcoordTess = id.Bit(VS_BIT_HAS_TEXCOORD_TESS); @@ -611,18 +614,35 @@ bool GenerateVertexShaderGLSL(const VShaderID &id, char *buffer, const ShaderLan WRITE(p, "layout (std430, set = 0, binding = 8) readonly buffer s_tess_weights_v {\n"); WRITE(p, " TessWeight data[];\n"); WRITE(p, "} tess_weights_v;\n"); - } else { + } else if (ShaderLanguageIsOpenGL(compat.shaderLanguage)) { WRITE(p, "uniform sampler2D u_tess_points;\n"); // Control Points WRITE(p, "uniform sampler2D u_tess_weights_u;\n"); WRITE(p, "uniform sampler2D u_tess_weights_v;\n"); WRITE(p, "uniform int u_spline_counts;\n"); + } else if (compat.shaderLanguage == HLSL_D3D11) { + WRITE(p, "struct TessData {\n"); + WRITE(p, " vec3 pos; float pad1;\n"); + WRITE(p, " vec2 tex; vec2 pad2;\n"); + WRITE(p, " vec4 col;\n"); + WRITE(p, "};\n"); + WRITE(p, "StructuredBuffer tess_data : register(t0);\n"); + + WRITE(p, "struct TessWeight {\n"); + WRITE(p, " vec4 basis;\n"); + WRITE(p, " vec4 deriv;\n"); + WRITE(p, "};\n"); + WRITE(p, "StructuredBuffer tess_weights_u : register(t1);\n"); + WRITE(p, "StructuredBuffer tess_weights_v : register(t2);\n"); + } else if (compat.shaderLanguage == HLSL_D3D9) { + } + const char *init[3] = { "0.0, 0.0", "0.0, 0.0, 0.0", "0.0, 0.0, 0.0, 0.0" }; for (int i = 2; i <= 4; i++) { // Define 3 types vec2, vec3, vec4 WRITE(p, "vec%d tess_sample(in vec%d points[16], mat4 weights) {\n", i, i); - WRITE(p, " vec%d pos = vec%d(0.0);\n", i, i); + WRITE(p, " vec%d pos = vec%d(%s);\n", i, i, init[i - 2]); for (int v = 0; v < 4; ++v) { for (int u = 0; u < 4; ++u) { WRITE(p, " pos += weights[%i][%i] * points[%i];\n", v, u, v * 4 + u); @@ -632,10 +652,14 @@ bool GenerateVertexShaderGLSL(const VShaderID &id, char *buffer, const ShaderLan WRITE(p, "}\n"); } - if (compat.glslVersionNumber < 130) { // For glsl version 1.10 + if (ShaderLanguageIsOpenGL(compat.shaderLanguage) && compat.glslVersionNumber < 130) { // For glsl version 1.10 WRITE(p, "mat4 outerProduct(vec4 u, vec4 v) {\n"); WRITE(p, " return mat4(u * v[0], u * v[1], u * v[2], u * v[3]);\n"); WRITE(p, "}\n"); + } else if (compat.shaderLanguage == HLSL_D3D9 || compat.shaderLanguage == HLSL_D3D11) { + WRITE(p, "mat4 outerProduct(vec4 u, vec4 v) {\n"); + WRITE(p, " return mul((float4x1)v, (float1x4)u);\n"); + WRITE(p, "}\n"); } WRITE(p, "struct Tess {\n"); @@ -647,7 +671,13 @@ bool GenerateVertexShaderGLSL(const VShaderID &id, char *buffer, const ShaderLan WRITE(p, " vec3 nrm;\n"); WRITE(p, "};\n"); - WRITE(p, "void tessellate(out Tess tess) {\n"); + if (compat.shaderLanguage == HLSL_D3D9 || compat.shaderLanguage == HLSL_D3D11) { + WRITE(p, "void tessellate(in VS_IN In, out Tess tess) {\n"); + WRITE(p, " vec3 position = In.position;\n"); + WRITE(p, " vec3 normal = In.normal;\n"); + } else { + WRITE(p, "void tessellate(out Tess tess) {\n"); + } WRITE(p, " ivec2 point_pos = ivec2(position.z, normal.z)%s;\n", doBezier ? " * 3" : ""); WRITE(p, " ivec2 weight_idx = ivec2(position.xy);\n"); @@ -791,7 +821,11 @@ bool GenerateVertexShaderGLSL(const VShaderID &id, char *buffer, const ShaderLan if (doBezier || doSpline) { // Hardware tessellation WRITE(p, " Tess tess;\n"); - WRITE(p, " tessellate(tess);\n"); + if (compat.shaderLanguage == HLSL_D3D9 || compat.shaderLanguage == HLSL_D3D11) { + WRITE(p, " tessellate(In, tess);\n"); + } else { + WRITE(p, " tessellate(tess);\n"); + } WRITE(p, " vec3 worldpos = mul(vec4(tess.pos.xyz, 1.0), u_world).xyz;\n"); if (hasNormalTess) { From f1dbd25de923e5eefbeddbba4a2c745e1b5116db Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Sun, 1 Nov 2020 12:37:19 +0100 Subject: [PATCH 167/275] Fix remaining differences between generated shaders --- GPU/Directx9/VertexShaderGeneratorHLSL.cpp | 50 ++++++++++++---------- GPU/GLES/VertexShaderGeneratorGLES.cpp | 48 +++++++++++---------- 2 files changed, 53 insertions(+), 45 deletions(-) diff --git a/GPU/Directx9/VertexShaderGeneratorHLSL.cpp b/GPU/Directx9/VertexShaderGeneratorHLSL.cpp index 6183b3433d..0c603ada48 100644 --- a/GPU/Directx9/VertexShaderGeneratorHLSL.cpp +++ b/GPU/Directx9/VertexShaderGeneratorHLSL.cpp @@ -65,10 +65,16 @@ bool GenerateVertexShaderHLSL(const VShaderID &id, char *buffer, ShaderLanguage bool doBezier = id.Bit(VS_BIT_BEZIER) && !enableBones && useHWTransform; bool doSpline = id.Bit(VS_BIT_SPLINE) && !enableBones && useHWTransform; - if ((doBezier || doSpline) && !hasNormal) { - // Bad usage. - *errorString = "Invalid flags - tess requires normal."; - return false; + if (doBezier || doSpline) { + if (!hasNormal) { + // Bad usage. + *errorString = "Invalid flags - tess requires normal."; + return false; + } + if (lang == HLSL_D3D9) { + *errorString = "D3D9: Tess not supported"; + return false; + } } bool hasColorTess = id.Bit(VS_BIT_HAS_COLOR_TESS); bool hasTexcoordTess = id.Bit(VS_BIT_HAS_TEXCOORD_TESS); @@ -252,21 +258,19 @@ bool GenerateVertexShaderHLSL(const VShaderID &id, char *buffer, ShaderLanguage // Hardware tessellation if (doSpline || doBezier) { - if (lang == HLSL_D3D11) { - WRITE(p, "struct TessData {\n"); - WRITE(p, " vec3 pos; float pad1;\n"); - WRITE(p, " vec2 tex; vec2 pad2;\n"); - WRITE(p, " vec4 col;\n"); - WRITE(p, "};\n"); - WRITE(p, "StructuredBuffer tess_data : register(t0);\n"); + WRITE(p, "struct TessData {\n"); + WRITE(p, " vec3 pos; float pad1;\n"); + WRITE(p, " vec2 tex; vec2 pad2;\n"); + WRITE(p, " vec4 col;\n"); + WRITE(p, "};\n"); + WRITE(p, "StructuredBuffer tess_data : register(t0);\n"); - WRITE(p, "struct TessWeight {\n"); - WRITE(p, " vec4 basis;\n"); - WRITE(p, " vec4 deriv;\n"); - WRITE(p, "};\n"); - WRITE(p, "StructuredBuffer tess_weights_u : register(t1);\n"); - WRITE(p, "StructuredBuffer tess_weights_v : register(t2);\n"); - } + WRITE(p, "struct TessWeight {\n"); + WRITE(p, " vec4 basis;\n"); + WRITE(p, " vec4 deriv;\n"); + WRITE(p, "};\n"); + WRITE(p, "StructuredBuffer tess_weights_u : register(t1);\n"); + WRITE(p, "StructuredBuffer tess_weights_v : register(t2);\n"); const char *init[3] = { "0.0, 0.0", "0.0, 0.0, 0.0", "0.0, 0.0, 0.0, 0.0" }; for (int i = 2; i <= 4; i++) { @@ -308,9 +312,9 @@ bool GenerateVertexShaderHLSL(const VShaderID &id, char *buffer, ShaderLanguage for (int i = 0; i < 4; i++) { for (int j = 0; j < 4; j++) { WRITE(p, " index = (%i + point_pos.y) * int(u_spline_counts) + (%i + point_pos.x);\n", i, j); - WRITE(p, " _pos[%i] = tess_data[index].pos;\n", i * 4 + j); + WRITE(p, " _pos[%i] = tess_data[index].pos.xyz;\n", i * 4 + j); if (doTexture && hasTexcoordTess) - WRITE(p, " _tex[%i] = tess_data[index].tex;\n", i * 4 + j); + WRITE(p, " _tex[%i] = tess_data[index].tex.xy;\n", i * 4 + j); if (hasColorTess) WRITE(p, " _col[%i] = tess_data[index].col;\n", i * 4 + j); } @@ -327,7 +331,7 @@ bool GenerateVertexShaderHLSL(const VShaderID &id, char *buffer, ShaderLanguage if (hasTexcoordTess) WRITE(p, " tess.tex = tess_sample(_tex, basis);\n"); else - WRITE(p, " tess.tex = In.normal.xy;\n"); + WRITE(p, " tess.tex = normal.xy;\n"); } if (hasColorTess) WRITE(p, " tess.col = tess_sample(_col, basis);\n"); @@ -388,7 +392,7 @@ bool GenerateVertexShaderHLSL(const VShaderID &id, char *buffer, ShaderLanguage } else { WRITE(p, " Out.v_color0 = u_matambientalpha;\n"); if (lmode) - WRITE(p, " Out.v_color1 = vec3(0.0);\n"); + WRITE(p, " Out.v_color1 = splat3(0.0);\n"); } if (enableFog) { WRITE(p, " Out.v_fogdepth = position.w;\n"); @@ -412,7 +416,7 @@ bool GenerateVertexShaderHLSL(const VShaderID &id, char *buffer, ShaderLanguage WRITE(p, " vec3 worldpos = mul(vec4(tess.pos.xyz, 1.0), u_world).xyz;\n"); if (hasNormalTess) - WRITE(p, " vec3 worldnormal = normalize(mul(vec4(%stess.nrm, 0.0), u_world)).xyz;\n", flipNormalTess ? "-" : ""); + WRITE(p, " mediump vec3 worldnormal = normalize(mul(vec4(%stess.nrm, 0.0), u_world).xyz);\n", flipNormalTess ? "-" : ""); else WRITE(p, " mediump vec3 worldnormal = vec3(0.0, 0.0, 1.0);\n"); } else { diff --git a/GPU/GLES/VertexShaderGeneratorGLES.cpp b/GPU/GLES/VertexShaderGeneratorGLES.cpp index fe32991563..a026ccf469 100644 --- a/GPU/GLES/VertexShaderGeneratorGLES.cpp +++ b/GPU/GLES/VertexShaderGeneratorGLES.cpp @@ -138,7 +138,7 @@ const char *hlsl_preamble_vs = "#define vec2 float2\n" "#define vec3 float3\n" "#define vec4 float4\n" -"#define int2 ivec2\n" +"#define ivec2 int2\n" "#define mat4 float4x4\n" "#define mat3x4 float4x3\n" // note how the conventions are backwards "#define splat3(x) vec3(x, x, x)\n" @@ -214,6 +214,10 @@ bool GenerateVertexShaderGLSL(const VShaderID &id, char *buffer, const ShaderLan *errorString = "Invalid flags - tess requires normal."; return false; } + if (compat.shaderLanguage == HLSL_D3D9 || compat.texelFetch == nullptr) { + *errorString = "Tess not supported on this shader language version"; + return false; + } } bool hasColorTess = id.Bit(VS_BIT_HAS_COLOR_TESS); bool hasTexcoordTess = id.Bit(VS_BIT_HAS_TEXCOORD_TESS); @@ -299,9 +303,9 @@ bool GenerateVertexShaderGLSL(const VShaderID &id, char *buffer, const ShaderLan } else { WRITE(p, "#pragma warning( disable : 3571 )\n"); if (isModeThrough) { - WRITE(p, "float4x4 u_proj_through : register(c%i);\n", CONST_VS_PROJ_THROUGH); + WRITE(p, "mat4 u_proj_through : register(c%i);\n", CONST_VS_PROJ_THROUGH); } else { - WRITE(p, "float4x4 u_proj : register(c%i);\n", CONST_VS_PROJ); + WRITE(p, "mat4 u_proj : register(c%i);\n", CONST_VS_PROJ); // Add all the uniforms we'll need to transform properly. } @@ -597,23 +601,23 @@ bool GenerateVertexShaderGLSL(const VShaderID &id, char *buffer, const ShaderLan if (compat.shaderLanguage == GLSL_VULKAN) { WRITE(p, "struct TessData {\n"); WRITE(p, " vec4 pos;\n"); - WRITE(p, " vec4 uv;\n"); - WRITE(p, " vec4 color;\n"); + WRITE(p, " vec4 tex;\n"); + WRITE(p, " vec4 col;\n"); WRITE(p, "};\n"); WRITE(p, "layout (std430, set = 0, binding = 6) readonly buffer s_tess_data {\n"); - WRITE(p, " TessData data[];\n"); - WRITE(p, "} tess_data;\n"); + WRITE(p, " TessData tess_data[];\n"); + WRITE(p, "};\n"); WRITE(p, "struct TessWeight {\n"); WRITE(p, " vec4 basis;\n"); WRITE(p, " vec4 deriv;\n"); WRITE(p, "};\n"); WRITE(p, "layout (std430, set = 0, binding = 7) readonly buffer s_tess_weights_u {\n"); - WRITE(p, " TessWeight data[];\n"); - WRITE(p, "} tess_weights_u;\n"); + WRITE(p, " TessWeight tess_weights_u[];\n"); + WRITE(p, "};\n"); WRITE(p, "layout (std430, set = 0, binding = 8) readonly buffer s_tess_weights_v {\n"); - WRITE(p, " TessWeight data[];\n"); - WRITE(p, "} tess_weights_v;\n"); + WRITE(p, " TessWeight tess_weights_v[];\n"); + WRITE(p, "};\n"); } else if (ShaderLanguageIsOpenGL(compat.shaderLanguage)) { WRITE(p, "uniform sampler2D u_tess_points;\n"); // Control Points WRITE(p, "uniform sampler2D u_tess_weights_u;\n"); @@ -690,17 +694,17 @@ bool GenerateVertexShaderGLSL(const VShaderID &id, char *buffer, const ShaderLan for (int i = 0; i < 4; i++) { for (int j = 0; j < 4; j++) { WRITE(p, " index = (%i + point_pos.y) * int(u_spline_counts) + (%i + point_pos.x);\n", i, j); - WRITE(p, " _pos[%i] = tess_data.data[index].pos.xyz;\n", i * 4 + j); + WRITE(p, " _pos[%i] = tess_data[index].pos.xyz;\n", i * 4 + j); if (doTexture && hasTexcoordTess) - WRITE(p, " _tex[%i] = tess_data.data[index].uv.xy;\n", i * 4 + j); + WRITE(p, " _tex[%i] = tess_data[index].tex.xy;\n", i * 4 + j); if (hasColorTess) - WRITE(p, " _col[%i] = tess_data.data[index].color;\n", i * 4 + j); + WRITE(p, " _col[%i] = tess_data[index].col;\n", i * 4 + j); } } // Basis polynomials as weight coefficients - WRITE(p, " vec4 basis_u = tess_weights_u.data[weight_idx.x].basis;\n"); - WRITE(p, " vec4 basis_v = tess_weights_v.data[weight_idx.y].basis;\n"); + WRITE(p, " vec4 basis_u = tess_weights_u[weight_idx.x].basis;\n"); + WRITE(p, " vec4 basis_v = tess_weights_v[weight_idx.y].basis;\n"); WRITE(p, " mat4 basis = outerProduct(basis_u, basis_v);\n"); } else { @@ -738,8 +742,8 @@ bool GenerateVertexShaderGLSL(const VShaderID &id, char *buffer, const ShaderLan if (hasNormalTess) { if (compat.coefsFromBuffers) { // Derivatives as weight coefficients - WRITE(p, " vec4 deriv_u = tess_weights_u.data[weight_idx.x].deriv;\n"); - WRITE(p, " vec4 deriv_v = tess_weights_v.data[weight_idx.y].deriv;\n"); + WRITE(p, " vec4 deriv_u = tess_weights_u[weight_idx.x].deriv;\n"); + WRITE(p, " vec4 deriv_v = tess_weights_v[weight_idx.y].deriv;\n"); } else { // Derivatives as weight coefficients WRITE(p, " vec4 deriv_u = %s(u_tess_weights_u, %s, 0);\n", compat.texelFetch, "ivec2(weight_idx.x * 2 + 1, 0)"); @@ -800,7 +804,7 @@ bool GenerateVertexShaderGLSL(const VShaderID &id, char *buffer, const ShaderLan } else { WRITE(p, " %sv_color0 = u_matambientalpha;\n", compat.vsOutPrefix); if (lmode) - WRITE(p, " %sv_color1 = vec3(0.0);\n", compat.vsOutPrefix); + WRITE(p, " %sv_color1 = splat3(0.0);\n", compat.vsOutPrefix); } if (enableFog) { WRITE(p, " %sv_fogdepth = position.w;\n", compat.vsOutPrefix); @@ -1018,7 +1022,7 @@ bool GenerateVertexShaderGLSL(const VShaderID &id, char *buffer, const ShaderLan WRITE(p, " %sv_color0 = clamp(lightSum0, 0.0, 1.0);\n", compat.vsOutPrefix); // v_color1 only exists when lmode = 1. if (specularIsZero) { - WRITE(p, " %sv_color1 = vec3(0.0);\n", compat.vsOutPrefix); + WRITE(p, " %sv_color1 = splat3(0.0);\n", compat.vsOutPrefix); } else { WRITE(p, " %sv_color1 = clamp(lightSum1, 0.0, 1.0);\n", compat.vsOutPrefix); } @@ -1040,7 +1044,7 @@ bool GenerateVertexShaderGLSL(const VShaderID &id, char *buffer, const ShaderLan WRITE(p, " %sv_color0 = u_matambientalpha;\n", compat.vsOutPrefix); } if (lmode) - WRITE(p, " %sv_color1 = vec3(0.0);\n", compat.vsOutPrefix); + WRITE(p, " %sv_color1 = splat3(0.0);\n", compat.vsOutPrefix); } bool scaleUV = !isModeThrough && (uvGenMode == GE_TEXMAP_TEXTURE_COORDS || uvGenMode == GE_TEXMAP_UNKNOWN); @@ -1057,7 +1061,7 @@ bool GenerateVertexShaderGLSL(const VShaderID &id, char *buffer, const ShaderLan else WRITE(p, " %sv_texcoord = vec3(texcoord.xy * u_uvscaleoffset.xy, 0.0);\n", compat.vsOutPrefix); } else { - WRITE(p, " %sv_texcoord = vec3(0.0);\n", compat.vsOutPrefix); + WRITE(p, " %sv_texcoord = splat3(0.0);\n", compat.vsOutPrefix); } } else { if (hasTexcoord) { From 17778131bddee7df8efbee3d78abc5937b42a990 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Sun, 1 Nov 2020 12:45:35 +0100 Subject: [PATCH 168/275] Share the uniform buffer declarations between D3D11 and VK. --- GPU/Common/FragmentShaderGenerator.cpp | 5 +- GPU/Common/ShaderUniforms.h | 68 ---------------------- GPU/Directx9/VertexShaderGeneratorHLSL.cpp | 6 +- GPU/GLES/VertexShaderGeneratorGLES.cpp | 7 ++- 4 files changed, 11 insertions(+), 75 deletions(-) diff --git a/GPU/Common/FragmentShaderGenerator.cpp b/GPU/Common/FragmentShaderGenerator.cpp index f593c82115..bb51a14c36 100644 --- a/GPU/Common/FragmentShaderGenerator.cpp +++ b/GPU/Common/FragmentShaderGenerator.cpp @@ -51,6 +51,9 @@ const char *hlsl_preamble_fs = "#define vec4 float4\n" "#define uvec3 uint3\n" "#define ivec3 int3\n" +"#define ivec4 int4\n" +"#define mat4 float4x4\n" +"#define mat3x4 float4x3\n" // note how the conventions are backwards "#define splat3(x) float3(x, x, x)\n" "#define mix lerp\n" "#define mod(x, y) fmod(x, y)\n"; @@ -246,7 +249,7 @@ bool GenerateFragmentShader(const FShaderID &id, char *buffer, const ShaderLangu WRITE(p, "Texture2D fboTex : register(t1);\n"); } } - WRITE(p, "cbuffer base : register(b0) {\n%s};\n", cb_baseStr); + WRITE(p, "cbuffer base : register(b0) {\n%s};\n", ub_baseStr); } if (enableAlphaTest) { diff --git a/GPU/Common/ShaderUniforms.h b/GPU/Common/ShaderUniforms.h index fc8ac8e95e..a2ecf4a71b 100644 --- a/GPU/Common/ShaderUniforms.h +++ b/GPU/Common/ShaderUniforms.h @@ -72,34 +72,6 @@ R"( mat4 u_proj; vec2 u_texclampoff; )"; -// HLSL code is shared so these names are changed to match those in DX9. -static const char *cb_baseStr = -R"( float4x4 u_proj; - float4x4 u_proj_through; - float4x3 u_view; - float4x3 u_world; - float4x3 u_texmtx; - float4 u_uvscaleoffset; - float4 u_depthRange; - float2 u_fogcoef; - float u_stencilReplaceValue; - float4 u_matambientalpha; - uint u_spline_counts; - uint u_depal_mask_shift_off_fmt; - int pad2; - int pad3; - float4 u_cullRangeMin; - float4 u_cullRangeMax; - float3 u_fogcolor; - float3 u_texenv; - int4 u_alphacolorref; - uint4 u_alphacolormask; - float3 u_blendFixA; - float3 u_blendFixB; - float4 u_texclamp; - float2 u_texclampoff; -)"; - // 512 bytes. Would like to shrink more. Some colors only have 8-bit precision and we expand // them to float unnecessarily, could just as well expand in the shader. struct UB_VS_Lights { @@ -151,42 +123,6 @@ R"( vec4 u_ambient; vec3 u_lightspecular3; )"; -// HLSL code is shared so these names are changed to match those in DX9. -static const char *cb_vs_lightsStr = -R"( float4 u_ambient; - float3 u_matdiffuse; - float4 u_matspecular; - float3 u_matemissive; - float3 u_lightpos0; - float3 u_lightpos1; - float3 u_lightpos2; - float3 u_lightpos3; - float3 u_lightdir0; - float3 u_lightdir1; - float3 u_lightdir2; - float3 u_lightdir3; - float3 u_lightatt0; - float3 u_lightatt1; - float3 u_lightatt2; - float3 u_lightatt3; - float4 u_lightangle_spotCoef0; - float4 u_lightangle_spotCoef1; - float4 u_lightangle_spotCoef2; - float4 u_lightangle_spotCoef3; - float3 u_lightambient0; - float3 u_lightambient1; - float3 u_lightambient2; - float3 u_lightambient3; - float3 u_lightdiffuse0; - float3 u_lightdiffuse1; - float3 u_lightdiffuse2; - float3 u_lightdiffuse3; - float3 u_lightspecular0; - float3 u_lightspecular1; - float3 u_lightspecular2; - float3 u_lightspecular3; -)"; - // With some cleverness, we could get away with uploading just half this when only the four or five first // bones are being used. This is 384b. struct UB_VS_Bones { @@ -197,10 +133,6 @@ static const char *ub_vs_bonesStr = R"( mat3x4 u_bone0; mat3x4 u_bone1; mat3x4 u_bone2; mat3x4 u_bone3; mat3x4 u_bone4; mat3x4 u_bone5; mat3x4 u_bone6; mat3x4 u_bone7; mat3x4 u_bone8; )"; -static const char *cb_vs_bonesStr = -R"( mat3x4 u_bone0; mat3x4 u_bone1; mat3x4 u_bone2; mat3x4 u_bone3; mat3x4 u_bone4; mat3x4 u_bone5; mat3x4 u_bone6; mat3x4 u_bone7; mat3x4 u_bone8; -)"; - void CalcCullRange(float minValues[4], float maxValues[4], bool flipViewport, bool hasNegZ); void BaseUpdateUniforms(UB_VS_FS_Base *ub, uint64_t dirtyUniforms, bool flipViewport, bool useBufferedRendering); diff --git a/GPU/Directx9/VertexShaderGeneratorHLSL.cpp b/GPU/Directx9/VertexShaderGeneratorHLSL.cpp index 0c603ada48..7e980f70be 100644 --- a/GPU/Directx9/VertexShaderGeneratorHLSL.cpp +++ b/GPU/Directx9/VertexShaderGeneratorHLSL.cpp @@ -173,9 +173,9 @@ bool GenerateVertexShaderHLSL(const VShaderID &id, char *buffer, ShaderLanguage WRITE(p, "vec4 u_cullRangeMax : register(c%i);\n", CONST_VS_CULLRANGEMAX); } } else { - WRITE(p, "cbuffer base : register(b0) {\n%s};\n", cb_baseStr); - WRITE(p, "cbuffer lights: register(b1) {\n%s};\n", cb_vs_lightsStr); - WRITE(p, "cbuffer bones : register(b2) {\n%s};\n", cb_vs_bonesStr); + WRITE(p, "cbuffer base : register(b0) {\n%s};\n", ub_baseStr); + WRITE(p, "cbuffer lights: register(b1) {\n%s};\n", ub_vs_lightsStr); + WRITE(p, "cbuffer bones : register(b2) {\n%s};\n", ub_vs_bonesStr); } bool scaleUV = !isModeThrough && (uvGenMode == GE_TEXMAP_TEXTURE_COORDS || uvGenMode == GE_TEXMAP_UNKNOWN); diff --git a/GPU/GLES/VertexShaderGeneratorGLES.cpp b/GPU/GLES/VertexShaderGeneratorGLES.cpp index a026ccf469..fdc05c58bd 100644 --- a/GPU/GLES/VertexShaderGeneratorGLES.cpp +++ b/GPU/GLES/VertexShaderGeneratorGLES.cpp @@ -139,6 +139,7 @@ const char *hlsl_preamble_vs = "#define vec3 float3\n" "#define vec4 float4\n" "#define ivec2 int2\n" +"#define ivec4 int4\n" "#define mat4 float4x4\n" "#define mat3x4 float4x3\n" // note how the conventions are backwards "#define splat3(x) vec3(x, x, x)\n" @@ -297,9 +298,9 @@ bool GenerateVertexShaderGLSL(const VShaderID &id, char *buffer, const ShaderLan } else if (compat.shaderLanguage == HLSL_D3D11 || compat.shaderLanguage == HLSL_D3D9) { // Note: These two share some code after this hellishly large if/else. if (compat.shaderLanguage == HLSL_D3D11) { - WRITE(p, "cbuffer base : register(b0) {\n%s};\n", cb_baseStr); - WRITE(p, "cbuffer lights: register(b1) {\n%s};\n", cb_vs_lightsStr); - WRITE(p, "cbuffer bones : register(b2) {\n%s};\n", cb_vs_bonesStr); + WRITE(p, "cbuffer base : register(b0) {\n%s};\n", ub_baseStr); + WRITE(p, "cbuffer lights: register(b1) {\n%s};\n", ub_vs_lightsStr); + WRITE(p, "cbuffer bones : register(b2) {\n%s};\n", ub_vs_bonesStr); } else { WRITE(p, "#pragma warning( disable : 3571 )\n"); if (isModeThrough) { From 30b1aafcdeb573497e3ddbe6f1b8da3bb493d41d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Sun, 1 Nov 2020 12:53:27 +0100 Subject: [PATCH 169/275] Another hlsl compatibility fix --- GPU/GLES/VertexShaderGeneratorGLES.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/GPU/GLES/VertexShaderGeneratorGLES.cpp b/GPU/GLES/VertexShaderGeneratorGLES.cpp index fdc05c58bd..1ee37b0fc4 100644 --- a/GPU/GLES/VertexShaderGeneratorGLES.cpp +++ b/GPU/GLES/VertexShaderGeneratorGLES.cpp @@ -1134,7 +1134,7 @@ bool GenerateVertexShaderGLSL(const VShaderID &id, char *buffer, const ShaderLan const char *outMin = "projPos.x < u_cullRangeMin.x || projPos.y < u_cullRangeMin.y || projPos.z < u_cullRangeMin.z"; const char *outMax = "projPos.x > u_cullRangeMax.x || projPos.y > u_cullRangeMax.y || projPos.z > u_cullRangeMax.z"; WRITE(p, " if (%s || %s) {\n", outMin, outMax); - WRITE(p, " outPos.xyzw = vec4(u_cullRangeMax.w);\n"); + WRITE(p, " outPos.xyzw = u_cullRangeMax.wwww;\n"); WRITE(p, " }\n"); WRITE(p, " }\n"); } From be837912e10b0142776efce76a5337040820f72d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Sun, 1 Nov 2020 12:54:44 +0100 Subject: [PATCH 170/275] Delete the HLSL shader generator, switch to the newly generic one. --- CMakeLists.txt | 2 +- GPU/Common/ShaderCommon.h | 3 - GPU/D3D11/ShaderManagerD3D11.cpp | 6 +- GPU/Directx9/ShaderManagerDX9.cpp | 8 +- GPU/Directx9/ShaderManagerDX9.h | 2 +- GPU/Directx9/VertexShaderGeneratorHLSL.cpp | 712 --------------------- GPU/Directx9/VertexShaderGeneratorHLSL.h | 25 - GPU/GPU.vcxproj | 2 - GPU/GPU.vcxproj.filters | 6 - unittest/TestShaderGenerators.cpp | 54 +- 10 files changed, 16 insertions(+), 804 deletions(-) delete mode 100644 GPU/Directx9/VertexShaderGeneratorHLSL.cpp delete mode 100644 GPU/Directx9/VertexShaderGeneratorHLSL.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 2164c02293..1932011ccf 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1299,7 +1299,7 @@ set(GPU_D3D9 GPU/Directx9/TextureScalerDX9.cpp GPU/Directx9/TextureScalerDX9.h GPU/Directx9/VertexShaderGeneratorHLSL.cpp - GPU/Directx9/VertexShaderGeneratorHLSL.h + GPU/GLES/VertexShaderGeneratorGLES.h ) set(GPU_D3D11 diff --git a/GPU/Common/ShaderCommon.h b/GPU/Common/ShaderCommon.h index a12033376f..02f797b869 100644 --- a/GPU/Common/ShaderCommon.h +++ b/GPU/Common/ShaderCommon.h @@ -30,9 +30,6 @@ enum ShaderLanguage { GLSL_VULKAN, HLSL_D3D9, HLSL_D3D11, - - HLSL_D3D9_TEST, - HLSL_D3D11_TEST, }; inline bool ShaderLanguageIsOpenGL(ShaderLanguage lang) { diff --git a/GPU/D3D11/ShaderManagerD3D11.cpp b/GPU/D3D11/ShaderManagerD3D11.cpp index 9f13a9934f..ad3d0a04bc 100644 --- a/GPU/D3D11/ShaderManagerD3D11.cpp +++ b/GPU/D3D11/ShaderManagerD3D11.cpp @@ -35,7 +35,7 @@ #include "GPU/GPUState.h" #include "GPU/ge_constants.h" #include "GPU/D3D11/ShaderManagerD3D11.h" -#include "GPU/Directx9/VertexShaderGeneratorHLSL.h" +#include "GPU/GLES/VertexShaderGeneratorGLES.h" #include "GPU/D3D11/D3D11Util.h" D3D11FragmentShader::D3D11FragmentShader(ID3D11Device *device, D3D_FEATURE_LEVEL featureLevel, FShaderID id, const char *code, bool useHWTransform) @@ -208,7 +208,9 @@ void ShaderManagerD3D11::GetShaders(int prim, u32 vertType, D3D11VertexShader ** if (vsIter == vsCache_.end()) { // Vertex shader not in cache. Let's compile it. std::string genErrorString; - GenerateVertexShaderHLSL(VSID, codeBuffer_, HLSL_D3D11, &genErrorString); + uint32_t attrMask; + uint64_t uniformMask; + GenerateVertexShaderGLSL(VSID, codeBuffer_, compat_, &attrMask, &uniformMask, &genErrorString); vs = new D3D11VertexShader(device_, featureLevel_, VSID, codeBuffer_, vertType, useHWTransform); vsCache_[VSID] = vs; } else { diff --git a/GPU/Directx9/ShaderManagerDX9.cpp b/GPU/Directx9/ShaderManagerDX9.cpp index 14ddf01540..0b0805d37a 100644 --- a/GPU/Directx9/ShaderManagerDX9.cpp +++ b/GPU/Directx9/ShaderManagerDX9.cpp @@ -580,7 +580,9 @@ VSShader *ShaderManagerDX9::ApplyShader(bool useHWTransform, bool useHWTessellat if (vsIter == vsCache_.end()) { // Vertex shader not in cache. Let's compile it. std::string genErrorString; - if (GenerateVertexShaderHLSL(VSID, codeBuffer_, HLSL_D3D9, &genErrorString)) { + uint32_t attrMask; + uint64_t uniformMask; + if (GenerateVertexShaderGLSL(VSID, codeBuffer_, compat_, &attrMask, &uniformMask, &genErrorString)) { vs = new VSShader(device_, VSID, codeBuffer_, useHWTransform); } if (!vs || vs->Failed()) { @@ -603,7 +605,9 @@ VSShader *ShaderManagerDX9::ApplyShader(bool useHWTransform, bool useHWTessellat // next time and we'll do this over and over... // Can still work with software transform. - bool success = GenerateVertexShaderHLSL(VSID, codeBuffer_, HLSL_D3D9, &genErrorString); + uint32_t attrMask; + uint64_t uniformMask; + bool success = GenerateVertexShaderGLSL(VSID, codeBuffer_, compat_, &attrMask, &uniformMask, &genErrorString); _assert_(success); vs = new VSShader(device_, VSID, codeBuffer_, false); } diff --git a/GPU/Directx9/ShaderManagerDX9.h b/GPU/Directx9/ShaderManagerDX9.h index 4f5be85150..1ac3ae0e48 100644 --- a/GPU/Directx9/ShaderManagerDX9.h +++ b/GPU/Directx9/ShaderManagerDX9.h @@ -21,7 +21,7 @@ #include #include "Common/Common.h" -#include "GPU/Directx9/VertexShaderGeneratorHLSL.h" +#include "GPU/GLES/VertexShaderGeneratorGLES.h" #include "GPU/Common/FragmentShaderGenerator.h" #include "GPU/Common/ShaderCommon.h" #include "GPU/Common/ShaderId.h" diff --git a/GPU/Directx9/VertexShaderGeneratorHLSL.cpp b/GPU/Directx9/VertexShaderGeneratorHLSL.cpp deleted file mode 100644 index 7e980f70be..0000000000 --- a/GPU/Directx9/VertexShaderGeneratorHLSL.cpp +++ /dev/null @@ -1,712 +0,0 @@ -// Copyright (c) 2012- PPSSPP Project. - -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 2.0 or later versions. - -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License 2.0 for more details. - -// A copy of the GPL 2.0 should have been included with the program. -// If not, see http://www.gnu.org/licenses/ - -// Official git repository and contact information can be found at -// https://github.com/hrydgard/ppsspp and http://www.ppsspp.org/. - -#include -#include - -#include "Common/StringUtils.h" -#include "GPU/ge_constants.h" -#include "GPU/GPUState.h" -#include "Core/Config.h" - -#include "GPU/Directx9/VertexShaderGeneratorHLSL.h" -#include "GPU/Common/VertexDecoderCommon.h" -#include "GPU/Common/ShaderUniforms.h" - -#undef WRITE - -#define WRITE p+=sprintf - -extern const char *boneWeightAttrDeclHLSL[9]; -extern const char *boneWeightAttrInitHLSL[9]; - -extern const char *hlsl_preamble_vs; - -bool GenerateVertexShaderHLSL(const VShaderID &id, char *buffer, ShaderLanguage lang, std::string *errorString) { - char *p = buffer; - - bool isModeThrough = id.Bit(VS_BIT_IS_THROUGH); - bool lmode = id.Bit(VS_BIT_LMODE); - bool doTexture = id.Bit(VS_BIT_DO_TEXTURE); - - GETexMapMode uvGenMode = static_cast(id.Bits(VS_BIT_UVGEN_MODE, 2)); - bool doTextureTransform = uvGenMode == GE_TEXMAP_TEXTURE_MATRIX; - - // this is only valid for some settings of uvGenMode - GETexProjMapMode uvProjMode = static_cast(id.Bits(VS_BIT_UVPROJ_MODE, 2)); - bool doShadeMapping = uvGenMode == GE_TEXMAP_ENVIRONMENT_MAP; - bool doFlatShading = id.Bit(VS_BIT_FLATSHADE); - - bool useHWTransform = id.Bit(VS_BIT_USE_HW_TRANSFORM); - bool hasColor = id.Bit(VS_BIT_HAS_COLOR) || !useHWTransform; - bool hasNormal = id.Bit(VS_BIT_HAS_NORMAL) && useHWTransform; - bool hasTexcoord = id.Bit(VS_BIT_HAS_TEXCOORD) || !useHWTransform; - bool enableFog = id.Bit(VS_BIT_ENABLE_FOG); - bool flipNormal = id.Bit(VS_BIT_NORM_REVERSE); - int ls0 = id.Bits(VS_BIT_LS0, 2); - int ls1 = id.Bits(VS_BIT_LS1, 2); - bool enableBones = id.Bit(VS_BIT_ENABLE_BONES) && !useHWTransform; - bool enableLighting = id.Bit(VS_BIT_LIGHTING_ENABLE); - int matUpdate = id.Bits(VS_BIT_MATERIAL_UPDATE, 3); - - bool doBezier = id.Bit(VS_BIT_BEZIER) && !enableBones && useHWTransform; - bool doSpline = id.Bit(VS_BIT_SPLINE) && !enableBones && useHWTransform; - if (doBezier || doSpline) { - if (!hasNormal) { - // Bad usage. - *errorString = "Invalid flags - tess requires normal."; - return false; - } - if (lang == HLSL_D3D9) { - *errorString = "D3D9: Tess not supported"; - return false; - } - } - bool hasColorTess = id.Bit(VS_BIT_HAS_COLOR_TESS); - bool hasTexcoordTess = id.Bit(VS_BIT_HAS_TEXCOORD_TESS); - bool hasNormalTess = id.Bit(VS_BIT_HAS_NORMAL_TESS); - bool flipNormalTess = id.Bit(VS_BIT_NORM_REVERSE_TESS); - - DoLightComputation doLight[4] = { LIGHT_OFF, LIGHT_OFF, LIGHT_OFF, LIGHT_OFF }; - if (useHWTransform) { - int shadeLight0 = doShadeMapping ? ls0 : -1; - int shadeLight1 = doShadeMapping ? ls1 : -1; - for (int i = 0; i < 4; i++) { - if (i == shadeLight0 || i == shadeLight1) - doLight[i] = LIGHT_SHADE; - if (enableLighting && id.Bit(VS_BIT_LIGHT0_ENABLE + i)) - doLight[i] = LIGHT_FULL; - } - } - - int numBoneWeights = 0; - int boneWeightScale = id.Bits(VS_BIT_WEIGHT_FMTSCALE, 2); - if (enableBones) { - numBoneWeights = 1 + id.Bits(VS_BIT_BONES, 3); - } - - // Output some compatibility defines - WRITE(p, "%s", hlsl_preamble_vs); - - if (lang == HLSL_D3D9) { - WRITE(p, "#pragma warning( disable : 3571 )\n"); - if (isModeThrough) { - WRITE(p, "mat4 u_proj_through : register(c%i);\n", CONST_VS_PROJ_THROUGH); - } else { - WRITE(p, "mat4 u_proj : register(c%i);\n", CONST_VS_PROJ); - // Add all the uniforms we'll need to transform properly. - } - - if (enableFog) { - WRITE(p, "vec2 u_fogcoef : register(c%i);\n", CONST_VS_FOGCOEF); - } - if (useHWTransform || !hasColor) - WRITE(p, "vec4 u_matambientalpha : register(c%i);\n", CONST_VS_MATAMBIENTALPHA); // matambient + matalpha - - if (useHWTransform) { - // When transforming by hardware, we need a great deal more uniforms... - WRITE(p, "mat3x4 u_world : register(c%i);\n", CONST_VS_WORLD); - WRITE(p, "mat3x4 u_view : register(c%i);\n", CONST_VS_VIEW); - if (doTextureTransform) - WRITE(p, "mat3x4 u_texmtx : register(c%i);\n", CONST_VS_TEXMTX); - if (enableBones) { - for (int i = 0; i < numBoneWeights; i++) { - WRITE(p, "mat3x4 u_bone%i : register(c%i);\n", i, CONST_VS_BONE0 + i * 3); - } - } - if (doTexture) { - WRITE(p, "vec4 u_uvscaleoffset : register(c%i);\n", CONST_VS_UVSCALEOFFSET); - } - for (int i = 0; i < 4; i++) { - if (doLight[i] != LIGHT_OFF) { - // This is needed for shade mapping - WRITE(p, "vec3 u_lightpos%i : register(c%i);\n", i, CONST_VS_LIGHTPOS + i); - } - if (doLight[i] == LIGHT_FULL) { - GELightType type = static_cast(id.Bits(VS_BIT_LIGHT0_TYPE + 4 * i, 2)); - GELightComputation comp = static_cast(id.Bits(VS_BIT_LIGHT0_COMP + 4 * i, 2)); - - if (type != GE_LIGHTTYPE_DIRECTIONAL) - WRITE(p, "vec3 u_lightatt%i : register(c%i);\n", i, CONST_VS_LIGHTATT + i); - - if (type == GE_LIGHTTYPE_SPOT || type == GE_LIGHTTYPE_UNKNOWN) { - WRITE(p, "vec3 u_lightdir%i : register(c%i);\n", i, CONST_VS_LIGHTDIR + i); - WRITE(p, "vec4 u_lightangle_spotCoef%i : register(c%i);\n", i, CONST_VS_LIGHTANGLE_SPOTCOEF + i); - } - WRITE(p, "vec3 u_lightambient%i : register(c%i);\n", i, CONST_VS_LIGHTAMBIENT + i); - WRITE(p, "vec3 u_lightdiffuse%i : register(c%i);\n", i, CONST_VS_LIGHTDIFFUSE + i); - - if (comp == GE_LIGHTCOMP_BOTH) { - WRITE(p, "vec3 u_lightspecular%i : register(c%i);\n", i, CONST_VS_LIGHTSPECULAR + i); - } - } - } - if (enableLighting) { - WRITE(p, "vec4 u_ambient : register(c%i);\n", CONST_VS_AMBIENT); - if ((matUpdate & 2) == 0 || !hasColor) - WRITE(p, "vec3 u_matdiffuse : register(c%i);\n", CONST_VS_MATDIFFUSE); - // if ((matUpdate & 4) == 0) - WRITE(p, "vec4 u_matspecular : register(c%i);\n", CONST_VS_MATSPECULAR); // Specular coef is contained in alpha - WRITE(p, "vec3 u_matemissive : register(c%i);\n", CONST_VS_MATEMISSIVE); - } - } - - if (!isModeThrough && gstate_c.Supports(GPU_ROUND_DEPTH_TO_16BIT)) { - WRITE(p, "vec4 u_depthRange : register(c%i);\n", CONST_VS_DEPTHRANGE); - } - if (!isModeThrough) { - WRITE(p, "vec4 u_cullRangeMin : register(c%i);\n", CONST_VS_CULLRANGEMIN); - WRITE(p, "vec4 u_cullRangeMax : register(c%i);\n", CONST_VS_CULLRANGEMAX); - } - } else { - WRITE(p, "cbuffer base : register(b0) {\n%s};\n", ub_baseStr); - WRITE(p, "cbuffer lights: register(b1) {\n%s};\n", ub_vs_lightsStr); - WRITE(p, "cbuffer bones : register(b2) {\n%s};\n", ub_vs_bonesStr); - } - - bool scaleUV = !isModeThrough && (uvGenMode == GE_TEXMAP_TEXTURE_COORDS || uvGenMode == GE_TEXMAP_UNKNOWN); - - // And the "varyings". - bool texCoordInVec3 = false; - if (useHWTransform) { - WRITE(p, "struct VS_IN { \n"); - if ((doSpline || doBezier) && lang == HLSL_D3D11) { - WRITE(p, " uint instanceId : SV_InstanceID;\n"); - } - if (enableBones) { - WRITE(p, " %s", boneWeightAttrDeclHLSL[numBoneWeights]); - } - if (doTexture && hasTexcoord) { - WRITE(p, " vec2 texcoord : TEXCOORD0;\n"); - } - if (hasColor) { - WRITE(p, " vec4 color0 : COLOR0;\n"); - } - if (hasNormal) { - WRITE(p, " vec3 normal : NORMAL;\n"); - } - WRITE(p, " vec3 position : POSITION;\n"); - WRITE(p, "};\n"); - - } else { - WRITE(p, "struct VS_IN {\n"); - WRITE(p, " vec4 position : POSITION;\n"); - if (doTexture && hasTexcoord) { - if (doTextureTransform && !isModeThrough) { - texCoordInVec3 = true; - WRITE(p, " vec3 texcoord : TEXCOORD0;\n"); - } - else - WRITE(p, " vec2 texcoord : TEXCOORD0;\n"); - } - if (hasColor) { - WRITE(p, " vec4 color0 : COLOR0;\n"); - } - // only software transform supplies color1 as vertex data - if (lmode) { - WRITE(p, " vec3 color1 : COLOR1;\n"); - } - WRITE(p, "};\n"); - } - - WRITE(p, "struct VS_OUT {\n"); - if (doTexture) { - WRITE(p, " vec3 v_texcoord : TEXCOORD0;\n"); - } - const char *colorInterpolation = doFlatShading && lang == HLSL_D3D11 ? "nointerpolation " : ""; - WRITE(p, " %svec4 v_color0 : COLOR0;\n", colorInterpolation); - if (lmode) - WRITE(p, " vec3 v_color1 : COLOR1;\n"); - - if (enableFog) { - WRITE(p, " float v_fogdepth: TEXCOORD1;\n"); - } - if (lang == HLSL_D3D9) { - WRITE(p, " vec4 gl_Position : POSITION;\n"); - } else { - WRITE(p, " vec4 gl_Position : SV_Position;\n"); - } - WRITE(p, "};\n"); - - // Confirmed: Through mode gets through exactly the same in GL and D3D in Phantasy Star: Text is 38023.0 in the test scene. - - if (!isModeThrough && gstate_c.Supports(GPU_ROUND_DEPTH_TO_16BIT)) { - // Apply the projection and viewport to get the Z buffer value, floor to integer, undo the viewport and projection. - // The Z range in D3D is different but we compensate for that using parameters. - WRITE(p, "\nvec4 depthRoundZVP(vec4 v) {\n"); - WRITE(p, " float z = v.z / v.w;\n"); - WRITE(p, " z = (z * u_depthRange.x + u_depthRange.y);\n"); - WRITE(p, " z = floor(z);\n"); - WRITE(p, " z = (z - u_depthRange.z) * u_depthRange.w;\n"); - WRITE(p, " return vec4(v.x, v.y, z * v.w, v.w);\n"); - WRITE(p, "}\n\n"); - } - - // Hardware tessellation - if (doSpline || doBezier) { - WRITE(p, "struct TessData {\n"); - WRITE(p, " vec3 pos; float pad1;\n"); - WRITE(p, " vec2 tex; vec2 pad2;\n"); - WRITE(p, " vec4 col;\n"); - WRITE(p, "};\n"); - WRITE(p, "StructuredBuffer tess_data : register(t0);\n"); - - WRITE(p, "struct TessWeight {\n"); - WRITE(p, " vec4 basis;\n"); - WRITE(p, " vec4 deriv;\n"); - WRITE(p, "};\n"); - WRITE(p, "StructuredBuffer tess_weights_u : register(t1);\n"); - WRITE(p, "StructuredBuffer tess_weights_v : register(t2);\n"); - - const char *init[3] = { "0.0, 0.0", "0.0, 0.0, 0.0", "0.0, 0.0, 0.0, 0.0" }; - for (int i = 2; i <= 4; i++) { - // Define 3 types vec2, vec3, vec4 - WRITE(p, "vec%d tess_sample(in vec%d points[16], mat4 weights) {\n", i, i); - WRITE(p, " vec%d pos = vec%d(%s);\n", i, i, init[i - 2]); - for (int v = 0; v < 4; ++v) { - for (int u = 0; u < 4; ++u) { - WRITE(p, " pos += weights[%i][%i] * points[%i];\n", v, u, v * 4 + u); - } - } - WRITE(p, " return pos;\n"); - WRITE(p, "}\n"); - } - - WRITE(p, "mat4 outerProduct(vec4 u, vec4 v) {\n"); - WRITE(p, " return mul((float4x1)v, (float1x4)u);\n"); - WRITE(p, "}\n"); - - WRITE(p, "struct Tess {\n"); - WRITE(p, " vec3 pos;\n"); - if (doTexture) - WRITE(p, " vec2 tex;\n"); - WRITE(p, " vec4 col;\n"); - if (hasNormalTess) - WRITE(p, " vec3 nrm;\n"); - WRITE(p, "};\n"); - - WRITE(p, "void tessellate(in VS_IN In, out Tess tess) {\n"); - WRITE(p, " vec3 position = In.position;\n"); - WRITE(p, " vec3 normal = In.normal;\n"); - WRITE(p, " ivec2 point_pos = ivec2(position.z, normal.z)%s;\n", doBezier ? " * 3" : ""); - WRITE(p, " ivec2 weight_idx = ivec2(position.xy);\n"); - // Load 4x4 control points - WRITE(p, " vec3 _pos[16];\n"); - WRITE(p, " vec2 _tex[16];\n"); - WRITE(p, " vec4 _col[16];\n"); - WRITE(p, " int index;\n"); - for (int i = 0; i < 4; i++) { - for (int j = 0; j < 4; j++) { - WRITE(p, " index = (%i + point_pos.y) * int(u_spline_counts) + (%i + point_pos.x);\n", i, j); - WRITE(p, " _pos[%i] = tess_data[index].pos.xyz;\n", i * 4 + j); - if (doTexture && hasTexcoordTess) - WRITE(p, " _tex[%i] = tess_data[index].tex.xy;\n", i * 4 + j); - if (hasColorTess) - WRITE(p, " _col[%i] = tess_data[index].col;\n", i * 4 + j); - } - } - - // Basis polynomials as weight coefficients - WRITE(p, " vec4 basis_u = tess_weights_u[weight_idx.x].basis;\n"); - WRITE(p, " vec4 basis_v = tess_weights_v[weight_idx.y].basis;\n"); - WRITE(p, " mat4 basis = outerProduct(basis_u, basis_v);\n"); - - // Tessellate - WRITE(p, " tess.pos = tess_sample(_pos, basis);\n"); - if (doTexture) { - if (hasTexcoordTess) - WRITE(p, " tess.tex = tess_sample(_tex, basis);\n"); - else - WRITE(p, " tess.tex = normal.xy;\n"); - } - if (hasColorTess) - WRITE(p, " tess.col = tess_sample(_col, basis);\n"); - else - WRITE(p, " tess.col = u_matambientalpha;\n"); - if (hasNormalTess) { - // Derivatives as weight coefficients - WRITE(p, " vec4 deriv_u = tess_weights_u[weight_idx.x].deriv;\n"); - WRITE(p, " vec4 deriv_v = tess_weights_v[weight_idx.y].deriv;\n"); - - WRITE(p, " vec3 du = tess_sample(_pos, outerProduct(deriv_u, basis_v));\n"); - WRITE(p, " vec3 dv = tess_sample(_pos, outerProduct(basis_u, deriv_v));\n"); - WRITE(p, " tess.nrm = normalize(cross(du, dv));\n"); - } - WRITE(p, "}\n"); - } - - WRITE(p, "VS_OUT main(VS_IN In) {\n"); - WRITE(p, " VS_OUT Out;\n"); - if (doTexture && hasTexcoord) { - if (texCoordInVec3) { - WRITE(p, " vec3 texcoord = In.texcoord;\n"); - } else { - WRITE(p, " vec2 texcoord = In.texcoord;\n"); - } - } - if (hasColor) { - WRITE(p, " vec4 color0 = In.color0;\n"); - if (lmode && !useHWTransform) { - WRITE(p, " vec3 color1 = In.color1;\n"); - } - } - if (hasNormal) { - WRITE(p, " vec3 normal = In.normal;\n"); - } - if (useHWTransform) { - WRITE(p, " vec3 position = In.position;\n"); - } else { - WRITE(p, " vec4 position = In.position;\n"); - } - if (enableBones) { - WRITE(p, "%s", boneWeightAttrInitHLSL[numBoneWeights]); - } - - if (!useHWTransform) { - // Simple pass-through of vertex data to fragment shader - if (doTexture) { - if (texCoordInVec3) { - WRITE(p, " Out.v_texcoord = texcoord;\n"); - } else { - WRITE(p, " Out.v_texcoord = vec3(texcoord, 1.0);\n"); - } - } - if (hasColor) { - WRITE(p, " Out.v_color0 = color0;\n"); - if (lmode) - WRITE(p, " Out.v_color1 = color1;\n"); - } else { - WRITE(p, " Out.v_color0 = u_matambientalpha;\n"); - if (lmode) - WRITE(p, " Out.v_color1 = splat3(0.0);\n"); - } - if (enableFog) { - WRITE(p, " Out.v_fogdepth = position.w;\n"); - } - if (isModeThrough) { - WRITE(p, " vec4 outPos = mul(u_proj_through, vec4(position.xyz, 1.0));\n"); - } else { - if (gstate_c.Supports(GPU_ROUND_DEPTH_TO_16BIT)) { - WRITE(p, " vec4 outPos = depthRoundZVP(mul(u_proj, vec4(position.xyz, 1.0)));\n"); - } else { - WRITE(p, " vec4 outPos = mul(u_proj, vec4(position.xyz, 1.0));\n"); - } - } - } else { - // Step 1: World Transform / Skinning - if (!enableBones) { - if (doSpline || doBezier) { - // Hardware tessellation - WRITE(p, " Tess tess;\n"); - WRITE(p, " tessellate(In, tess);\n"); - - WRITE(p, " vec3 worldpos = mul(vec4(tess.pos.xyz, 1.0), u_world).xyz;\n"); - if (hasNormalTess) - WRITE(p, " mediump vec3 worldnormal = normalize(mul(vec4(%stess.nrm, 0.0), u_world).xyz);\n", flipNormalTess ? "-" : ""); - else - WRITE(p, " mediump vec3 worldnormal = vec3(0.0, 0.0, 1.0);\n"); - } else { - // No skinning, just standard T&L. - WRITE(p, " vec3 worldpos = mul(vec4(position, 1.0), u_world).xyz;\n"); - if (hasNormal) - WRITE(p, " mediump vec3 worldnormal = normalize(mul(vec4(%snormal, 0.0), u_world).xyz);\n", flipNormal ? "-" : ""); - else - WRITE(p, " mediump vec3 worldnormal = vec3(0.0, 0.0, 1.0);\n"); - } - } else { - static const char * const boneWeightAttr[8] = { - "w1.x", "w1.y", "w1.z", "w1.w", - "w2.x", "w2.y", "w2.z", "w2.w", - }; - - WRITE(p, " mat3x4 skinMatrix = w1.x * u_bone0"); - for (int i = 1; i < numBoneWeights; i++) { - const char *weightAttr = boneWeightAttr[i]; - WRITE(p, " + %s * u_bone%d", weightAttr, i); - } - - WRITE(p, ";\n"); - - // Trying to simplify this results in bugs in LBP... - WRITE(p, " vec3 skinnedpos = mul(vec4(position, 1.0), skinMatrix).xyz;\n"); - WRITE(p, " vec3 worldpos = mul(vec4(skinnedpos, 1.0), u_world).xyz;\n"); - - if (hasNormal) { - WRITE(p, " mediump vec3 skinnednormal = mul(vec4(%snormal, 0.0), skinMatrix).xyz;\n", flipNormal ? "-" : ""); - } else { - WRITE(p, " mediump vec3 skinnednormal = mul(vec4(0.0, 0.0, %s1.0, 0.0), skinMatrix).xyz;\n", flipNormal ? "-" : ""); - } - WRITE(p, " mediump vec3 worldnormal = normalize(mul(vec4(skinnednormal, 0.0), u_world).xyz);\n"); - } - - WRITE(p, " vec4 viewPos = vec4(mul(vec4(worldpos, 1.0), u_view).xyz, 1.0);\n"); - - // Final view and projection transforms. - if (gstate_c.Supports(GPU_ROUND_DEPTH_TO_16BIT)) { - WRITE(p, " vec4 outPos = depthRoundZVP(mul(u_proj, viewPos));\n"); - } else { - WRITE(p, " vec4 outPos = mul(u_proj, viewPos);\n"); - } - - // TODO: Declare variables for dots for shade mapping if needed. - - const char *ambientStr = (matUpdate & 1) && hasColor ? "color0" : "u_matambientalpha"; - const char *diffuseStr = (matUpdate & 2) && hasColor ? "color0.rgb" : "u_matdiffuse"; - const char *specularStr = (matUpdate & 4) && hasColor ? "color0.rgb" : "u_matspecular.rgb"; - if (doBezier || doSpline) { - // TODO: Probably, should use hasColorTess but FF4 has a problem with drawing the background. - ambientStr = (matUpdate & 1) && hasColor ? "tess.col" : "u_matambientalpha"; - diffuseStr = (matUpdate & 2) && hasColor ? "tess.col.rgb" : "u_matdiffuse"; - specularStr = (matUpdate & 4) && hasColor ? "tess.col.rgb" : "u_matspecular.rgb"; - } - - bool diffuseIsZero = true; - bool specularIsZero = true; - bool distanceNeeded = false; - bool anySpots = false; - if (enableLighting) { - WRITE(p, " lowp vec4 lightSum0 = u_ambient * %s + vec4(u_matemissive, 0.0);\n", ambientStr); - - for (int i = 0; i < 4; i++) { - GELightType type = static_cast(id.Bits(VS_BIT_LIGHT0_TYPE + 4 * i, 2)); - GELightComputation comp = static_cast(id.Bits(VS_BIT_LIGHT0_COMP + 4 * i, 2)); - if (doLight[i] != LIGHT_FULL) - continue; - diffuseIsZero = false; - if (comp == GE_LIGHTCOMP_BOTH) - specularIsZero = false; - if (type != GE_LIGHTTYPE_DIRECTIONAL) - distanceNeeded = true; - if (type == GE_LIGHTTYPE_SPOT || type == GE_LIGHTTYPE_UNKNOWN) - anySpots = true; - } - - if (!specularIsZero) { - WRITE(p, " lowp vec3 lightSum1 = splat3(0.0);\n"); - } - if (!diffuseIsZero) { - WRITE(p, " vec3 toLight;\n"); - WRITE(p, " lowp vec3 diffuse;\n"); - } - if (distanceNeeded) { - WRITE(p, " float distance;\n"); - WRITE(p, " lowp float lightScale;\n"); - } - WRITE(p, " mediump float ldot;\n"); - if (anySpots) { - WRITE(p, " lowp float angle;\n"); - } - } - - // Calculate lights if needed. If shade mapping is enabled, lights may need to be - // at least partially calculated. - for (int i = 0; i < 4; i++) { - if (doLight[i] != LIGHT_FULL) - continue; - - GELightType type = static_cast(id.Bits(VS_BIT_LIGHT0_TYPE + 4 * i, 2)); - GELightComputation comp = static_cast(id.Bits(VS_BIT_LIGHT0_COMP + 4 * i, 2)); - - if (type == GE_LIGHTTYPE_DIRECTIONAL) { - // We prenormalize light positions for directional lights. - WRITE(p, " toLight = u_lightpos%i;\n", i); - } else { - WRITE(p, " toLight = u_lightpos%i - worldpos;\n", i); - WRITE(p, " distance = length(toLight);\n"); - WRITE(p, " toLight /= distance;\n"); - } - - bool doSpecular = comp == GE_LIGHTCOMP_BOTH; - bool poweredDiffuse = comp == GE_LIGHTCOMP_ONLYPOWDIFFUSE; - - WRITE(p, " ldot = dot(toLight, worldnormal);\n"); - if (poweredDiffuse) { - // pow(0.0, 0.0) may be undefined, but the PSP seems to treat it as 1.0. - // Seen in Tales of the World: Radiant Mythology (#2424.) - WRITE(p, " if (u_matspecular.a <= 0.0) {\n"); - WRITE(p, " ldot = 1.0;\n"); - WRITE(p, " } else {\n"); - WRITE(p, " ldot = pow(max(ldot, 0.0), u_matspecular.a);\n"); - WRITE(p, " }\n"); - } - - const char *timesLightScale = " * lightScale"; - - // Attenuation - switch (type) { - case GE_LIGHTTYPE_DIRECTIONAL: - timesLightScale = ""; - break; - case GE_LIGHTTYPE_POINT: - WRITE(p, " lightScale = clamp(1.0 / dot(u_lightatt%i, vec3(1.0, distance, distance*distance)), 0.0, 1.0);\n", i); - break; - case GE_LIGHTTYPE_SPOT: - case GE_LIGHTTYPE_UNKNOWN: - WRITE(p, " angle = length(u_lightdir%i) == 0.0 ? 0.0 : dot(normalize(u_lightdir%i), toLight);\n", i, i); - WRITE(p, " if (angle >= u_lightangle_spotCoef%i.x) {\n", i); - WRITE(p, " lightScale = clamp(1.0 / dot(u_lightatt%i, vec3(1.0, distance, distance*distance)), 0.0, 1.0) * (u_lightangle_spotCoef%i.y <= 0.0 ? 1.0 : pow(angle, u_lightangle_spotCoef%i.y));\n", i, i, i); - WRITE(p, " } else {\n"); - WRITE(p, " lightScale = 0.0;\n"); - WRITE(p, " }\n"); - break; - default: - // ILLEGAL - break; - } - - WRITE(p, " diffuse = (u_lightdiffuse%i * %s) * max(ldot, 0.0);\n", i, diffuseStr); - if (doSpecular) { - WRITE(p, " if (ldot >= 0.0) {\n"); - WRITE(p, " ldot = dot(normalize(toLight + vec3(0.0, 0.0, 1.0)), worldnormal);\n"); - WRITE(p, " if (u_matspecular.a <= 0.0) {\n"); - WRITE(p, " ldot = 1.0;\n"); - WRITE(p, " } else {\n"); - WRITE(p, " ldot = pow(max(ldot, 0.0), u_matspecular.a);\n"); - WRITE(p, " }\n"); - WRITE(p, " if (ldot > 0.0)\n"); - WRITE(p, " lightSum1 += u_lightspecular%i * %s * ldot %s;\n", i, specularStr, timesLightScale); - WRITE(p, " }\n"); - } - WRITE(p, " lightSum0.rgb += (u_lightambient%i * %s.rgb + diffuse)%s;\n", i, ambientStr, timesLightScale); - } - - if (enableLighting) { - // Sum up ambient, emissive here. - if (lmode) { - WRITE(p, " Out.v_color0 = clamp(lightSum0, 0.0, 1.0);\n"); - // v_color1 only exists when lmode = 1. - if (specularIsZero) { - WRITE(p, " Out.v_color1 = splat3(0.0);\n"); - } else { - WRITE(p, " Out.v_color1 = clamp(lightSum1, 0.0, 1.0);\n"); - } - } else { - if (specularIsZero) { - WRITE(p, " Out.v_color0 = clamp(lightSum0, 0.0, 1.0);\n"); - } else { - WRITE(p, " Out.v_color0 = clamp(clamp(lightSum0, 0.0, 1.0) + vec4(lightSum1, 0.0), 0.0, 1.0);\n"); - } - } - } else { - // Lighting doesn't affect color. - if (hasColor) { - if (doBezier || doSpline) - WRITE(p, " Out.v_color0 = tess.col;\n"); - else - WRITE(p, " Out.v_color0 = color0;\n"); - } else { - WRITE(p, " Out.v_color0 = u_matambientalpha;\n"); - } - if (lmode) - WRITE(p, " Out.v_color1 = splat3(0.0);\n"); - } - - // Step 3: UV generation - if (doTexture) { - switch (uvGenMode) { - case GE_TEXMAP_TEXTURE_COORDS: // Scale-offset. Easy. - case GE_TEXMAP_UNKNOWN: // Not sure what this is, but Riviera uses it. Treating as coords works. - if (scaleUV) { - if (hasTexcoord) { - if (doBezier || doSpline) - WRITE(p, " Out.v_texcoord = vec3(tess.tex.xy * u_uvscaleoffset.xy + u_uvscaleoffset.zw, 0.0);\n"); - else - WRITE(p, " Out.v_texcoord = vec3(texcoord.xy * u_uvscaleoffset.xy, 0.0);\n"); - } else { - WRITE(p, " Out.v_texcoord = splat3(0.0);\n"); - } - } else { - if (hasTexcoord) { - WRITE(p, " Out.v_texcoord = vec3(texcoord.xy * u_uvscaleoffset.xy + u_uvscaleoffset.zw, 0.0);\n"); - } else { - WRITE(p, " Out.v_texcoord = vec3(u_uvscaleoffset.zw, 0.0);\n"); - } - } - break; - - case GE_TEXMAP_TEXTURE_MATRIX: // Projection mapping. - { - std::string temp_tc; - switch (uvProjMode) { - case GE_PROJMAP_POSITION: // Use model space XYZ as source - temp_tc = "vec4(position, 1.0)"; - break; - case GE_PROJMAP_UV: // Use unscaled UV as source - { - if (hasTexcoord) { - temp_tc = StringFromFormat("vec4(texcoord.xy, 0.0, 1.0)"); - } else { - temp_tc = "vec4(0.0, 0.0, 0.0, 1.0)"; - } - } - break; - case GE_PROJMAP_NORMALIZED_NORMAL: // Use normalized transformed normal as source - if (hasNormal) - temp_tc = flipNormal ? "vec4(normalize(-normal), 1.0)" : "vec4(normalize(normal), 1.0)"; - else - temp_tc = "vec4(0.0, 0.0, 1.0, 1.0)"; - break; - case GE_PROJMAP_NORMAL: // Use non-normalized transformed normal as source - if (hasNormal) - temp_tc = flipNormal ? "vec4(-normal, 1.0)" : "vec4(normal, 1.0)"; - else - temp_tc = "vec4(0.0, 0.0, 1.0, 1.0)"; - break; - } - // Transform by texture matrix. XYZ as we are doing projection mapping. - WRITE(p, " Out.v_texcoord = mul(%s, u_texmtx).xyz * vec3(u_uvscaleoffset.xy, 1.0);\n", temp_tc.c_str()); - } - break; - - case GE_TEXMAP_ENVIRONMENT_MAP: // Shade mapping - use dots from light sources. - { - std::string lightFactor0 = StringFromFormat("(length(u_lightpos%i) == 0.0 ? worldnormal.z : dot(normalize(u_lightpos%i), worldnormal))", ls0, ls0); - std::string lightFactor1 = StringFromFormat("(length(u_lightpos%i) == 0.0 ? worldnormal.z : dot(normalize(u_lightpos%i), worldnormal))", ls1, ls1); - WRITE(p, " Out.v_texcoord = vec3(u_uvscaleoffset.xy * vec2(1.0 + %s, 1.0 + %s) * 0.5, 1.0);\n", lightFactor0.c_str(), lightFactor1.c_str()); - } - break; - - default: - // Should be unreachable. - _assert_(false); - return false; - } - } - - // Compute fogdepth - if (enableFog) { - WRITE(p, " Out.v_fogdepth = (viewPos.z + u_fogcoef.x) * u_fogcoef.y;\n"); - } - } - - if (!isModeThrough && gstate_c.Supports(GPU_SUPPORTS_VS_RANGE_CULLING)) { - WRITE(p, " vec3 projPos = outPos.xyz / outPos.w;\n"); - // Vertex range culling doesn't happen when depth is clamped, so only do this if in range. - WRITE(p, " if (u_cullRangeMin.w <= 0.0 || (projPos.z >= u_cullRangeMin.z && projPos.z <= u_cullRangeMax.z)) {\n"); - const char *outMin = "projPos.x < u_cullRangeMin.x || projPos.y < u_cullRangeMin.y || projPos.z < u_cullRangeMin.z"; - const char *outMax = "projPos.x > u_cullRangeMax.x || projPos.y > u_cullRangeMax.y || projPos.z > u_cullRangeMax.z"; - WRITE(p, " if (%s || %s) {\n", outMin, outMax); - WRITE(p, " outPos.w = u_cullRangeMax.w;\n"); - WRITE(p, " }\n"); - WRITE(p, " }\n"); - } - WRITE(p, " Out.gl_Position = outPos;\n"); - - WRITE(p, " return Out;\n"); - WRITE(p, "}\n"); - return true; -} diff --git a/GPU/Directx9/VertexShaderGeneratorHLSL.h b/GPU/Directx9/VertexShaderGeneratorHLSL.h deleted file mode 100644 index 90900328d5..0000000000 --- a/GPU/Directx9/VertexShaderGeneratorHLSL.h +++ /dev/null @@ -1,25 +0,0 @@ -// Copyright (c) 2012- PPSSPP Project. - -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 2.0 or later versions. - -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License 2.0 for more details. - -// A copy of the GPL 2.0 should have been included with the program. -// If not, see http://www.gnu.org/licenses/ - -// Official git repository and contact information can be found at -// https://github.com/hrydgard/ppsspp and http://www.ppsspp.org/. - -#pragma once - -#include - -#include "GPU/Common/ShaderID.h" -#include "GPU/GLES/VertexShaderGeneratorGLES.h" - -bool GenerateVertexShaderHLSL(const VShaderID &id, char *buffer, ShaderLanguage lang, std::string *errorString); diff --git a/GPU/GPU.vcxproj b/GPU/GPU.vcxproj index 09288fdf97..849173ac8d 100644 --- a/GPU/GPU.vcxproj +++ b/GPU/GPU.vcxproj @@ -390,7 +390,6 @@ - @@ -561,7 +560,6 @@ - diff --git a/GPU/GPU.vcxproj.filters b/GPU/GPU.vcxproj.filters index ee96efb190..9bb59502fc 100644 --- a/GPU/GPU.vcxproj.filters +++ b/GPU/GPU.vcxproj.filters @@ -267,9 +267,6 @@ Common - - DirectX9 - Common @@ -539,9 +536,6 @@ Common - - DirectX9 - Common diff --git a/unittest/TestShaderGenerators.cpp b/unittest/TestShaderGenerators.cpp index d0f1e4bc01..4b60ee8d56 100644 --- a/unittest/TestShaderGenerators.cpp +++ b/unittest/TestShaderGenerators.cpp @@ -11,7 +11,7 @@ #include "GPU/Common/FragmentShaderGenerator.h" -#include "GPU/Directx9/VertexShaderGeneratorHLSL.h" +#include "GPU/GLES/VertexShaderGeneratorGLES.h" #include "GPU/GLES/VertexShaderGeneratorGLES.h" #include "GPU/D3D11/D3D11Util.h" @@ -39,13 +39,11 @@ bool GenerateFShader(FShaderID id, char *buffer, ShaderLanguage lang, std::strin return GenerateFragmentShader(id, buffer, compat, &uniformMask, errorString); } case ShaderLanguage::HLSL_D3D9: - case ShaderLanguage::HLSL_D3D9_TEST: { ShaderLanguageDesc compat(ShaderLanguage::HLSL_D3D9); return GenerateFragmentShader(id, buffer, compat, &uniformMask, errorString); } case ShaderLanguage::HLSL_D3D11: - case ShaderLanguage::HLSL_D3D11_TEST: { ShaderLanguageDesc compat(ShaderLanguage::HLSL_D3D11); return GenerateFragmentShader(id, buffer, compat, &uniformMask, errorString); @@ -74,26 +72,16 @@ bool GenerateVShader(VShaderID id, char *buffer, ShaderLanguage lang, std::strin ShaderLanguageDesc compat(ShaderLanguage::GLSL_140); return GenerateVertexShaderGLSL(id, buffer, compat, &attrMask, &uniformMask, errorString); } - case ShaderLanguage::HLSL_D3D9_TEST: + case ShaderLanguage::HLSL_D3D9: { ShaderLanguageDesc compat(ShaderLanguage::HLSL_D3D9); return GenerateVertexShaderGLSL(id, buffer, compat, &attrMask, &uniformMask, errorString); } - case ShaderLanguage::HLSL_D3D11_TEST: + case ShaderLanguage::HLSL_D3D11: { ShaderLanguageDesc compat(ShaderLanguage::HLSL_D3D11); return GenerateVertexShaderGLSL(id, buffer, compat, &attrMask, &uniformMask, errorString); } - case ShaderLanguage::HLSL_D3D9: - { - //ShaderLanguageDesc compat(ShaderLanguage::HLSL_D3D9); - return GenerateVertexShaderHLSL(id, buffer, ShaderLanguage::HLSL_D3D9, errorString); - } - case ShaderLanguage::HLSL_D3D11: - { - //ShaderLanguageDesc compat(ShaderLanguage::HLSL_D3D11); - return GenerateVertexShaderHLSL(id, buffer, ShaderLanguage::HLSL_D3D11, errorString); - } default: return false; } @@ -103,12 +91,10 @@ bool TestCompileShader(const char *buffer, ShaderLanguage lang, bool vertex, std std::vector spirv; switch (lang) { case ShaderLanguage::HLSL_D3D11: - case ShaderLanguage::HLSL_D3D11_TEST: { auto output = CompileShaderToBytecodeD3D11(buffer, strlen(buffer), vertex ? "vs_4_0" : "ps_4_0", 0); return !output.empty(); } - case ShaderLanguage::HLSL_D3D9_TEST: case ShaderLanguage::HLSL_D3D9: { LPD3DBLOB blob = CompileShaderToByteCodeD3D9(buffer, vertex ? "vs_2_0" : "ps_2_0", errorMessage); @@ -164,9 +150,8 @@ bool TestShaderGenerators() { LoadD3DCompilerDynamic(); ShaderLanguage languages[] = { - ShaderLanguage::HLSL_D3D11_TEST, - ShaderLanguage::HLSL_D3D11, ShaderLanguage::HLSL_D3D9, + ShaderLanguage::HLSL_D3D11, ShaderLanguage::GLSL_VULKAN, ShaderLanguage::GLSL_140, ShaderLanguage::GLSL_300, @@ -213,19 +198,6 @@ bool TestShaderGenerators() { } } - // KEEPING FOR REUSE LATER: Defunct temporary test: Compare GLSL-in-Vulkan-mode vs Vulkan - if (generateSuccess[0] != generateSuccess[1]) { - printf("mismatching success! '%s' '%s'\n", genErrorString[0].c_str(), genErrorString[1].c_str()); - printf("%s\n", buffer[0]); - printf("%s\n", buffer[1]); - return false; - } - if (generateSuccess[0] && strcmp(buffer[0], buffer[1])) { - printf("mismatching shaders!\n"); - PrintDiff(buffer[0], buffer[1]); - return false; - } - // Now that we have the strings ready for easy comparison (buffer,4 in the watch window), // let's try to compile them. for (int j = 0; j < numLanguages; j++) { @@ -273,24 +245,6 @@ bool TestShaderGenerators() { // We ignore the contents of the error string here, not even gonna try to compile if it errors. } - // KEEPING FOR REUSE LATER: Defunct temporary test. - /* - if (generateSuccess[0] != generateSuccess[1]) { - printf("mismatching success! %s %s\n", genErrorString[0].c_str(), genErrorString[1].c_str()); - printf("%s\n", buffer[0]); - printf("%s\n", buffer[1]); - return 1; - } - if (generateSuccess[0] && strcmp(buffer[0], buffer[1])) { - printf("mismatching shaders! a=glsl b=hlsl\n"); - PrintDiff(buffer[0], buffer[1]); - return 1; - } - if (generateSuccess[2] && strcmp(buffer[2], buffer[3])) { - printf("mismatching shaders! a=glsl b=hlsl\n"); - PrintDiff(buffer[2], buffer[3]); - return 1; - }*/ // Now that we have the strings ready for easy comparison (buffer,4 in the watch window), // let's try to compile them. for (int j = 0; j < numLanguages; j++) { From f4ea3ccf22bdfb2dc8124f15367b2032e9db7254 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Sun, 1 Nov 2020 13:02:53 +0100 Subject: [PATCH 171/275] Move the generic vertex shader generator into GPU/Common and rename it. --- CMakeLists.txt | 4 ++-- GPU/Common/ShaderCommon.h | 13 +++++++++++++ .../VertexShaderGenerator.cpp} | 5 ++--- .../VertexShaderGenerator.h} | 2 +- GPU/D3D11/ShaderManagerD3D11.cpp | 4 ++-- GPU/Directx9/ShaderManagerDX9.cpp | 4 ++-- GPU/Directx9/ShaderManagerDX9.h | 2 +- GPU/GLES/ShaderManagerGLES.cpp | 2 +- GPU/GLES/ShaderManagerGLES.h | 15 +-------------- GPU/GPU.vcxproj | 14 ++------------ GPU/GPU.vcxproj.filters | 12 ++++++------ GPU/Vulkan/ShaderManagerVulkan.cpp | 8 ++++---- GPU/Vulkan/ShaderManagerVulkan.h | 2 +- UWP/GPU_UWP/GPU_UWP.vcxproj | 4 ++-- UWP/GPU_UWP/GPU_UWP.vcxproj.filters | 4 ++-- android/jni/Android.mk | 6 +++--- libretro/Makefile.common | 2 +- unittest/TestShaderGenerators.cpp | 14 ++++++-------- 18 files changed, 52 insertions(+), 65 deletions(-) rename GPU/{GLES/VertexShaderGeneratorGLES.cpp => Common/VertexShaderGenerator.cpp} (99%) rename GPU/{GLES/VertexShaderGeneratorGLES.h => Common/VertexShaderGenerator.h} (90%) diff --git a/CMakeLists.txt b/CMakeLists.txt index 1932011ccf..dad85680cb 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1250,8 +1250,6 @@ set(GPU_GLES GPU/GLES/TextureScalerGLES.h GPU/GLES/DrawEngineGLES.cpp GPU/GLES/DrawEngineGLES.h - GPU/GLES/VertexShaderGeneratorGLES.cpp - GPU/GLES/VertexShaderGeneratorGLES.h ) set(GPU_VULKAN @@ -1340,6 +1338,8 @@ set(GPU_SOURCES GPU/Common/DepalettizeShaderCommon.h GPU/Common/FragmentShaderGenerator.cpp GPU/Common/FragmentShaderGenerator.h + GPU/Common/VertexShaderGenerator.cpp + GPU/Common/VertexShaderGenerator.h GPU/Common/FramebufferManagerCommon.cpp GPU/Common/FramebufferManagerCommon.h GPU/Common/GPUDebugInterface.cpp diff --git a/GPU/Common/ShaderCommon.h b/GPU/Common/ShaderCommon.h index 02f797b869..34594dfba7 100644 --- a/GPU/Common/ShaderCommon.h +++ b/GPU/Common/ShaderCommon.h @@ -176,3 +176,16 @@ enum class PspAttributeLocation { COUNT }; + +// Pre-fetched attrs and uniforms (used by GL only). +enum { + ATTR_POSITION = 0, + ATTR_TEXCOORD = 1, + ATTR_NORMAL = 2, + ATTR_W1 = 3, + ATTR_W2 = 4, + ATTR_COLOR0 = 5, + ATTR_COLOR1 = 6, + + ATTR_COUNT, +}; diff --git a/GPU/GLES/VertexShaderGeneratorGLES.cpp b/GPU/Common/VertexShaderGenerator.cpp similarity index 99% rename from GPU/GLES/VertexShaderGeneratorGLES.cpp rename to GPU/Common/VertexShaderGenerator.cpp index 1ee37b0fc4..f2116cd105 100644 --- a/GPU/GLES/VertexShaderGeneratorGLES.cpp +++ b/GPU/Common/VertexShaderGenerator.cpp @@ -27,8 +27,7 @@ #include "GPU/Common/ShaderId.h" #include "GPU/Common/ShaderUniforms.h" #include "GPU/Common/VertexDecoderCommon.h" -#include "GPU/GLES/VertexShaderGeneratorGLES.h" -#include "GPU/GLES/ShaderManagerGLES.h" +#include "GPU/Common/VertexShaderGenerator.h" #undef WRITE @@ -148,7 +147,7 @@ const char *hlsl_preamble_vs = "#define highp\n" "\n"; -bool GenerateVertexShaderGLSL(const VShaderID &id, char *buffer, const ShaderLanguageDesc &compat, uint32_t *attrMask, uint64_t *uniformMask, std::string *errorString) { +bool GenerateVertexShader(const VShaderID &id, char *buffer, const ShaderLanguageDesc &compat, uint32_t *attrMask, uint64_t *uniformMask, std::string *errorString) { *attrMask = 0; *uniformMask = 0; diff --git a/GPU/GLES/VertexShaderGeneratorGLES.h b/GPU/Common/VertexShaderGenerator.h similarity index 90% rename from GPU/GLES/VertexShaderGeneratorGLES.h rename to GPU/Common/VertexShaderGenerator.h index 743cea026a..8f69f5bcd8 100644 --- a/GPU/GLES/VertexShaderGeneratorGLES.h +++ b/GPU/Common/VertexShaderGenerator.h @@ -21,7 +21,7 @@ struct VShaderID; -bool GenerateVertexShaderGLSL(const VShaderID &id, char *buffer, const ShaderLanguageDesc &compat, uint32_t *attrMask, uint64_t *uniformMask, std::string *errorString); +bool GenerateVertexShader(const VShaderID &id, char *buffer, const ShaderLanguageDesc &compat, uint32_t *attrMask, uint64_t *uniformMask, std::string *errorString); // D3D9 constants. enum { diff --git a/GPU/D3D11/ShaderManagerD3D11.cpp b/GPU/D3D11/ShaderManagerD3D11.cpp index ad3d0a04bc..88730eec70 100644 --- a/GPU/D3D11/ShaderManagerD3D11.cpp +++ b/GPU/D3D11/ShaderManagerD3D11.cpp @@ -34,8 +34,8 @@ #include "GPU/Math3D.h" #include "GPU/GPUState.h" #include "GPU/ge_constants.h" +#include "GPU/Common/VertexShaderGenerator.h" #include "GPU/D3D11/ShaderManagerD3D11.h" -#include "GPU/GLES/VertexShaderGeneratorGLES.h" #include "GPU/D3D11/D3D11Util.h" D3D11FragmentShader::D3D11FragmentShader(ID3D11Device *device, D3D_FEATURE_LEVEL featureLevel, FShaderID id, const char *code, bool useHWTransform) @@ -210,7 +210,7 @@ void ShaderManagerD3D11::GetShaders(int prim, u32 vertType, D3D11VertexShader ** std::string genErrorString; uint32_t attrMask; uint64_t uniformMask; - GenerateVertexShaderGLSL(VSID, codeBuffer_, compat_, &attrMask, &uniformMask, &genErrorString); + GenerateVertexShader(VSID, codeBuffer_, compat_, &attrMask, &uniformMask, &genErrorString); vs = new D3D11VertexShader(device_, featureLevel_, VSID, codeBuffer_, vertType, useHWTransform); vsCache_[VSID] = vs; } else { diff --git a/GPU/Directx9/ShaderManagerDX9.cpp b/GPU/Directx9/ShaderManagerDX9.cpp index 0b0805d37a..4aafbcb290 100644 --- a/GPU/Directx9/ShaderManagerDX9.cpp +++ b/GPU/Directx9/ShaderManagerDX9.cpp @@ -582,7 +582,7 @@ VSShader *ShaderManagerDX9::ApplyShader(bool useHWTransform, bool useHWTessellat std::string genErrorString; uint32_t attrMask; uint64_t uniformMask; - if (GenerateVertexShaderGLSL(VSID, codeBuffer_, compat_, &attrMask, &uniformMask, &genErrorString)) { + if (GenerateVertexShader(VSID, codeBuffer_, compat_, &attrMask, &uniformMask, &genErrorString)) { vs = new VSShader(device_, VSID, codeBuffer_, useHWTransform); } if (!vs || vs->Failed()) { @@ -607,7 +607,7 @@ VSShader *ShaderManagerDX9::ApplyShader(bool useHWTransform, bool useHWTessellat // Can still work with software transform. uint32_t attrMask; uint64_t uniformMask; - bool success = GenerateVertexShaderGLSL(VSID, codeBuffer_, compat_, &attrMask, &uniformMask, &genErrorString); + bool success = GenerateVertexShader(VSID, codeBuffer_, compat_, &attrMask, &uniformMask, &genErrorString); _assert_(success); vs = new VSShader(device_, VSID, codeBuffer_, false); } diff --git a/GPU/Directx9/ShaderManagerDX9.h b/GPU/Directx9/ShaderManagerDX9.h index 1ac3ae0e48..8e132e2a31 100644 --- a/GPU/Directx9/ShaderManagerDX9.h +++ b/GPU/Directx9/ShaderManagerDX9.h @@ -21,7 +21,7 @@ #include #include "Common/Common.h" -#include "GPU/GLES/VertexShaderGeneratorGLES.h" +#include "GPU/Common/VertexShaderGenerator.h" #include "GPU/Common/FragmentShaderGenerator.h" #include "GPU/Common/ShaderCommon.h" #include "GPU/Common/ShaderId.h" diff --git a/GPU/GLES/ShaderManagerGLES.cpp b/GPU/GLES/ShaderManagerGLES.cpp index 44ce55e9dc..7e77133a85 100644 --- a/GPU/GLES/ShaderManagerGLES.cpp +++ b/GPU/GLES/ShaderManagerGLES.cpp @@ -721,7 +721,7 @@ Shader *ShaderManagerGLES::CompileVertexShader(VShaderID VSID) { uint32_t attrMask; uint64_t uniformMask; std::string errorString; - if (!GenerateVertexShaderGLSL(VSID, codeBuffer_, compat_, &attrMask, &uniformMask, &errorString)) { + if (!GenerateVertexShader(VSID, codeBuffer_, compat_, &attrMask, &uniformMask, &errorString)) { ERROR_LOG(G3D, "Shader gen error: %s", errorString.c_str()); return nullptr; } diff --git a/GPU/GLES/ShaderManagerGLES.h b/GPU/GLES/ShaderManagerGLES.h index a075530ecd..2343f7d508 100644 --- a/GPU/GLES/ShaderManagerGLES.h +++ b/GPU/GLES/ShaderManagerGLES.h @@ -23,24 +23,11 @@ #include "Common/GPU/OpenGL/GLRenderManager.h" #include "GPU/Common/ShaderCommon.h" #include "GPU/Common/ShaderId.h" -#include "GPU/GLES/VertexShaderGeneratorGLES.h" +#include "GPU/Common/VertexShaderGenerator.h" #include "GPU/Common/FragmentShaderGenerator.h" class Shader; -// Pre-fetched attrs and uniforms -enum { - ATTR_POSITION = 0, - ATTR_TEXCOORD = 1, - ATTR_NORMAL = 2, - ATTR_W1 = 3, - ATTR_W2 = 4, - ATTR_COLOR0 = 5, - ATTR_COLOR1 = 6, - - ATTR_COUNT, -}; - class LinkedShader { public: LinkedShader(GLRenderManager *render, VShaderID VSID, Shader *vs, FShaderID FSID, Shader *fs, bool useHWTransform, bool preloading = false); diff --git a/GPU/GPU.vcxproj b/GPU/GPU.vcxproj index 849173ac8d..675602d6d5 100644 --- a/GPU/GPU.vcxproj +++ b/GPU/GPU.vcxproj @@ -368,6 +368,7 @@ + @@ -446,12 +447,6 @@ true true - - true - true - true - true - @@ -536,6 +531,7 @@ true true + @@ -628,12 +624,6 @@ true true - - true - true - true - true - diff --git a/GPU/GPU.vcxproj.filters b/GPU/GPU.vcxproj.filters index 9bb59502fc..509e962588 100644 --- a/GPU/GPU.vcxproj.filters +++ b/GPU/GPU.vcxproj.filters @@ -189,9 +189,6 @@ GLES - - GLES - GLES @@ -270,6 +267,9 @@ Common + + Common + @@ -443,9 +443,6 @@ GLES - - GLES - GLES @@ -539,5 +536,8 @@ Common + + Common + \ No newline at end of file diff --git a/GPU/Vulkan/ShaderManagerVulkan.cpp b/GPU/Vulkan/ShaderManagerVulkan.cpp index e1c6cbee59..4b54a77d83 100644 --- a/GPU/Vulkan/ShaderManagerVulkan.cpp +++ b/GPU/Vulkan/ShaderManagerVulkan.cpp @@ -36,11 +36,11 @@ #include "GPU/Math3D.h" #include "GPU/GPUState.h" #include "GPU/ge_constants.h" +#include "GPU/Common/FragmentShaderGenerator.h" +#include "GPU/Common/VertexShaderGenerator.h" #include "GPU/Vulkan/ShaderManagerVulkan.h" #include "GPU/Vulkan/DrawEngineVulkan.h" #include "GPU/Vulkan/FramebufferManagerVulkan.h" -#include "GPU/Common/FragmentShaderGenerator.h" -#include "GPU/GLES/VertexShaderGeneratorGLES.h" VulkanFragmentShader::VulkanFragmentShader(VulkanContext *vulkan, FShaderID id, const char *code) : vulkan_(vulkan), id_(id), failed_(false), module_(0) { @@ -265,7 +265,7 @@ void ShaderManagerVulkan::GetShaders(int prim, u32 vertType, VulkanVertexShader std::string genErrorString; uint64_t uniformMask = 0; // Not used uint32_t attributeMask = 0; // Not used - bool success = GenerateVertexShaderGLSL(VSID, codeBuffer_, compat_, &attributeMask, &uniformMask, &genErrorString); + bool success = GenerateVertexShader(VSID, codeBuffer_, compat_, &attributeMask, &uniformMask, &genErrorString); _assert_(success); vs = new VulkanVertexShader(vulkan_, VSID, codeBuffer_, useHWTransform); vsCache_.Insert(VSID, vs); @@ -398,7 +398,7 @@ bool ShaderManagerVulkan::LoadCache(FILE *f) { std::string genErrorString; uint32_t attributeMask = 0; uint64_t uniformMask = 0; - if (!GenerateVertexShaderGLSL(id, codeBuffer_, compat_, &attributeMask, &uniformMask, &genErrorString)) { + if (!GenerateVertexShader(id, codeBuffer_, compat_, &attributeMask, &uniformMask, &genErrorString)) { return false; } VulkanVertexShader *vs = new VulkanVertexShader(vulkan_, id, codeBuffer_, useHWTransform); diff --git a/GPU/Vulkan/ShaderManagerVulkan.h b/GPU/Vulkan/ShaderManagerVulkan.h index d48c7dcd99..e35a07a103 100644 --- a/GPU/Vulkan/ShaderManagerVulkan.h +++ b/GPU/Vulkan/ShaderManagerVulkan.h @@ -24,7 +24,7 @@ #include "Common/GPU/Vulkan/VulkanMemory.h" #include "GPU/Common/ShaderCommon.h" #include "GPU/Common/ShaderId.h" -#include "GPU/GLES/VertexShaderGeneratorGLES.h" +#include "GPU/Common/VertexShaderGenerator.h" #include "GPU/Common/FragmentShaderGenerator.h" #include "GPU/Vulkan/VulkanUtil.h" #include "Common/Math/lin/matrix4x4.h" diff --git a/UWP/GPU_UWP/GPU_UWP.vcxproj b/UWP/GPU_UWP/GPU_UWP.vcxproj index 5fd5c99998..d5b5d3167e 100644 --- a/UWP/GPU_UWP/GPU_UWP.vcxproj +++ b/UWP/GPU_UWP/GPU_UWP.vcxproj @@ -402,6 +402,7 @@ + @@ -417,7 +418,6 @@ - @@ -462,6 +462,7 @@ + @@ -477,7 +478,6 @@ - diff --git a/UWP/GPU_UWP/GPU_UWP.vcxproj.filters b/UWP/GPU_UWP/GPU_UWP.vcxproj.filters index 331a8c82e6..12f33ec3af 100644 --- a/UWP/GPU_UWP/GPU_UWP.vcxproj.filters +++ b/UWP/GPU_UWP/GPU_UWP.vcxproj.filters @@ -41,7 +41,6 @@ - @@ -57,6 +56,7 @@ + @@ -96,7 +96,6 @@ - @@ -114,5 +113,6 @@ + \ No newline at end of file diff --git a/android/jni/Android.mk b/android/jni/Android.mk index d9f3a34883..71e6915927 100644 --- a/android/jni/Android.mk +++ b/android/jni/Android.mk @@ -326,6 +326,7 @@ EXEC_AND_LIB_FILES := \ $(SRC)/GPU/Common/TextureDecoder.cpp \ $(SRC)/GPU/Common/PostShader.cpp \ $(SRC)/GPU/Common/ShaderUniforms.cpp \ + $(SRC)/GPU/Common/VertexShaderGenerator.cpp \ $(SRC)/GPU/Debugger/Breakpoints.cpp \ $(SRC)/GPU/Debugger/Debugger.cpp \ $(SRC)/GPU/Debugger/Playback.cpp \ @@ -333,14 +334,13 @@ EXEC_AND_LIB_FILES := \ $(SRC)/GPU/Debugger/Stepping.cpp \ $(SRC)/GPU/GLES/FramebufferManagerGLES.cpp \ $(SRC)/GPU/GLES/DepalettizeShaderGLES.cpp \ - $(SRC)/GPU/GLES/DepthBufferGLES.cpp.arm \ + $(SRC)/GPU/GLES/DepthBufferGLES.cpp \ $(SRC)/GPU/GLES/GPU_GLES.cpp.arm \ - $(SRC)/GPU/GLES/StencilBufferGLES.cpp.arm \ + $(SRC)/GPU/GLES/StencilBufferGLES.cpp \ $(SRC)/GPU/GLES/TextureCacheGLES.cpp.arm \ $(SRC)/GPU/GLES/DrawEngineGLES.cpp.arm \ $(SRC)/GPU/GLES/StateMappingGLES.cpp.arm \ $(SRC)/GPU/GLES/ShaderManagerGLES.cpp.arm \ - $(SRC)/GPU/GLES/VertexShaderGeneratorGLES.cpp.arm \ $(SRC)/GPU/GLES/FragmentTestCacheGLES.cpp.arm \ $(SRC)/GPU/GLES/TextureScalerGLES.cpp \ $(SRC)/GPU/Null/NullGpu.cpp \ diff --git a/libretro/Makefile.common b/libretro/Makefile.common index ec02dcfe44..3120c903c8 100644 --- a/libretro/Makefile.common +++ b/libretro/Makefile.common @@ -249,6 +249,7 @@ SOURCES_CXX += \ $(GPUDIR)/Debugger/Record.cpp \ $(GPUDIR)/Debugger/Stepping.cpp \ $(GPUDIR)/Common/FragmentShaderGenerator.cpp \ + $(GPUDIR)/Common/VertexShaderGenerator.cpp \ $(GPUDIR)/Common/TextureCacheCommon.cpp \ $(GPUDIR)/Common/TextureScalerCommon.cpp \ $(GPUDIR)/Common/SoftwareTransformCommon.cpp \ @@ -269,7 +270,6 @@ SOURCES_CXX += \ $(GPUDIR)/Software/RasterizerRectangle.cpp \ $(GPUDIR)/GLES/DepalettizeShaderGLES.cpp \ $(GPUDIR)/GLES/DepthBufferGLES.cpp \ - $(GPUDIR)/GLES/VertexShaderGeneratorGLES.cpp \ $(GPUDIR)/GLES/DrawEngineGLES.cpp \ $(GPUDIR)/GLES/GPU_GLES.cpp \ $(GPUDIR)/GLES/FragmentTestCacheGLES.cpp \ diff --git a/unittest/TestShaderGenerators.cpp b/unittest/TestShaderGenerators.cpp index 4b60ee8d56..645069172e 100644 --- a/unittest/TestShaderGenerators.cpp +++ b/unittest/TestShaderGenerators.cpp @@ -10,9 +10,7 @@ #include "GPU/Vulkan/VulkanContext.h" #include "GPU/Common/FragmentShaderGenerator.h" - -#include "GPU/GLES/VertexShaderGeneratorGLES.h" -#include "GPU/GLES/VertexShaderGeneratorGLES.h" +#include "GPU/Common/VertexShaderGenerator.h" #include "GPU/D3D11/D3D11Util.h" #include "GPU/D3D11/D3D11Loader.h" @@ -60,27 +58,27 @@ bool GenerateVShader(VShaderID id, char *buffer, ShaderLanguage lang, std::strin case ShaderLanguage::GLSL_VULKAN: { ShaderLanguageDesc compat(ShaderLanguage::GLSL_VULKAN); - return GenerateVertexShaderGLSL(id, buffer, compat, &attrMask, &uniformMask, errorString); + return GenerateVertexShader(id, buffer, compat, &attrMask, &uniformMask, errorString); } case ShaderLanguage::GLSL_140: { ShaderLanguageDesc compat(ShaderLanguage::GLSL_140); - return GenerateVertexShaderGLSL(id, buffer, compat, &attrMask, &uniformMask, errorString); + return GenerateVertexShader(id, buffer, compat, &attrMask, &uniformMask, errorString); } case ShaderLanguage::GLSL_300: { ShaderLanguageDesc compat(ShaderLanguage::GLSL_140); - return GenerateVertexShaderGLSL(id, buffer, compat, &attrMask, &uniformMask, errorString); + return GenerateVertexShader(id, buffer, compat, &attrMask, &uniformMask, errorString); } case ShaderLanguage::HLSL_D3D9: { ShaderLanguageDesc compat(ShaderLanguage::HLSL_D3D9); - return GenerateVertexShaderGLSL(id, buffer, compat, &attrMask, &uniformMask, errorString); + return GenerateVertexShader(id, buffer, compat, &attrMask, &uniformMask, errorString); } case ShaderLanguage::HLSL_D3D11: { ShaderLanguageDesc compat(ShaderLanguage::HLSL_D3D11); - return GenerateVertexShaderGLSL(id, buffer, compat, &attrMask, &uniformMask, errorString); + return GenerateVertexShader(id, buffer, compat, &attrMask, &uniformMask, errorString); } default: return false; From 085900adb51ca77d93d561edd721dca526bea35c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Mon, 2 Nov 2020 09:03:08 +0100 Subject: [PATCH 172/275] Fix vertex shader generator bug. Got caught by the new test --- GPU/Common/VertexShaderGenerator.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/GPU/Common/VertexShaderGenerator.cpp b/GPU/Common/VertexShaderGenerator.cpp index f2116cd105..598c0ddbb8 100644 --- a/GPU/Common/VertexShaderGenerator.cpp +++ b/GPU/Common/VertexShaderGenerator.cpp @@ -858,14 +858,14 @@ bool GenerateVertexShader(const VShaderID &id, char *buffer, const ShaderLanguag // Uncomment this to screw up bone shaders to check the vertex shader software fallback // WRITE(p, "THIS SHOULD ERROR! #error"); - if (numBoneWeights == 1 && compat.shaderLanguage != GLSL_VULKAN) + if (numBoneWeights == 1 && ShaderLanguageIsOpenGL(compat.shaderLanguage)) WRITE(p, " %s skinMatrix = w1 * u_bone0", boneMatrix); else WRITE(p, " %s skinMatrix = w1.x * u_bone0", boneMatrix); for (int i = 1; i < numBoneWeights; i++) { const char *weightAttr = boneWeightAttr[i]; - // workaround for "cant do .x of scalar" issue - if (compat.shaderLanguage != GLSL_VULKAN) { + // workaround for "cant do .x of scalar" issue. + if (ShaderLanguageIsOpenGL(compat.shaderLanguage)) { if (numBoneWeights == 1 && i == 0) weightAttr = "w1"; if (numBoneWeights == 5 && i == 4) weightAttr = "w2"; } From 32eb882bc6205f5b488e86bf40076d6fd2fd4e75 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Sun, 1 Nov 2020 23:19:25 +0100 Subject: [PATCH 173/275] Clarify some logic, improve framebuffer names --- GPU/Common/FramebufferManagerCommon.cpp | 9 ++++++--- GPU/Common/FramebufferManagerCommon.h | 2 +- GPU/Common/TextureCacheCommon.cpp | 14 +++++++++++--- GPU/Common/TextureCacheCommon.h | 1 + GPU/D3D11/TextureCacheD3D11.cpp | 1 + GPU/GLES/TextureCacheGLES.cpp | 13 +++++++------ Windows/GEDebugger/GEDebugger.cpp | 2 +- 7 files changed, 28 insertions(+), 14 deletions(-) diff --git a/GPU/Common/FramebufferManagerCommon.cpp b/GPU/Common/FramebufferManagerCommon.cpp index cb656a35ef..502742c6a4 100644 --- a/GPU/Common/FramebufferManagerCommon.cpp +++ b/GPU/Common/FramebufferManagerCommon.cpp @@ -265,10 +265,13 @@ VirtualFramebuffer *FramebufferManagerCommon::DoSetRenderFrameBuffer(const Frame if (v->fb_address == params.fb_address) { vfb = v; // Update fb stride in case it changed - if (vfb->fb_stride != params.fb_stride || vfb->format != params.fmt) { - vfbFormatChanged = true; + if (vfb->fb_stride != params.fb_stride) { vfb->fb_stride = params.fb_stride; + vfbFormatChanged = true; + } + if (vfb->format != params.fmt) { vfb->format = params.fmt; + vfbFormatChanged = true; } if (vfb->z_address == 0 && vfb->z_stride == 0 && params.z_stride != 0) { @@ -1087,7 +1090,7 @@ void FramebufferManagerCommon::ResizeFramebufFBO(VirtualFramebuffer *vfb, int w, shaderManager_->DirtyLastShader(); char tag[256]; - snprintf(tag, sizeof(tag), "%08x_%08x_%dx%d", vfb->fb_address, vfb->z_address, w, h); + snprintf(tag, sizeof(tag), "%08x_%08x_%dx%d_%s", vfb->fb_address, vfb->z_address, w, h, GeBufferFormatToString((GEBufferFormat)vfb->colorDepth)); vfb->fbo = draw_->CreateFramebuffer({ vfb->renderWidth, vfb->renderHeight, 1, 1, true, (Draw::FBColorDepth)vfb->colorDepth, tag }); if (old.fbo) { INFO_LOG(FRAMEBUF, "Resizing FBO for %08x : %dx%dx%s", vfb->fb_address, w, h, GeBufferFormatToString(vfb->format)); diff --git a/GPU/Common/FramebufferManagerCommon.h b/GPU/Common/FramebufferManagerCommon.h index 44cd2f6b5f..ab92f4df23 100644 --- a/GPU/Common/FramebufferManagerCommon.h +++ b/GPU/Common/FramebufferManagerCommon.h @@ -55,7 +55,7 @@ struct VirtualFramebuffer { int fb_stride; int z_stride; - GEBufferFormat format; // virtual, right now they are all RGBA8888 + GEBufferFormat format; // virtual, in reality they are all RGBA8888 for better quality but we can reinterpret that as necessary // width/height: The detected size of the current framebuffer, in original PSP pixels. u16 width; diff --git a/GPU/Common/TextureCacheCommon.cpp b/GPU/Common/TextureCacheCommon.cpp index 1c5c63cdce..fb84f0f6ec 100644 --- a/GPU/Common/TextureCacheCommon.cpp +++ b/GPU/Common/TextureCacheCommon.cpp @@ -471,11 +471,16 @@ TexCacheEntry *TextureCacheCommon::SetTexture() { // No texture found, or changed (depending on entry). // Check for framebuffers. - TextureDefinition def{}; + TextureDefinition def; def.addr = texaddr; def.dim = dim; def.format = format; def.bufw = bufw; + def.swizzled = gstate.isTextureSwizzled(); + + if (texaddr == 0x40cc000) { + texaddr = texaddr; + } std::vector candidates = GetFramebufferCandidates(def, 0); if (candidates.size() > 0) { @@ -851,9 +856,11 @@ FramebufferMatchInfo TextureCacheCommon::MatchFramebuffer( // NOTE: This check is okay because the first texture formats are the same as the buffer formats. if (entry.format != (GETextureFormat)framebuffer->format) { WARN_LOG_ONCE(diffFormat1, G3D, "Texturing from framebuffer with different formats %s != %s", GeTextureFormatToString(entry.format), GeBufferFormatToString(framebuffer->format)); - return FramebufferMatchInfo{ FramebufferMatch::NO_MATCH }; - } else { return FramebufferMatchInfo{ FramebufferMatch::VALID }; + } else { + // TODO: Here we should either change the format of the framebuffer, reinterpreting it, + // or read from it while reinterpreting it. Not sure which is generally best. + return FramebufferMatchInfo{ FramebufferMatch::NO_MATCH }; } } else { // Apply to buffered mode only. @@ -1007,6 +1014,7 @@ bool TextureCacheCommon::SetOffsetTexture(u32 yOffset) { def.format = fmt; def.bufw = GetTextureBufw(0, texaddr, fmt); def.dim = gstate.getTextureDimension(0); + def.swizzled = gstate.isTextureSwizzled(); std::vector candidates = GetFramebufferCandidates(def, texaddrOffset); if (candidates.size() > 0) { diff --git a/GPU/Common/TextureCacheCommon.h b/GPU/Common/TextureCacheCommon.h index 1b0300724b..7acfe3042c 100644 --- a/GPU/Common/TextureCacheCommon.h +++ b/GPU/Common/TextureCacheCommon.h @@ -98,6 +98,7 @@ struct TextureDefinition { GETextureFormat format; u32 dim; u32 bufw; + bool swizzled; }; diff --git a/GPU/D3D11/TextureCacheD3D11.cpp b/GPU/D3D11/TextureCacheD3D11.cpp index a989cf353f..4c3b92cdd7 100644 --- a/GPU/D3D11/TextureCacheD3D11.cpp +++ b/GPU/D3D11/TextureCacheD3D11.cpp @@ -496,6 +496,7 @@ void TextureCacheD3D11::BuildTexture(TexCacheEntry *const entry) { // Don't scale the PPGe texture. if (entry->addr > 0x05000000 && entry->addr < PSP_GetKernelMemoryEnd()) scaleFactor = 1; + if ((entry->status & TexCacheEntry::STATUS_CHANGE_FREQUENT) != 0 && scaleFactor != 1) { // Remember for later that we /wanted/ to scale this texture. entry->status |= TexCacheEntry::STATUS_TO_SCALE; diff --git a/GPU/GLES/TextureCacheGLES.cpp b/GPU/GLES/TextureCacheGLES.cpp index 7a62854e6f..07adb059d8 100644 --- a/GPU/GLES/TextureCacheGLES.cpp +++ b/GPU/GLES/TextureCacheGLES.cpp @@ -492,9 +492,6 @@ void TextureCacheGLES::BuildTexture(TexCacheEntry *const entry) { } } - // If GLES3 is available, we can preallocate the storage, which makes texture loading more efficient. - Draw::DataFormat dstFmt = GetDestFormat(GETextureFormat(entry->format), gstate.getClutPaletteFormat()); - int scaleFactor = standardScaleFactor_; // Rachet down scale factor in low-memory mode. @@ -535,7 +532,10 @@ void TextureCacheGLES::BuildTexture(TexCacheEntry *const entry) { texelsScaledThisFrame_ += w * h; } } - + + // If GLES3 is available, we can preallocate the storage, which makes texture loading more efficient. + Draw::DataFormat dstFmt = GetDestFormat(GETextureFormat(entry->format), gstate.getClutPaletteFormat()); + // GLES2 doesn't have support for a "Max lod" which is critical as PSP games often // don't specify mips all the way down. As a result, we either need to manually generate // the bottom few levels or rely on OpenGL's autogen mipmaps instead, which might not @@ -546,10 +546,11 @@ void TextureCacheGLES::BuildTexture(TexCacheEntry *const entry) { // NOTE: Since the level is not part of the cache key, we assume it never changes. u8 level = std::max(0, gstate.getTexLevelOffset16() / 16); LoadTextureLevel(*entry, replaced, level, scaleFactor, dstFmt); - } else + } else { LoadTextureLevel(*entry, replaced, 0, scaleFactor, dstFmt); + } - // Mipmapping only enable when texture scaling disable + // Mipmapping is only enabled when texture scaling is disabled. int texMaxLevel = 0; bool genMips = false; if (maxLevel > 0 && scaleFactor == 1) { diff --git a/Windows/GEDebugger/GEDebugger.cpp b/Windows/GEDebugger/GEDebugger.cpp index 61ca7784a2..affeb1c6d4 100644 --- a/Windows/GEDebugger/GEDebugger.cpp +++ b/Windows/GEDebugger/GEDebugger.cpp @@ -285,7 +285,7 @@ void CGEDebugger::DescribePrimaryPreview(const GPUgstate &state, wchar_t desc[25 switch (PrimaryDisplayType(fbTabs->CurrentTabIndex())) { case PRIMARY_FRAMEBUF: - _snwprintf(desc, 256, L"Color: 0x%08x (%dx%d) fmt %i", state.getFrameBufRawAddress(), primaryBuffer_->GetStride(), primaryBuffer_->GetHeight(), state.FrameBufFormat()); + _snwprintf(desc, 256, L"Color: 0x%08x (%dx%d) fmt %s", state.getFrameBufRawAddress(), primaryBuffer_->GetStride(), primaryBuffer_->GetHeight(), GeBufferFormatToString(state.FrameBufFormat())); break; case PRIMARY_DEPTHBUF: From 291742535bcffb48fd03358ad350f89a929f8865 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Sun, 1 Nov 2020 23:37:32 +0100 Subject: [PATCH 174/275] Safety, comments --- Common/GPU/Vulkan/VulkanRenderManager.cpp | 9 +++++++-- Common/GPU/Vulkan/VulkanRenderManager.h | 2 +- GPU/Common/PresentationCommon.cpp | 2 +- 3 files changed, 9 insertions(+), 4 deletions(-) diff --git a/Common/GPU/Vulkan/VulkanRenderManager.cpp b/Common/GPU/Vulkan/VulkanRenderManager.cpp index e9bdf76103..b70848cb28 100644 --- a/Common/GPU/Vulkan/VulkanRenderManager.cpp +++ b/Common/GPU/Vulkan/VulkanRenderManager.cpp @@ -213,7 +213,11 @@ VulkanRenderManager::VulkanRenderManager(VulkanContext *vulkan) : vulkan_(vulkan } } -void VulkanRenderManager::CreateBackbuffers() { +bool VulkanRenderManager::CreateBackbuffers() { + if (!vulkan_->GetSwapchain()) { + ERROR_LOG(G3D, "No swapchain - can't create backbuffers"); + return false; + } VkResult res = vkGetSwapchainImagesKHR(vulkan_->GetDevice(), vulkan_->GetSwapchain(), &swapchainImageCount_, nullptr); _dbg_assert_(res == VK_SUCCESS); @@ -222,7 +226,7 @@ void VulkanRenderManager::CreateBackbuffers() { if (res != VK_SUCCESS) { ERROR_LOG(G3D, "vkGetSwapchainImagesKHR failed"); delete[] swapchainImages; - return; + return false; } VkCommandBuffer cmdInit = GetInitCmd(); @@ -283,6 +287,7 @@ void VulkanRenderManager::CreateBackbuffers() { INFO_LOG(G3D, "Starting Vulkan submission thread (threadInitFrame_ = %d)", vulkan_->GetCurFrame()); thread_ = std::thread(&VulkanRenderManager::ThreadFunc, this); } + return true; } void VulkanRenderManager::StopThread() { diff --git a/Common/GPU/Vulkan/VulkanRenderManager.h b/Common/GPU/Vulkan/VulkanRenderManager.h index 19fb6b1fb3..1914f5214c 100644 --- a/Common/GPU/Vulkan/VulkanRenderManager.h +++ b/Common/GPU/Vulkan/VulkanRenderManager.h @@ -289,7 +289,7 @@ public: return renderStepOffset_ + (int)steps_.size(); } - void CreateBackbuffers(); + bool CreateBackbuffers(); void DestroyBackbuffers(); bool HasBackbuffers() { diff --git a/GPU/Common/PresentationCommon.cpp b/GPU/Common/PresentationCommon.cpp index 2d4da991c6..c359922085 100644 --- a/GPU/Common/PresentationCommon.cpp +++ b/GPU/Common/PresentationCommon.cpp @@ -411,7 +411,7 @@ void PresentationCommon::CreateDeviceObjects() { vdata_ = draw_->CreateBuffer(sizeof(Vertex) * 8, BufferUsageFlag::DYNAMIC | BufferUsageFlag::VERTEXDATA); - // TODO: Use 4 and a strip? + // TODO: Use a triangle strip? Makes the UV rotation slightly more complex. idata_ = draw_->CreateBuffer(sizeof(uint16_t) * 6, BufferUsageFlag::DYNAMIC | BufferUsageFlag::INDEXDATA); uint16_t indexes[] = { 0, 1, 2, 0, 2, 3 }; draw_->UpdateBuffer(idata_, (const uint8_t *)indexes, 0, sizeof(indexes), Draw::UPDATE_DISCARD); From 39b5eb5b3d2f974d62563c0f99ec8429a40a6edf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Mon, 2 Nov 2020 08:59:30 +0100 Subject: [PATCH 175/275] ShaderWriter, a replacement for the sprintf WRITE macro. --- GPU/Common/ColorReinterpret.cpp | 49 ++++++++++ GPU/Common/ColorReinterpret.h | 6 ++ GPU/Common/FragmentShaderGenerator.cpp | 75 ++-------------- GPU/Common/FramebufferManagerCommon.h | 5 ++ GPU/Common/ShaderCommon.h | 5 ++ GPU/Common/ShaderWriter.cpp | 118 +++++++++++++++++++++++++ GPU/Common/ShaderWriter.h | 46 ++++++++++ GPU/Common/VertexShaderGenerator.cpp | 26 +----- GPU/GPU.vcxproj | 2 + GPU/GPU.vcxproj.filters | 6 ++ 10 files changed, 248 insertions(+), 90 deletions(-) create mode 100644 GPU/Common/ColorReinterpret.cpp create mode 100644 GPU/Common/ColorReinterpret.h create mode 100644 GPU/Common/ShaderWriter.cpp create mode 100644 GPU/Common/ShaderWriter.h diff --git a/GPU/Common/ColorReinterpret.cpp b/GPU/Common/ColorReinterpret.cpp new file mode 100644 index 0000000000..3699d2f8aa --- /dev/null +++ b/GPU/Common/ColorReinterpret.cpp @@ -0,0 +1,49 @@ +#include + +#include "GPU/Common/ColorReinterpret.h" +#include "GPU/Common/ShaderWriter.h" + +// TODO: We could have an option to preserve any extra color precision. But gonna start without it. +// Requires full size integer math. +bool GenerateReinterpretFragmentShader(char *buffer, GEBufferFormat from, GEBufferFormat to, const ShaderLanguageDesc &lang) { + if (!lang.bitwiseOps) { + return false; + } + ShaderWriter writer(buffer, lang, ShaderStage::Fragment); + + switch (from) { + case GE_FORMAT_4444: + writer.W(" uint color = uint(in.r * 15.99) | (uint(in.g * 15.99) << 4) | (uint(in.b * 15.99) << 8) | (uint(in.a * 15.99) << 12);\n"); + break; + case GE_FORMAT_5551: + writer.W(" uint color = uint(in.r * 31.99) | (uint(in.g * 31.99) << 5) | (uint(in.b * 31.99) << 10);\n"); + writer.W(" if (in.a > 128.0) color |= 0x8000;\n"); + break; + case GE_FORMAT_565: + writer.W(" uint color = uint(in.r * 31.99) | (uint(in.g * 63.99) << 5) | (uint(in.b * 31.99) << 11);\n"); + break; + default: _assert_(false); + } + + switch (to) { + case GE_FORMAT_4444: + writer.W(" vec4 output = vec4(float(color & 0xF), float((color >> 4) & 0xF), float((color >> 8) & 0xF), float((color >> 12) & 0xF));\n"); + writer.W(" output *= 1.0 / 15.0;\n"); + break; + case GE_FORMAT_5551: + writer.W(" vec4 output = vec4(float(color & 0x1F), float((color >> 5) & 0x1F), float((color >> 10) & 0x1F), 0.0);\n"); + writer.W(" output.rgb *= 1.0 / 31.0;\n"); + writer.W(" output.a = float(color >> 15);\n"); + break; + case GE_FORMAT_565: + writer.W(" vec4 output = vec4(float(color & 0x1F), float((color >> 5) & 0x3F), float((color >> 11) & 0x1F), 1.0);\n"); + writer.W(" output.rb *= 1.0 / 31.0;\n"); + writer.W(" output.g *= 1.0 / 63.0;\n"); + break; + default: _assert_(false); + } + + writer.W("}"); + + return true; +} diff --git a/GPU/Common/ColorReinterpret.h b/GPU/Common/ColorReinterpret.h new file mode 100644 index 0000000000..c1ff33226a --- /dev/null +++ b/GPU/Common/ColorReinterpret.h @@ -0,0 +1,6 @@ +#pragma once + +#include "Common/Log.h" +#include "GPU/ge_constants.h" +#include "GPU/GPUCommon.h" +#include "GPU/Common/ShaderWriter.h" diff --git a/GPU/Common/FragmentShaderGenerator.cpp b/GPU/Common/FragmentShaderGenerator.cpp index bb51a14c36..612d9f6c7d 100644 --- a/GPU/Common/FragmentShaderGenerator.cpp +++ b/GPU/Common/FragmentShaderGenerator.cpp @@ -27,44 +27,11 @@ #include "GPU/Common/ShaderId.h" #include "GPU/Common/ShaderUniforms.h" #include "GPU/Common/FragmentShaderGenerator.h" +#include "GPU/Common/ShaderWriter.h" #include "GPU/ge_constants.h" #include "GPU/GPUState.h" -#define WRITE p+=sprintf - -const char *vulkan_glsl_preamble_fs = -"#version 450\n" -"#extension GL_ARB_separate_shader_objects : enable\n" -"#extension GL_ARB_shading_language_420pack : enable\n" -"#extension GL_ARB_conservative_depth : enable\n" -"#extension GL_ARB_shader_image_load_store : enable\n" -"#define splat3(x) vec3(x)\n" -"#define lowp\n" -"#define mediump\n" -"#define highp\n" -"#define DISCARD discard\n" -"\n"; - -const char *hlsl_preamble_fs = -"#define vec2 float2\n" -"#define vec3 float3\n" -"#define vec4 float4\n" -"#define uvec3 uint3\n" -"#define ivec3 int3\n" -"#define ivec4 int4\n" -"#define mat4 float4x4\n" -"#define mat3x4 float4x3\n" // note how the conventions are backwards -"#define splat3(x) float3(x, x, x)\n" -"#define mix lerp\n" -"#define mod(x, y) fmod(x, y)\n"; - -const char *hlsl_d3d11_preamble_fs = -"#define DISCARD discard\n" -"#define DISCARD_BELOW(x) clip(x);\n"; -const char *hlsl_d3d9_preamble_fs = -"#define DISCARD clip(-1)\n" -"#define DISCARD_BELOW(x) clip(x)\n"; - +#define WRITE(p, ...) p.W(__VA_ARGS__) bool GenerateFragmentShader(const FShaderID &id, char *buffer, const ShaderLanguageDesc &compat, uint64_t *uniformMask, std::string *errorString) { *uniformMask = 0; @@ -83,45 +50,21 @@ bool GenerateFragmentShader(const FShaderID &id, char *buffer, const ShaderLangu ReplaceAlphaType stencilToAlpha = static_cast(id.Bits(FS_BIT_STENCIL_TO_ALPHA, 2)); - char *p = buffer; - - switch (compat.shaderLanguage) { - case ShaderLanguage::GLSL_VULKAN: - WRITE(p, "%s", vulkan_glsl_preamble_fs); - break; - case ShaderLanguage::HLSL_D3D11: - WRITE(p, "%s", hlsl_preamble_fs); - WRITE(p, "%s", hlsl_d3d11_preamble_fs); - break; - case ShaderLanguage::HLSL_D3D9: - WRITE(p, "%s", hlsl_preamble_fs); - WRITE(p, "%s", hlsl_d3d9_preamble_fs); - break; - default: - // OpenGL - WRITE(p, "#version %d%s\n", compat.glslVersionNumber, compat.gles && compat.glslES30 ? " es" : ""); - WRITE(p, "#define DISCARD discard\n"); - + std::vector gl_exts; + if (ShaderLanguageIsOpenGL(compat.shaderLanguage)) { if (stencilToAlpha == REPLACE_ALPHA_DUALSOURCE && gl_extensions.EXT_blend_func_extended) { - WRITE(p, "#extension GL_EXT_blend_func_extended : require\n"); + gl_exts.push_back("#extension GL_EXT_blend_func_extended : require"); } if (gl_extensions.EXT_gpu_shader4) { - WRITE(p, "#extension GL_EXT_gpu_shader4 : enable\n"); + gl_exts.push_back("#extension GL_EXT_gpu_shader4 : enable"); } if (compat.framebufferFetchExtension) { - WRITE(p, "%s\n", compat.framebufferFetchExtension); + gl_exts.push_back(compat.framebufferFetchExtension); } - if (!compat.gles) { - WRITE(p, "#define lowp\n"); - WRITE(p, "#define mediump\n"); - WRITE(p, "#define highp\n"); - } else { - WRITE(p, "precision lowp float;\n"); - } - - WRITE(p, "#define splat3(x) vec3(x)\n"); } + ShaderWriter p(buffer, compat, ShaderStage::Fragment, gl_exts.data(), gl_exts.size()); + bool lmode = id.Bit(FS_BIT_LMODE); bool doTexture = id.Bit(FS_BIT_DO_TEXTURE); bool enableFog = id.Bit(FS_BIT_ENABLE_FOG); diff --git a/GPU/Common/FramebufferManagerCommon.h b/GPU/Common/FramebufferManagerCommon.h index ab92f4df23..ca3b69f5cb 100644 --- a/GPU/Common/FramebufferManagerCommon.h +++ b/GPU/Common/FramebufferManagerCommon.h @@ -424,4 +424,9 @@ protected: FBO_OLD_AGE = 5, FBO_OLD_USAGE_FLAG = 15, }; + + // Thin3D stuff for reinterpreting image data between the various 16-bit formats. + // Safe, not optimal - there might be input attachment tricks, etc, but we can't use them + // since we don't want N different implementations. + Draw::Pipeline *reinterpretFromTo_[3][3]; }; diff --git a/GPU/Common/ShaderCommon.h b/GPU/Common/ShaderCommon.h index 34594dfba7..e238bd9dc6 100644 --- a/GPU/Common/ShaderCommon.h +++ b/GPU/Common/ShaderCommon.h @@ -52,6 +52,11 @@ enum DebugShaderStringType { SHADER_STRING_STATS = 2, }; +enum class ShaderStage { + Vertex, + Fragment +}; + // Shared between the backends. Not all are necessarily used by each backend, but this lets us share // more code than before. enum : uint64_t { diff --git a/GPU/Common/ShaderWriter.cpp b/GPU/Common/ShaderWriter.cpp new file mode 100644 index 0000000000..5251515352 --- /dev/null +++ b/GPU/Common/ShaderWriter.cpp @@ -0,0 +1,118 @@ +#include "GPU/Common/ShaderWriter.h" + +const char *vulkan_glsl_preamble_fs = +"#version 450\n" +"#extension GL_ARB_separate_shader_objects : enable\n" +"#extension GL_ARB_shading_language_420pack : enable\n" +"#extension GL_ARB_conservative_depth : enable\n" +"#extension GL_ARB_shader_image_load_store : enable\n" +"#define splat3(x) vec3(x)\n" +"#define lowp\n" +"#define mediump\n" +"#define highp\n" +"#define DISCARD discard\n" +"\n"; + +const char *hlsl_preamble_fs = +"#define vec2 float2\n" +"#define vec3 float3\n" +"#define vec4 float4\n" +"#define uvec3 uint3\n" +"#define ivec3 int3\n" +"#define ivec4 int4\n" +"#define mat4 float4x4\n" +"#define mat3x4 float4x3\n" // note how the conventions are backwards +"#define splat3(x) float3(x, x, x)\n" +"#define mix lerp\n" +"#define mod(x, y) fmod(x, y)\n"; + +const char *hlsl_d3d11_preamble_fs = +"#define DISCARD discard\n" +"#define DISCARD_BELOW(x) clip(x);\n"; +const char *hlsl_d3d9_preamble_fs = +"#define DISCARD clip(-1)\n" +"#define DISCARD_BELOW(x) clip(x)\n"; + +const char *vulkan_glsl_preamble_vs = +"#version 450\n" +"#extension GL_ARB_separate_shader_objects : enable\n" +"#extension GL_ARB_shading_language_420pack : enable\n" +"#define mul(x, y) ((x) * (y))\n" +"#define splat3(x) vec3(x)\n" +"#define lowp\n" +"#define mediump\n" +"#define highp\n" +"\n"; + +const char *hlsl_preamble_vs = +"#define vec2 float2\n" +"#define vec3 float3\n" +"#define vec4 float4\n" +"#define ivec2 int2\n" +"#define ivec4 int4\n" +"#define mat4 float4x4\n" +"#define mat3x4 float4x3\n" // note how the conventions are backwards +"#define splat3(x) vec3(x, x, x)\n" +"#define lowp\n" +"#define mediump\n" +"#define highp\n" +"\n"; + +// Unsafe. But doesn't matter, we'll use big buffers for shader gen. +void ShaderWriter::W(char *format, ...) { + va_list args; + va_start(args, format); + p_ += vsprintf(p_, format, args); + va_end(args); +} + +void ShaderWriter::Preamble(const char **gl_extensions, size_t num_gl_extensions) { + switch (lang_.shaderLanguage) { + case GLSL_VULKAN: + switch (stage_) { + case ShaderStage::Vertex: + W(vulkan_glsl_preamble_vs); + break; + case ShaderStage::Fragment: + W(vulkan_glsl_preamble_fs); + break; + } + break; + case HLSL_D3D11: + case HLSL_D3D9: + switch (stage_) { + case ShaderStage::Vertex: + W(hlsl_preamble_vs); + break; + case ShaderStage::Fragment: + W(hlsl_preamble_fs); + if (lang_.shaderLanguage == HLSL_D3D9) { + W(hlsl_d3d9_preamble_fs); + } else { + W(hlsl_d3d11_preamble_fs); + } + break; + } + break; + default: // OpenGL + W("#version %d%s\n", lang_.glslVersionNumber, lang_.gles && lang_.glslES30 ? " es" : ""); + switch (stage_) { + case ShaderStage::Fragment: + W("#define DISCARD discard\n"); + if (lang_.gles) { + W("precision lowp float;\n"); + } + break; + } + for (size_t i = 0; i < num_gl_extensions; i++) { + W("%s\n", gl_extensions[i]); + } + if (!lang_.gles) { + W("#define lowp\n"); + W("#define mediump\n"); + W("#define highp\n"); + } + W("#define splat3(x) vec3(x)\n"); + break; + } +} diff --git a/GPU/Common/ShaderWriter.h b/GPU/Common/ShaderWriter.h new file mode 100644 index 0000000000..25f24e8e5d --- /dev/null +++ b/GPU/Common/ShaderWriter.h @@ -0,0 +1,46 @@ +#pragma once + +#include "Common/Log.h" +#include "GPU/ge_constants.h" +#include "GPU/GPUCommon.h" +#include "GPU/Common/ShaderCommon.h" + +// Helps generate a shader compatible with all backends. +// Using #defines and magic in this class, we partially define our own shader language that basically looks +// like GLSL, but has a few little oddities like splat3. + +class ShaderWriter { +public: + ShaderWriter(char *buffer, const ShaderLanguageDesc &lang, ShaderStage stage, const char **gl_extensions, size_t num_gl_extensions) : p_(buffer), lang_(lang), stage_(stage) { + Preamble(gl_extensions, num_gl_extensions); + } + + // Assumes the input is zero-terminated. + template + void W(const char(&text)[T]) { + memcpy(p_, text, T); + p_ += T; + } + void W(const char *text) { + size_t len = strlen(text); + memcpy(p_, text, len + 1); + p_ += len; + } + + // Formats into the buffer. + void W(char *format, ...); + + // void BeginMain(); + // void EndMain(); + + char *GetPos() { + return p_; + } + +private: + void Preamble(const char **gl_extensions, size_t num_gl_extensions); + + char *p_; + const ShaderLanguageDesc &lang_; + const ShaderStage stage_; +}; diff --git a/GPU/Common/VertexShaderGenerator.cpp b/GPU/Common/VertexShaderGenerator.cpp index 598c0ddbb8..ba45b4c555 100644 --- a/GPU/Common/VertexShaderGenerator.cpp +++ b/GPU/Common/VertexShaderGenerator.cpp @@ -122,30 +122,8 @@ static const char * const boneWeightDecl[9] = { "layout(location = 3) in vec4 w1;\nlayout(location = 4) in vec4 w2;\n", }; -const char *vulkan_glsl_preamble_vs = -"#version 450\n" -"#extension GL_ARB_separate_shader_objects : enable\n" -"#extension GL_ARB_shading_language_420pack : enable\n" -"#define mul(x, y) ((x) * (y))\n" -"#define splat3(x) vec3(x)\n" -"#define lowp\n" -"#define mediump\n" -"#define highp\n" -"\n"; - -const char *hlsl_preamble_vs = -"#define vec2 float2\n" -"#define vec3 float3\n" -"#define vec4 float4\n" -"#define ivec2 int2\n" -"#define ivec4 int4\n" -"#define mat4 float4x4\n" -"#define mat3x4 float4x3\n" // note how the conventions are backwards -"#define splat3(x) vec3(x, x, x)\n" -"#define lowp\n" -"#define mediump\n" -"#define highp\n" -"\n"; +extern const char *vulkan_glsl_preamble_vs; +extern const char *hlsl_preamble_vs; bool GenerateVertexShader(const VShaderID &id, char *buffer, const ShaderLanguageDesc &compat, uint32_t *attrMask, uint64_t *uniformMask, std::string *errorString) { *attrMask = 0; diff --git a/GPU/GPU.vcxproj b/GPU/GPU.vcxproj index 675602d6d5..bb7bb6980f 100644 --- a/GPU/GPU.vcxproj +++ b/GPU/GPU.vcxproj @@ -351,6 +351,7 @@ + @@ -488,6 +489,7 @@ + diff --git a/GPU/GPU.vcxproj.filters b/GPU/GPU.vcxproj.filters index 509e962588..c19594763f 100644 --- a/GPU/GPU.vcxproj.filters +++ b/GPU/GPU.vcxproj.filters @@ -270,6 +270,9 @@ Common + + Common + @@ -539,5 +542,8 @@ Common + + Common + \ No newline at end of file From 0292d1719dc721c427b2cb62896655251cc11799 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Mon, 2 Nov 2020 09:21:29 +0100 Subject: [PATCH 176/275] GEDebugger: Use utf-8 internally. --- Common/Data/Encoding/Utf8.cpp | 6 +++ Common/Data/Encoding/Utf8.h | 1 + GPU/Common/ShaderWriter.cpp | 6 +++ GPU/Common/VertexShaderGenerator.cpp | 30 +++--------- Windows/GEDebugger/GEDebugger.cpp | 68 ++++++++++++++++------------ Windows/GEDebugger/GEDebugger.h | 8 ++-- 6 files changed, 62 insertions(+), 57 deletions(-) diff --git a/Common/Data/Encoding/Utf8.cpp b/Common/Data/Encoding/Utf8.cpp index 8e3bb0f05d..f3c2b1e223 100644 --- a/Common/Data/Encoding/Utf8.cpp +++ b/Common/Data/Encoding/Utf8.cpp @@ -450,6 +450,12 @@ void ConvertUTF8ToWString(wchar_t *dest, size_t destSize, const std::string &sou MultiByteToWideChar(CP_UTF8, 0, source.c_str(), len, dest, std::min((int)destSize, size)); } +void ConvertUTF8ToWString(wchar_t *dest, size_t destSize, const char *source) { + int len = (int)strlen(source) + 1; // include trailing zero + int size = (int)MultiByteToWideChar(CP_UTF8, 0, source, len, NULL, 0); + MultiByteToWideChar(CP_UTF8, 0, source, len, dest, std::min((int)destSize, size)); +} + std::wstring ConvertUTF8ToWString(const std::string &source) { int len = (int)source.size(); int size = (int)MultiByteToWideChar(CP_UTF8, 0, source.c_str(), len, NULL, 0); diff --git a/Common/Data/Encoding/Utf8.h b/Common/Data/Encoding/Utf8.h index 9d04a788a0..b954ef5371 100644 --- a/Common/Data/Encoding/Utf8.h +++ b/Common/Data/Encoding/Utf8.h @@ -83,6 +83,7 @@ bool UTF8StringHasNonASCII(const char *utf8string); std::string ConvertWStringToUTF8(const std::wstring &wstr); std::string ConvertWStringToUTF8(const wchar_t *wstr); void ConvertUTF8ToWString(wchar_t *dest, size_t destSize, const std::string &source); +void ConvertUTF8ToWString(wchar_t *dest, size_t destSize, const char *source); std::wstring ConvertUTF8ToWString(const std::string &source); #else diff --git a/GPU/Common/ShaderWriter.cpp b/GPU/Common/ShaderWriter.cpp index 5251515352..f4db37f53e 100644 --- a/GPU/Common/ShaderWriter.cpp +++ b/GPU/Common/ShaderWriter.cpp @@ -103,6 +103,11 @@ void ShaderWriter::Preamble(const char **gl_extensions, size_t num_gl_extensions W("precision lowp float;\n"); } break; + case ShaderStage::Vertex: + if (lang_.gles) { + W("precision highp float;\n"); + } + break; } for (size_t i = 0; i < num_gl_extensions; i++) { W("%s\n", gl_extensions[i]); @@ -113,6 +118,7 @@ void ShaderWriter::Preamble(const char **gl_extensions, size_t num_gl_extensions W("#define highp\n"); } W("#define splat3(x) vec3(x)\n"); + W("#define mul(x, y) ((x) * (y))\n"); break; } } diff --git a/GPU/Common/VertexShaderGenerator.cpp b/GPU/Common/VertexShaderGenerator.cpp index ba45b4c555..634d9b7e6b 100644 --- a/GPU/Common/VertexShaderGenerator.cpp +++ b/GPU/Common/VertexShaderGenerator.cpp @@ -26,12 +26,13 @@ #include "GPU/GPUState.h" #include "GPU/Common/ShaderId.h" #include "GPU/Common/ShaderUniforms.h" +#include "GPU/Common/ShaderWriter.h" #include "GPU/Common/VertexDecoderCommon.h" #include "GPU/Common/VertexShaderGenerator.h" #undef WRITE -#define WRITE p+=sprintf +#define WRITE(p, ...) p.W(__VA_ARGS__) static const char * const boneWeightAttrDecl[9] = { "#ERROR#", @@ -132,32 +133,13 @@ bool GenerateVertexShader(const VShaderID &id, char *buffer, const ShaderLanguag bool highpFog = false; bool highpTexcoord = false; - char *p = buffer; - if (compat.shaderLanguage == GLSL_VULKAN) { - WRITE(p, "%s", vulkan_glsl_preamble_vs); - } else if (compat.shaderLanguage == HLSL_D3D11 || compat.shaderLanguage == HLSL_D3D9) { - WRITE(p, "%s", hlsl_preamble_vs); - } else if (ShaderLanguageIsOpenGL(compat.shaderLanguage)) { - if (compat.gles) { - // PowerVR needs highp to do the fog in MHU correctly. - // Others don't, and some can't handle highp in the fragment shader. - highpFog = (gl_extensions.bugs & BUG_PVR_SHADER_PRECISION_BAD) ? true : false; - highpTexcoord = highpFog; - } - WRITE(p, "#version %d%s\n", compat.glslVersionNumber, compat.gles && compat.glslES30 ? " es" : ""); + std::vector gl_exts; + if (ShaderLanguageIsOpenGL(compat.shaderLanguage)) { if (gl_extensions.EXT_gpu_shader4) { - WRITE(p, "#extension GL_EXT_gpu_shader4 : enable\n"); + gl_exts.push_back("#extension GL_EXT_gpu_shader4 : enable"); } - if (compat.gles) { - WRITE(p, "precision highp float;\n"); - } else { - WRITE(p, "#define lowp\n"); - WRITE(p, "#define mediump\n"); - WRITE(p, "#define highp\n"); - } - WRITE(p, "#define splat3(x) vec3(x)\n"); - WRITE(p, "#define mul(x, y) ((x) * (y))\n"); } + ShaderWriter p(buffer, compat, ShaderStage::Vertex, gl_exts.data(), gl_exts.size()); bool isModeThrough = id.Bit(VS_BIT_IS_THROUGH); bool lmode = id.Bit(VS_BIT_LMODE); diff --git a/Windows/GEDebugger/GEDebugger.cpp b/Windows/GEDebugger/GEDebugger.cpp index affeb1c6d4..16d293776d 100644 --- a/Windows/GEDebugger/GEDebugger.cpp +++ b/Windows/GEDebugger/GEDebugger.cpp @@ -21,6 +21,7 @@ #include #include "Common/Data/Text/Parsers.h" +#include "Common/Data/Encoding/Utf8.h" #include "Common/ColorConv.h" #include "Common/StringUtils.h" #include "Core/Config.h" @@ -274,10 +275,10 @@ void CGEDebugger::SetupPreviews() { } } -void CGEDebugger::DescribePrimaryPreview(const GPUgstate &state, wchar_t desc[256]) { +void CGEDebugger::DescribePrimaryPreview(const GPUgstate &state, char desc[256]) { if (showClut_) { // In this case, we're showing the texture here. - _snwprintf(desc, 256, L"Texture L%d: 0x%08x (%dx%d)", textureLevel_, state.getTextureAddress(textureLevel_), state.getTextureWidth(textureLevel_), state.getTextureHeight(textureLevel_)); + snprintf(desc, 256, "Texture L%d: 0x%08x (%dx%d)", textureLevel_, state.getTextureAddress(textureLevel_), state.getTextureWidth(textureLevel_), state.getTextureHeight(textureLevel_)); return; } @@ -285,24 +286,24 @@ void CGEDebugger::DescribePrimaryPreview(const GPUgstate &state, wchar_t desc[25 switch (PrimaryDisplayType(fbTabs->CurrentTabIndex())) { case PRIMARY_FRAMEBUF: - _snwprintf(desc, 256, L"Color: 0x%08x (%dx%d) fmt %s", state.getFrameBufRawAddress(), primaryBuffer_->GetStride(), primaryBuffer_->GetHeight(), GeBufferFormatToString(state.FrameBufFormat())); + snprintf(desc, 256, "Color: 0x%08x (%dx%d) fmt %s", state.getFrameBufRawAddress(), primaryBuffer_->GetStride(), primaryBuffer_->GetHeight(), GeBufferFormatToString(state.FrameBufFormat())); break; case PRIMARY_DEPTHBUF: - _snwprintf(desc, 256, L"Depth: 0x%08x (%dx%d)", state.getDepthBufRawAddress(), primaryBuffer_->GetStride(), primaryBuffer_->GetHeight()); + snprintf(desc, 256, "Depth: 0x%08x (%dx%d)", state.getDepthBufRawAddress(), primaryBuffer_->GetStride(), primaryBuffer_->GetHeight()); break; case PRIMARY_STENCILBUF: - _snwprintf(desc, 256, L"Stencil: 0x%08x (%dx%d)", state.getFrameBufRawAddress(), primaryBuffer_->GetStride(), primaryBuffer_->GetHeight()); + snprintf(desc, 256, "Stencil: 0x%08x (%dx%d)", state.getFrameBufRawAddress(), primaryBuffer_->GetStride(), primaryBuffer_->GetHeight()); break; } } -void CGEDebugger::DescribeSecondPreview(const GPUgstate &state, wchar_t desc[256]) { +void CGEDebugger::DescribeSecondPreview(const GPUgstate &state, char desc[256]) { if (showClut_) { - _snwprintf(desc, 256, L"CLUT: 0x%08x (%d)", state.getClutAddress(), state.getClutPaletteFormat()); + snprintf(desc, 256, "CLUT: 0x%08x (%d)", state.getClutAddress(), state.getClutPaletteFormat()); } else { - _snwprintf(desc, 256, L"Texture L%d: 0x%08x (%dx%d)", textureLevel_, state.getTextureAddress(textureLevel_), state.getTextureWidth(textureLevel_), state.getTextureHeight(textureLevel_)); + snprintf(desc, 256, "Texture L%d: 0x%08x (%dx%d)", textureLevel_, state.getTextureAddress(textureLevel_), state.getTextureWidth(textureLevel_), state.getTextureHeight(textureLevel_)); } } @@ -414,9 +415,12 @@ void CGEDebugger::UpdatePrimaryPreview(const GPUgstate &state) { primaryWindow->SetFlags(flags); primaryWindow->Draw(primaryBuffer_->GetData(), primaryBuffer_->GetStride(), primaryBuffer_->GetHeight(), primaryBuffer_->GetFlipped(), fmt); - wchar_t desc[256]; + char desc[256]; + wchar_t w_desc[256]; DescribePrimaryPreview(state, desc); - SetDlgItemText(m_hDlg, IDC_GEDBG_FRAMEBUFADDR, desc); + ConvertUTF8ToWString(w_desc, ARRAY_SIZE(w_desc), desc); + + SetDlgItemText(m_hDlg, IDC_GEDBG_FRAMEBUFADDR, w_desc); } else if (primaryWindow != nullptr) { primaryWindow->Clear(); primaryBuffer_ = nullptr; @@ -452,9 +456,11 @@ void CGEDebugger::UpdateSecondPreview(const GPUgstate &state) { secondWindow->Draw(secondBuffer_->GetData(), secondBuffer_->GetStride(), secondBuffer_->GetHeight(), secondBuffer_->GetFlipped(), fmt); } - wchar_t desc[256]; + char desc[256]; DescribeSecondPreview(state, desc); - SetDlgItemText(m_hDlg, IDC_GEDBG_TEXADDR, desc); + wchar_t w_desc[256]; + ConvertUTF8ToWString(w_desc, ARRAY_SIZE(w_desc), desc); + SetDlgItemText(m_hDlg, IDC_GEDBG_TEXADDR, w_desc); } else if (secondWindow != nullptr) { secondWindow->Clear(); secondBuffer_ = nullptr; @@ -474,7 +480,7 @@ void CGEDebugger::PrimaryPreviewHover(int x, int y) { SetupPreviews(); - wchar_t desc[256] = {0}; + char desc[256] = {0}; if (!primaryWindow->HasTex()) { desc[0] = 0; @@ -491,7 +497,10 @@ void CGEDebugger::PrimaryPreviewHover(int x, int y) { DescribePixel(pix, primaryBuffer_->GetFormat(), x, y, desc); } - SetDlgItemText(m_hDlg, IDC_GEDBG_FRAMEBUFADDR, desc); + wchar_t w_desc[256]; + ConvertUTF8ToWString(w_desc, ARRAY_SIZE(w_desc), desc); + + SetDlgItemText(m_hDlg, IDC_GEDBG_FRAMEBUFADDR, w_desc); } void CGEDebugger::SecondPreviewHover(int x, int y) { @@ -499,7 +508,7 @@ void CGEDebugger::SecondPreviewHover(int x, int y) { return; } - wchar_t desc[256] = {0}; + char desc[256] = {0}; if (!secondWindow->HasTex()) { desc[0] = 0; @@ -519,11 +528,12 @@ void CGEDebugger::SecondPreviewHover(int x, int y) { DescribePixel(pix, secondBuffer_->GetFormat(), x, y, desc); } } - - SetDlgItemText(m_hDlg, IDC_GEDBG_TEXADDR, desc); + wchar_t w_desc[256]; + ConvertUTF8ToWString(w_desc, ARRAY_SIZE(w_desc), desc); + SetDlgItemText(m_hDlg, IDC_GEDBG_TEXADDR, w_desc); } -void CGEDebugger::DescribePixel(u32 pix, GPUDebugBufferFormat fmt, int x, int y, wchar_t desc[256]) { +void CGEDebugger::DescribePixel(u32 pix, GPUDebugBufferFormat fmt, int x, int y, char desc[256]) { switch (fmt) { case GPU_DBG_FORMAT_565: case GPU_DBG_FORMAT_565_REV: @@ -539,18 +549,18 @@ void CGEDebugger::DescribePixel(u32 pix, GPUDebugBufferFormat fmt, int x, int y, break; case GPU_DBG_FORMAT_16BIT: - _snwprintf(desc, 256, L"%d,%d: %d / %f", x, y, pix, pix * (1.0f / 65535.0f)); + snprintf(desc, 256, "%d,%d: %d / %f", x, y, pix, pix * (1.0f / 65535.0f)); break; case GPU_DBG_FORMAT_8BIT: - _snwprintf(desc, 256, L"%d,%d: %d / %f", x, y, pix, pix * (1.0f / 255.0f)); + snprintf(desc, 256, "%d,%d: %d / %f", x, y, pix, pix * (1.0f / 255.0f)); break; case GPU_DBG_FORMAT_24BIT_8X: { DepthScaleFactors depthScale = GetDepthScaleFactors(); // These are only ever going to be depth values, so let's also show scaled to 16 bit. - _snwprintf(desc, 256, L"%d,%d: %d / %f / %f", x, y, pix & 0x00FFFFFF, (pix & 0x00FFFFFF) * (1.0f / 16777215.0f), depthScale.Apply((pix & 0x00FFFFFF) * (1.0f / 16777215.0f))); + snprintf(desc, 256, "%d,%d: %d / %f / %f", x, y, pix & 0x00FFFFFF, (pix & 0x00FFFFFF) * (1.0f / 16777215.0f), depthScale.Apply((pix & 0x00FFFFFF) * (1.0f / 16777215.0f))); break; } @@ -559,18 +569,18 @@ void CGEDebugger::DescribePixel(u32 pix, GPUDebugBufferFormat fmt, int x, int y, // These are only ever going to be depth values, so let's also show scaled to 16 bit. int z24 = pix & 0x00FFFFFF; int z16 = z24 - 0x800000 + 0x8000; - _snwprintf(desc, 256, L"%d,%d: %d / %f", x, y, z16, z16 * (1.0f / 65535.0f)); + snprintf(desc, 256, "%d,%d: %d / %f", x, y, z16, z16 * (1.0f / 65535.0f)); } break; case GPU_DBG_FORMAT_24X_8BIT: - _snwprintf(desc, 256, L"%d,%d: %d / %f", x, y, (pix >> 24) & 0xFF, ((pix >> 24) & 0xFF) * (1.0f / 255.0f)); + snprintf(desc, 256, "%d,%d: %d / %f", x, y, (pix >> 24) & 0xFF, ((pix >> 24) & 0xFF) * (1.0f / 255.0f)); break; case GPU_DBG_FORMAT_FLOAT: { float pixf = *(float *)&pix; DepthScaleFactors depthScale = GetDepthScaleFactors(); - _snwprintf(desc, 256, L"%d,%d: %f / %f", x, y, pixf, depthScale.Apply(pixf)); + snprintf(desc, 256, "%d,%d: %f / %f", x, y, pixf, depthScale.Apply(pixf)); break; } @@ -585,16 +595,16 @@ void CGEDebugger::DescribePixel(u32 pix, GPUDebugBufferFormat fmt, int x, int y, int z16_2 = factors.Apply(z); - _snwprintf(desc, 256, L"%d,%d: %d / %f", x, y, z16, (z - 0.5 + (1.0 / 512.0)) * 256.0); + snprintf(desc, 256, "%d,%d: %d / %f", x, y, z16, (z - 0.5 + (1.0 / 512.0)) * 256.0); } break; default: - _snwprintf(desc, 256, L"Unexpected format"); + snprintf(desc, 256, "Unexpected format"); } } -void CGEDebugger::DescribePixelRGBA(u32 pix, GPUDebugBufferFormat fmt, int x, int y, wchar_t desc[256]) { +void CGEDebugger::DescribePixelRGBA(u32 pix, GPUDebugBufferFormat fmt, int x, int y, char desc[256]) { u32 r = -1, g = -1, b = -1, a = -1; switch (fmt) { @@ -658,11 +668,11 @@ void CGEDebugger::DescribePixelRGBA(u32 pix, GPUDebugBufferFormat fmt, int x, in break; default: - _snwprintf(desc, 256, L"Unexpected format"); + snprintf(desc, 256, "Unexpected format"); return; } - _snwprintf(desc, 256, L"%d,%d: r=%d, g=%d, b=%d, a=%d", x, y, r, g, b, a); + snprintf(desc, 256, "%d,%d: r=%d, g=%d, b=%d, a=%d", x, y, r, g, b, a); } void CGEDebugger::UpdateTextureLevel(int level) { diff --git a/Windows/GEDebugger/GEDebugger.h b/Windows/GEDebugger/GEDebugger.h index f1e23f1f75..9202c85fad 100644 --- a/Windows/GEDebugger/GEDebugger.h +++ b/Windows/GEDebugger/GEDebugger.h @@ -76,13 +76,13 @@ private: void UpdateSize(WORD width, WORD height); void SavePosition(); void UpdateTextureLevel(int level); - void DescribePrimaryPreview(const GPUgstate &state, wchar_t desc[256]); - void DescribeSecondPreview(const GPUgstate &state, wchar_t desc[256]); + void DescribePrimaryPreview(const GPUgstate &state, char desc[256]); + void DescribeSecondPreview(const GPUgstate &state, char desc[256]); void PrimaryPreviewHover(int x, int y); void SecondPreviewHover(int x, int y); void PreviewExport(const GPUDebugBuffer *buffer); - void DescribePixel(u32 pix, GPUDebugBufferFormat fmt, int x, int y, wchar_t desc[256]); - void DescribePixelRGBA(u32 pix, GPUDebugBufferFormat fmt, int x, int y, wchar_t desc[256]); + void DescribePixel(u32 pix, GPUDebugBufferFormat fmt, int x, int y, char desc[256]); + void DescribePixelRGBA(u32 pix, GPUDebugBufferFormat fmt, int x, int y, char desc[256]); u32 TexturePreviewFlags(const GPUgstate &state); From 97e8d5b93bf1171ee7d2b02d3e2e030ecd484a76 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Mon, 2 Nov 2020 10:37:11 +0100 Subject: [PATCH 177/275] Buildfix the rest of the platforms --- CMakeLists.txt | 2 ++ GPU/Common/ShaderWriter.h | 2 +- UWP/GPU_UWP/GPU_UWP.vcxproj | 2 ++ UWP/GPU_UWP/GPU_UWP.vcxproj.filters | 2 ++ android/jni/Android.mk | 1 + libretro/Makefile.common | 1 + 6 files changed, 9 insertions(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index dad85680cb..8f9f5ee4e1 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1356,6 +1356,8 @@ set(GPU_SOURCES GPU/Common/ShaderUniforms.h GPU/Common/ShaderCommon.cpp GPU/Common/ShaderCommon.h + GPU/Common/ShaderWriter.cpp + GPU/Common/ShaderWriter.h GPU/Common/ShaderTranslation.cpp GPU/Common/ShaderTranslation.h GPU/Common/SplineCommon.cpp diff --git a/GPU/Common/ShaderWriter.h b/GPU/Common/ShaderWriter.h index 25f24e8e5d..757c76fa46 100644 --- a/GPU/Common/ShaderWriter.h +++ b/GPU/Common/ShaderWriter.h @@ -28,7 +28,7 @@ public: } // Formats into the buffer. - void W(char *format, ...); + void W(const char *format, ...); // void BeginMain(); // void EndMain(); diff --git a/UWP/GPU_UWP/GPU_UWP.vcxproj b/UWP/GPU_UWP/GPU_UWP.vcxproj index d5b5d3167e..aef600ae34 100644 --- a/UWP/GPU_UWP/GPU_UWP.vcxproj +++ b/UWP/GPU_UWP/GPU_UWP.vcxproj @@ -392,6 +392,7 @@ + @@ -449,6 +450,7 @@ + diff --git a/UWP/GPU_UWP/GPU_UWP.vcxproj.filters b/UWP/GPU_UWP/GPU_UWP.vcxproj.filters index 12f33ec3af..c1e17c829d 100644 --- a/UWP/GPU_UWP/GPU_UWP.vcxproj.filters +++ b/UWP/GPU_UWP/GPU_UWP.vcxproj.filters @@ -57,6 +57,7 @@ + @@ -114,5 +115,6 @@ + \ No newline at end of file diff --git a/android/jni/Android.mk b/android/jni/Android.mk index 71e6915927..4498059207 100644 --- a/android/jni/Android.mk +++ b/android/jni/Android.mk @@ -318,6 +318,7 @@ EXEC_AND_LIB_FILES := \ $(SRC)/GPU/Common/TextureCacheCommon.cpp.arm \ $(SRC)/GPU/Common/TextureScalerCommon.cpp.arm \ $(SRC)/GPU/Common/ShaderCommon.cpp \ + $(SRC)/GPU/Common/ShaderWriter.cpp \ $(SRC)/GPU/Common/ShaderTranslation.cpp \ $(SRC)/GPU/Common/StencilCommon.cpp \ $(SRC)/GPU/Common/SplineCommon.cpp.arm \ diff --git a/libretro/Makefile.common b/libretro/Makefile.common index 3120c903c8..bd03911b48 100644 --- a/libretro/Makefile.common +++ b/libretro/Makefile.common @@ -236,6 +236,7 @@ SOURCES_CXX += \ $(GPUCOMMONDIR)/ShaderCommon.cpp \ $(GPUCOMMONDIR)/ShaderUniforms.cpp \ $(GPUCOMMONDIR)/ShaderTranslation.cpp \ + $(GPUCOMMONDIR)/ShaderWriter.cpp \ $(GPUCOMMONDIR)/GPUDebugInterface.cpp \ $(GPUCOMMONDIR)/DepalettizeShaderCommon.cpp \ $(GPUCOMMONDIR)/TransformCommon.cpp \ From ce4ee010ac10017732398e1f33a4156664ccc4a9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Mon, 2 Nov 2020 11:45:47 +0100 Subject: [PATCH 178/275] Apparently only MSVC can handle the ambiguity. --- GPU/Common/FragmentShaderGenerator.cpp | 2 +- GPU/Common/ShaderWriter.cpp | 22 +++++++++++----------- GPU/Common/ShaderWriter.h | 11 ++++++++--- GPU/Common/VertexShaderGenerator.cpp | 2 +- assets/lang | 2 +- 5 files changed, 22 insertions(+), 17 deletions(-) diff --git a/GPU/Common/FragmentShaderGenerator.cpp b/GPU/Common/FragmentShaderGenerator.cpp index 612d9f6c7d..cb55b2ad35 100644 --- a/GPU/Common/FragmentShaderGenerator.cpp +++ b/GPU/Common/FragmentShaderGenerator.cpp @@ -31,7 +31,7 @@ #include "GPU/ge_constants.h" #include "GPU/GPUState.h" -#define WRITE(p, ...) p.W(__VA_ARGS__) +#define WRITE(p, ...) p.F(__VA_ARGS__) bool GenerateFragmentShader(const FShaderID &id, char *buffer, const ShaderLanguageDesc &compat, uint64_t *uniformMask, std::string *errorString) { *uniformMask = 0; diff --git a/GPU/Common/ShaderWriter.cpp b/GPU/Common/ShaderWriter.cpp index f4db37f53e..323bd3b86c 100644 --- a/GPU/Common/ShaderWriter.cpp +++ b/GPU/Common/ShaderWriter.cpp @@ -59,7 +59,7 @@ const char *hlsl_preamble_vs = "\n"; // Unsafe. But doesn't matter, we'll use big buffers for shader gen. -void ShaderWriter::W(char *format, ...) { +void ShaderWriter::F(const char *format, ...) { va_list args; va_start(args, format); p_ += vsprintf(p_, format, args); @@ -95,30 +95,30 @@ void ShaderWriter::Preamble(const char **gl_extensions, size_t num_gl_extensions } break; default: // OpenGL - W("#version %d%s\n", lang_.glslVersionNumber, lang_.gles && lang_.glslES30 ? " es" : ""); + F("#version %d%s\n", lang_.glslVersionNumber, lang_.gles && lang_.glslES30 ? " es" : ""); switch (stage_) { case ShaderStage::Fragment: - W("#define DISCARD discard\n"); + C("#define DISCARD discard\n"); if (lang_.gles) { - W("precision lowp float;\n"); + C("precision lowp float;\n"); } break; case ShaderStage::Vertex: if (lang_.gles) { - W("precision highp float;\n"); + C("precision highp float;\n"); } break; } for (size_t i = 0; i < num_gl_extensions; i++) { - W("%s\n", gl_extensions[i]); + F("%s\n", gl_extensions[i]); } if (!lang_.gles) { - W("#define lowp\n"); - W("#define mediump\n"); - W("#define highp\n"); + C("#define lowp\n"); + C("#define mediump\n"); + C("#define highp\n"); } - W("#define splat3(x) vec3(x)\n"); - W("#define mul(x, y) ((x) * (y))\n"); + C("#define splat3(x) vec3(x)\n"); + C("#define mul(x, y) ((x) * (y))\n"); break; } } diff --git a/GPU/Common/ShaderWriter.h b/GPU/Common/ShaderWriter.h index 757c76fa46..1d670be780 100644 --- a/GPU/Common/ShaderWriter.h +++ b/GPU/Common/ShaderWriter.h @@ -15,20 +15,25 @@ public: Preamble(gl_extensions, num_gl_extensions); } + // I tried to call all three write functions "W", but only MSVC + // managed to disentangle the ambiguities, so had to give up on that. + // Assumes the input is zero-terminated. + // C : Copies a buffer directly to the stream. template - void W(const char(&text)[T]) { + void C(const char(&text)[T]) { memcpy(p_, text, T); p_ += T; } + // W: Writes a zero-terminated string to the stream. void W(const char *text) { size_t len = strlen(text); memcpy(p_, text, len + 1); p_ += len; } - // Formats into the buffer. - void W(const char *format, ...); + // F: Formats into the buffer. + void F(const char *format, ...); // void BeginMain(); // void EndMain(); diff --git a/GPU/Common/VertexShaderGenerator.cpp b/GPU/Common/VertexShaderGenerator.cpp index 634d9b7e6b..da781e111a 100644 --- a/GPU/Common/VertexShaderGenerator.cpp +++ b/GPU/Common/VertexShaderGenerator.cpp @@ -32,7 +32,7 @@ #undef WRITE -#define WRITE(p, ...) p.W(__VA_ARGS__) +#define WRITE(p, ...) p.F(__VA_ARGS__) static const char * const boneWeightAttrDecl[9] = { "#ERROR#", diff --git a/assets/lang b/assets/lang index fd6f5bc01a..d5a2a51942 160000 --- a/assets/lang +++ b/assets/lang @@ -1 +1 @@ -Subproject commit fd6f5bc01afb419eacca538b425c01eb2a055393 +Subproject commit d5a2a51942377820764604d9bb424fa9a879c4bd From 21830d4984e63b5495393eed774a48a6a1986455 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Mon, 2 Nov 2020 16:22:20 +0100 Subject: [PATCH 179/275] Bugfix last commit --- GPU/Common/ShaderWriter.h | 2 +- assets/lang | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/GPU/Common/ShaderWriter.h b/GPU/Common/ShaderWriter.h index 1d670be780..7a060c6732 100644 --- a/GPU/Common/ShaderWriter.h +++ b/GPU/Common/ShaderWriter.h @@ -23,7 +23,7 @@ public: template void C(const char(&text)[T]) { memcpy(p_, text, T); - p_ += T; + p_ += T - 1; } // W: Writes a zero-terminated string to the stream. void W(const char *text) { diff --git a/assets/lang b/assets/lang index d5a2a51942..fd6f5bc01a 160000 --- a/assets/lang +++ b/assets/lang @@ -1 +1 @@ -Subproject commit d5a2a51942377820764604d9bb424fa9a879c4bd +Subproject commit fd6f5bc01afb419eacca538b425c01eb2a055393 From dd7983c8dde37b321c2a69a7e14fead00df595d4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Mon, 2 Nov 2020 23:11:44 +0100 Subject: [PATCH 180/275] Fix a bad check, causing masked memory to fail on non-32-bit platforms even if desired. --- Core/MemMap.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Core/MemMap.cpp b/Core/MemMap.cpp index 69c23c85e5..d027fdd191 100644 --- a/Core/MemMap.cpp +++ b/Core/MemMap.cpp @@ -121,7 +121,7 @@ static MemoryView views[] = static const int num_views = sizeof(views) / sizeof(MemoryView); inline static bool CanIgnoreView(const MemoryView &view) { -#if PPSSPP_ARCH(32BIT) +#ifdef MASKED_PSP_MEMORY // Basically, 32-bit platforms can ignore views that are masked out anyway. return (view.flags & MV_MIRROR_PREVIOUS) && (view.virtual_address & ~MEMVIEW32_MASK) != 0; #else From 1b596ef82bceff977a333a50d2b55087e1d490d0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Tue, 3 Nov 2020 00:13:52 +0100 Subject: [PATCH 181/275] Fix/workaround ARM64 with the MASKED_PSP_MEMORY build flag. --- Core/MIPS/ARM64/Arm64Asm.cpp | 1 + Core/MIPS/ARM64/Arm64CompLoadStore.cpp | 3 +++ Core/MIPS/ARM64/Arm64CompVFPU.cpp | 1 - Core/MIPS/ARM64/Arm64Jit.cpp | 4 ++++ 4 files changed, 8 insertions(+), 1 deletion(-) diff --git a/Core/MIPS/ARM64/Arm64Asm.cpp b/Core/MIPS/ARM64/Arm64Asm.cpp index 99f4dadf65..b95b8e54b4 100644 --- a/Core/MIPS/ARM64/Arm64Asm.cpp +++ b/Core/MIPS/ARM64/Arm64Asm.cpp @@ -16,6 +16,7 @@ // https://github.com/hrydgard/ppsspp and http://www.ppsspp.org/. #include "ppsspp_config.h" + #if PPSSPP_ARCH(ARM64) #include "Common/Log.h" diff --git a/Core/MIPS/ARM64/Arm64CompLoadStore.cpp b/Core/MIPS/ARM64/Arm64CompLoadStore.cpp index ca1aae8a8a..92b241d17d 100644 --- a/Core/MIPS/ARM64/Arm64CompLoadStore.cpp +++ b/Core/MIPS/ARM64/Arm64CompLoadStore.cpp @@ -311,6 +311,7 @@ namespace MIPSComp { case 40: //sb case 41: //sh case 43: //sw +#ifndef MASKED_PSP_MEMORY if (jo.cachePointers && g_Config.bFastMemory) { // ARM has smaller load/store immediate displacements than MIPS, 12 bits - and some memory ops only have 8 bits. int offsetRange = 0x3ff; @@ -327,6 +328,7 @@ namespace MIPSComp { gpr.MapReg(rt, load ? MAP_NOINIT : 0); targetReg = gpr.R(rt); } + switch (o) { case 35: LDR(INDEX_UNSIGNED, targetReg, gpr.RPtr(rs), offset); break; case 37: LDRH(INDEX_UNSIGNED, targetReg, gpr.RPtr(rs), offset); break; @@ -342,6 +344,7 @@ namespace MIPSComp { break; } } +#endif if (!load && gpr.IsImm(rt) && gpr.TryMapTempImm(rt) != INVALID_REG) { // We're storing an immediate value, let's see if we can optimize rt. diff --git a/Core/MIPS/ARM64/Arm64CompVFPU.cpp b/Core/MIPS/ARM64/Arm64CompVFPU.cpp index 6b6e26eca7..d90ed9bce8 100644 --- a/Core/MIPS/ARM64/Arm64CompVFPU.cpp +++ b/Core/MIPS/ARM64/Arm64CompVFPU.cpp @@ -358,7 +358,6 @@ namespace MIPSComp { ADD(SCRATCH1_64, SCRATCH1_64, MEMBASEREG); } } - fp.STP(32, INDEX_SIGNED, fpr.V(vregs[0]), fpr.V(vregs[1]), SCRATCH1_64, 0); fp.STP(32, INDEX_SIGNED, fpr.V(vregs[2]), fpr.V(vregs[3]), SCRATCH1_64, 8); diff --git a/Core/MIPS/ARM64/Arm64Jit.cpp b/Core/MIPS/ARM64/Arm64Jit.cpp index cfdb3d0385..6a518cc976 100644 --- a/Core/MIPS/ARM64/Arm64Jit.cpp +++ b/Core/MIPS/ARM64/Arm64Jit.cpp @@ -100,6 +100,10 @@ Arm64Jit::Arm64Jit(MIPSState *mips) : blocks(mips, this), gpr(mips, &js, &jo), f jo.enablePointerify = false; } +#ifdef MASKED_PSP_MEMORY + jo.enablePointerify = false; +#endif + logBlocks = 0; dontLogBlocks = 0; blocks.Init(); From f050d51973acb80b7a81d3d0cc200e1a8cdd676c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Tue, 3 Nov 2020 00:14:40 +0100 Subject: [PATCH 182/275] Enable masked memory addressing on iOS (removes the need for functioning memory mirrors) I have a theory that this is related to the iOS 14 problems: #13451 --- Core/MemMap.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Core/MemMap.h b/Core/MemMap.h index d5df36cad7..1bd6027c22 100644 --- a/Core/MemMap.h +++ b/Core/MemMap.h @@ -84,7 +84,7 @@ extern u32 g_PSPModel; // UWP has such limited memory management that we need to mask // even in 64-bit mode. Also, when using the sanitizer, we need to mask as well. -#if PPSSPP_ARCH(32BIT) || PPSSPP_PLATFORM(UWP) || USE_ADDRESS_SANITIZER +#if PPSSPP_ARCH(32BIT) || PPSSPP_PLATFORM(UWP) || USE_ADDRESS_SANITIZER || PPSSPP_PLATFORM(IOS) #define MASKED_PSP_MEMORY #endif From 5d0b6e83b2036ad09fc453ac83770a726c7e9a11 Mon Sep 17 00:00:00 2001 From: ANR2ME Date: Tue, 3 Nov 2020 09:31:25 +0700 Subject: [PATCH 183/275] Reducing the delay on GetPeerInfo --- Core/HLE/sceNetAdhoc.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Core/HLE/sceNetAdhoc.cpp b/Core/HLE/sceNetAdhoc.cpp index 2e58a25ead..de1f484b4e 100644 --- a/Core/HLE/sceNetAdhoc.cpp +++ b/Core/HLE/sceNetAdhoc.cpp @@ -2553,7 +2553,7 @@ int sceNetAdhocctlGetPeerInfo(const char *mac, int size, u32 peerInfoAddr) { // Multithreading Unlock peerlock.unlock(); } - hleEatMicro(100); + hleEatMicro(50); return retval; } From 755a5dd7d6b234830a579d21877d396426d2559f Mon Sep 17 00:00:00 2001 From: ANR2ME Date: Tue, 3 Nov 2020 09:32:00 +0700 Subject: [PATCH 184/275] Fix Starting multiplayer issue on DBZ Team Tag --- Core/HLE/sceNetAdhoc.cpp | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/Core/HLE/sceNetAdhoc.cpp b/Core/HLE/sceNetAdhoc.cpp index de1f484b4e..16afedebdd 100644 --- a/Core/HLE/sceNetAdhoc.cpp +++ b/Core/HLE/sceNetAdhoc.cpp @@ -7251,9 +7251,8 @@ int matchingInputThread(int matchingId) // TODO: The MatchingInput thread is usi // Clear IO Message Stack clearStack(context, PSP_ADHOC_MATCHING_INPUT_STACK); - // Send Bye Messages. FIXME: Official prx seems to be sending DEATH instead of BYE packet during MatchingStop? - //sendByePacket(context); - sendDeathPacket(context, &context->mac); + // Send Bye Messages. FIXME: Official prx seems to be sending DEATH instead of BYE packet during MatchingStop? But DEATH packet doesn't works with DBZ Team Tag + sendByePacket(context); // Free Peer List Buffer clearPeerList(context); //deleteAllMembers(context); From f3415f4f9c7988e7757054463cd698efbf982b79 Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Mon, 2 Nov 2020 21:56:43 -0800 Subject: [PATCH 185/275] GPU: Correct shader blend equations. This was wrong when ported to HLSL, and then ported back everywhere. --- GPU/Common/FragmentShaderGenerator.cpp | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/GPU/Common/FragmentShaderGenerator.cpp b/GPU/Common/FragmentShaderGenerator.cpp index cb55b2ad35..676d3b602e 100644 --- a/GPU/Common/FragmentShaderGenerator.cpp +++ b/GPU/Common/FragmentShaderGenerator.cpp @@ -820,11 +820,11 @@ bool GenerateFragmentShader(const FShaderID &id, char *buffer, const ShaderLangu case GE_SRCBLEND_SRCALPHA: srcFactor = "v.aaa"; break; case GE_SRCBLEND_INVSRCALPHA: srcFactor = "splat3(1.0 - v.a)"; break; case GE_SRCBLEND_DSTALPHA: srcFactor = "destColor.aaa"; break; - case GE_SRCBLEND_INVDSTALPHA: srcFactor = "splat3(1.0) - destColor.aaa"; break; + case GE_SRCBLEND_INVDSTALPHA: srcFactor = "(splat3(1.0) - destColor.aaa)"; break; case GE_SRCBLEND_DOUBLESRCALPHA: srcFactor = "v.aaa * 2.0"; break; - case GE_SRCBLEND_DOUBLEINVSRCALPHA: srcFactor = "splat3(1.0) - v.aaa * 2.0"; break; + case GE_SRCBLEND_DOUBLEINVSRCALPHA: srcFactor = "(splat3(1.0) - v.aaa * 2.0)"; break; case GE_SRCBLEND_DOUBLEDSTALPHA: srcFactor = "destColor.aaa * 2.0"; break; - case GE_SRCBLEND_DOUBLEINVDSTALPHA: srcFactor = "splat3(1.0) - destColor.aaa * 2.0"; break; + case GE_SRCBLEND_DOUBLEINVDSTALPHA: srcFactor = "(splat3(1.0) - destColor.aaa * 2.0)"; break; case GE_SRCBLEND_FIXA: srcFactor = "u_blendFixA"; break; default: srcFactor = "u_blendFixA"; break; } @@ -832,13 +832,13 @@ bool GenerateFragmentShader(const FShaderID &id, char *buffer, const ShaderLangu case GE_DSTBLEND_SRCCOLOR: dstFactor = "v.rgb"; break; case GE_DSTBLEND_INVSRCCOLOR: dstFactor = "(splat3(1.0) - v.rgb)"; break; case GE_DSTBLEND_SRCALPHA: dstFactor = "v.aaa"; break; - case GE_DSTBLEND_INVSRCALPHA: dstFactor = "splat3(1.0) - v.aaa"; break; + case GE_DSTBLEND_INVSRCALPHA: dstFactor = "(splat3(1.0) - v.aaa)"; break; case GE_DSTBLEND_DSTALPHA: dstFactor = "destColor.aaa"; break; - case GE_DSTBLEND_INVDSTALPHA: dstFactor = "splat3(1.0) - destColor.aaa"; break; + case GE_DSTBLEND_INVDSTALPHA: dstFactor = "(splat3(1.0) - destColor.aaa)"; break; case GE_DSTBLEND_DOUBLESRCALPHA: dstFactor = "v.aaa * 2.0"; break; - case GE_DSTBLEND_DOUBLEINVSRCALPHA: dstFactor = "splat3(1.0) - v.aaa * 2.0"; break; + case GE_DSTBLEND_DOUBLEINVSRCALPHA: dstFactor = "(splat3(1.0) - v.aaa * 2.0)"; break; case GE_DSTBLEND_DOUBLEDSTALPHA: dstFactor = "destColor.aaa * 2.0"; break; - case GE_DSTBLEND_DOUBLEINVDSTALPHA: dstFactor = "splat3(1.0) - destColor.aaa * 2.0"; break; + case GE_DSTBLEND_DOUBLEINVDSTALPHA: dstFactor = "(splat3(1.0) - destColor.aaa * 2.0)"; break; case GE_DSTBLEND_FIXB: dstFactor = "u_blendFixB"; break; default: dstFactor = "u_blendFixB"; break; } From 3e6d12101617aed9e8f4b849e31d36c039430681 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Tue, 3 Nov 2020 11:32:57 +0100 Subject: [PATCH 186/275] Partially revert "Clarify some logic, improve framebuffer names" I screwed up a couple things. Fixes #13619 This reverts commit 32eb882bc6205f5b488e86bf40076d6fd2fd4e75. --- GPU/Common/TextureCacheCommon.cpp | 14 +++----------- GPU/Common/TextureCacheCommon.h | 1 - GPU/D3D11/TextureCacheD3D11.cpp | 1 - GPU/GLES/TextureCacheGLES.cpp | 8 ++++---- 4 files changed, 7 insertions(+), 17 deletions(-) diff --git a/GPU/Common/TextureCacheCommon.cpp b/GPU/Common/TextureCacheCommon.cpp index fb84f0f6ec..1c5c63cdce 100644 --- a/GPU/Common/TextureCacheCommon.cpp +++ b/GPU/Common/TextureCacheCommon.cpp @@ -471,16 +471,11 @@ TexCacheEntry *TextureCacheCommon::SetTexture() { // No texture found, or changed (depending on entry). // Check for framebuffers. - TextureDefinition def; + TextureDefinition def{}; def.addr = texaddr; def.dim = dim; def.format = format; def.bufw = bufw; - def.swizzled = gstate.isTextureSwizzled(); - - if (texaddr == 0x40cc000) { - texaddr = texaddr; - } std::vector candidates = GetFramebufferCandidates(def, 0); if (candidates.size() > 0) { @@ -856,11 +851,9 @@ FramebufferMatchInfo TextureCacheCommon::MatchFramebuffer( // NOTE: This check is okay because the first texture formats are the same as the buffer formats. if (entry.format != (GETextureFormat)framebuffer->format) { WARN_LOG_ONCE(diffFormat1, G3D, "Texturing from framebuffer with different formats %s != %s", GeTextureFormatToString(entry.format), GeBufferFormatToString(framebuffer->format)); - return FramebufferMatchInfo{ FramebufferMatch::VALID }; - } else { - // TODO: Here we should either change the format of the framebuffer, reinterpreting it, - // or read from it while reinterpreting it. Not sure which is generally best. return FramebufferMatchInfo{ FramebufferMatch::NO_MATCH }; + } else { + return FramebufferMatchInfo{ FramebufferMatch::VALID }; } } else { // Apply to buffered mode only. @@ -1014,7 +1007,6 @@ bool TextureCacheCommon::SetOffsetTexture(u32 yOffset) { def.format = fmt; def.bufw = GetTextureBufw(0, texaddr, fmt); def.dim = gstate.getTextureDimension(0); - def.swizzled = gstate.isTextureSwizzled(); std::vector candidates = GetFramebufferCandidates(def, texaddrOffset); if (candidates.size() > 0) { diff --git a/GPU/Common/TextureCacheCommon.h b/GPU/Common/TextureCacheCommon.h index 7acfe3042c..1b0300724b 100644 --- a/GPU/Common/TextureCacheCommon.h +++ b/GPU/Common/TextureCacheCommon.h @@ -98,7 +98,6 @@ struct TextureDefinition { GETextureFormat format; u32 dim; u32 bufw; - bool swizzled; }; diff --git a/GPU/D3D11/TextureCacheD3D11.cpp b/GPU/D3D11/TextureCacheD3D11.cpp index 4c3b92cdd7..a989cf353f 100644 --- a/GPU/D3D11/TextureCacheD3D11.cpp +++ b/GPU/D3D11/TextureCacheD3D11.cpp @@ -496,7 +496,6 @@ void TextureCacheD3D11::BuildTexture(TexCacheEntry *const entry) { // Don't scale the PPGe texture. if (entry->addr > 0x05000000 && entry->addr < PSP_GetKernelMemoryEnd()) scaleFactor = 1; - if ((entry->status & TexCacheEntry::STATUS_CHANGE_FREQUENT) != 0 && scaleFactor != 1) { // Remember for later that we /wanted/ to scale this texture. entry->status |= TexCacheEntry::STATUS_TO_SCALE; diff --git a/GPU/GLES/TextureCacheGLES.cpp b/GPU/GLES/TextureCacheGLES.cpp index 07adb059d8..2e7e35ada3 100644 --- a/GPU/GLES/TextureCacheGLES.cpp +++ b/GPU/GLES/TextureCacheGLES.cpp @@ -492,6 +492,9 @@ void TextureCacheGLES::BuildTexture(TexCacheEntry *const entry) { } } + // If GLES3 is available, we can preallocate the storage, which makes texture loading more efficient. + Draw::DataFormat dstFmt = GetDestFormat(GETextureFormat(entry->format), gstate.getClutPaletteFormat()); + int scaleFactor = standardScaleFactor_; // Rachet down scale factor in low-memory mode. @@ -532,10 +535,7 @@ void TextureCacheGLES::BuildTexture(TexCacheEntry *const entry) { texelsScaledThisFrame_ += w * h; } } - - // If GLES3 is available, we can preallocate the storage, which makes texture loading more efficient. - Draw::DataFormat dstFmt = GetDestFormat(GETextureFormat(entry->format), gstate.getClutPaletteFormat()); - + // GLES2 doesn't have support for a "Max lod" which is critical as PSP games often // don't specify mips all the way down. As a result, we either need to manually generate // the bottom few levels or rely on OpenGL's autogen mipmaps instead, which might not From f429c9739221f6bd15c40d431b03576b6fa820e5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Tue, 3 Nov 2020 15:45:58 +0100 Subject: [PATCH 187/275] Disable masked memory on iOS again. The cure was worse than the disease apparently. Needs more investigation before we re-enable. See #13616 --- Core/MemMap.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Core/MemMap.h b/Core/MemMap.h index 1bd6027c22..d5df36cad7 100644 --- a/Core/MemMap.h +++ b/Core/MemMap.h @@ -84,7 +84,7 @@ extern u32 g_PSPModel; // UWP has such limited memory management that we need to mask // even in 64-bit mode. Also, when using the sanitizer, we need to mask as well. -#if PPSSPP_ARCH(32BIT) || PPSSPP_PLATFORM(UWP) || USE_ADDRESS_SANITIZER || PPSSPP_PLATFORM(IOS) +#if PPSSPP_ARCH(32BIT) || PPSSPP_PLATFORM(UWP) || USE_ADDRESS_SANITIZER #define MASKED_PSP_MEMORY #endif From 88e772cdf7417ddbf0eff8cdf5697b774364baeb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Tue, 3 Nov 2020 19:53:02 +0100 Subject: [PATCH 188/275] GLSL ES: Extensions must go first. Fixes #13620 --- GPU/Common/ShaderWriter.cpp | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/GPU/Common/ShaderWriter.cpp b/GPU/Common/ShaderWriter.cpp index 323bd3b86c..44959b57fe 100644 --- a/GPU/Common/ShaderWriter.cpp +++ b/GPU/Common/ShaderWriter.cpp @@ -96,6 +96,10 @@ void ShaderWriter::Preamble(const char **gl_extensions, size_t num_gl_extensions break; default: // OpenGL F("#version %d%s\n", lang_.glslVersionNumber, lang_.gles && lang_.glslES30 ? " es" : ""); + // IMPORTANT! Extensions must be the first thing after #version. + for (size_t i = 0; i < num_gl_extensions; i++) { + F("%s\n", gl_extensions[i]); + } switch (stage_) { case ShaderStage::Fragment: C("#define DISCARD discard\n"); @@ -109,9 +113,6 @@ void ShaderWriter::Preamble(const char **gl_extensions, size_t num_gl_extensions } break; } - for (size_t i = 0; i < num_gl_extensions; i++) { - F("%s\n", gl_extensions[i]); - } if (!lang_.gles) { C("#define lowp\n"); C("#define mediump\n"); From ad2ec61c98d8569a130b583173e93d59151d223e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Tue, 3 Nov 2020 21:04:03 +0100 Subject: [PATCH 189/275] Retry the masked memory experiment on iOS. Turns out it was the shader generator bug that broke things. --- Core/MemMap.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Core/MemMap.h b/Core/MemMap.h index d5df36cad7..1bd6027c22 100644 --- a/Core/MemMap.h +++ b/Core/MemMap.h @@ -84,7 +84,7 @@ extern u32 g_PSPModel; // UWP has such limited memory management that we need to mask // even in 64-bit mode. Also, when using the sanitizer, we need to mask as well. -#if PPSSPP_ARCH(32BIT) || PPSSPP_PLATFORM(UWP) || USE_ADDRESS_SANITIZER +#if PPSSPP_ARCH(32BIT) || PPSSPP_PLATFORM(UWP) || USE_ADDRESS_SANITIZER || PPSSPP_PLATFORM(IOS) #define MASKED_PSP_MEMORY #endif From 733a152c542c37d127f3d7a50687e085d35116d3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Wed, 4 Nov 2020 09:18:35 +0100 Subject: [PATCH 190/275] Move ShaderWriter to Common/GPU, along with some stuff from ShaderCommon.h. --- CMakeLists.txt | 6 ++-- Common/Common.vcxproj | 4 +++ Common/Common.vcxproj.filters | 12 +++++++ Common/GPU/Shader.cpp | 1 + Common/GPU/Shader.h | 40 +++++++++++++++++++++ {GPU/Common => Common/GPU}/ShaderWriter.cpp | 7 +++- {GPU/Common => Common/GPU}/ShaderWriter.h | 6 ++-- GPU/Common/DepalettizeShaderCommon.h | 5 +-- GPU/Common/FragmentShaderGenerator.cpp | 2 +- GPU/Common/FragmentShaderGenerator.h | 2 +- GPU/Common/PresentationCommon.h | 2 +- GPU/Common/ShaderCommon.cpp | 3 +- GPU/Common/ShaderCommon.h | 39 -------------------- GPU/Common/ShaderTranslation.cpp | 1 + GPU/Common/ShaderTranslation.h | 3 +- GPU/Common/VertexShaderGenerator.cpp | 4 +-- GPU/Common/VertexShaderGenerator.h | 3 ++ GPU/GLES/ShaderManagerGLES.cpp | 1 + GPU/GPU.vcxproj | 2 -- GPU/GPU.vcxproj.filters | 6 ---- UWP/CommonUWP/CommonUWP.vcxproj | 4 +++ UWP/CommonUWP/CommonUWP.vcxproj.filters | 12 +++++++ UWP/GPU_UWP/GPU_UWP.vcxproj | 2 -- UWP/GPU_UWP/GPU_UWP.vcxproj.filters | 2 -- android/jni/Android.mk | 3 +- libretro/Makefile.common | 3 +- 26 files changed, 107 insertions(+), 68 deletions(-) create mode 100644 Common/GPU/Shader.cpp create mode 100644 Common/GPU/Shader.h rename {GPU/Common => Common/GPU}/ShaderWriter.cpp (96%) rename {GPU/Common => Common/GPU}/ShaderWriter.h (93%) diff --git a/CMakeLists.txt b/CMakeLists.txt index 8f9f5ee4e1..ce37815473 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -496,6 +496,10 @@ add_library(Common STATIC Common/GPU/thin3d.cpp Common/GPU/thin3d.h Common/GPU/thin3d_create.h + Common/GPU/Shader.cpp + Common/GPU/Shader.h + Common/GPU/ShaderWriter.cpp + Common/GPU/ShaderWriter.h Common/GPU/OpenGL/GLCommon.h Common/GPU/OpenGL/GLDebugLog.cpp Common/GPU/OpenGL/GLDebugLog.h @@ -1356,8 +1360,6 @@ set(GPU_SOURCES GPU/Common/ShaderUniforms.h GPU/Common/ShaderCommon.cpp GPU/Common/ShaderCommon.h - GPU/Common/ShaderWriter.cpp - GPU/Common/ShaderWriter.h GPU/Common/ShaderTranslation.cpp GPU/Common/ShaderTranslation.h GPU/Common/SplineCommon.cpp diff --git a/Common/Common.vcxproj b/Common/Common.vcxproj index 0bb5e7ef50..f3ebb5328d 100644 --- a/Common/Common.vcxproj +++ b/Common/Common.vcxproj @@ -428,6 +428,8 @@ + + @@ -749,6 +751,8 @@ + + diff --git a/Common/Common.vcxproj.filters b/Common/Common.vcxproj.filters index 5cc1151375..0d11399460 100644 --- a/Common/Common.vcxproj.filters +++ b/Common/Common.vcxproj.filters @@ -375,6 +375,12 @@ Data\Collections + + GPU + + + GPU + @@ -723,6 +729,12 @@ Render\Text + + GPU + + + GPU + diff --git a/Common/GPU/Shader.cpp b/Common/GPU/Shader.cpp new file mode 100644 index 0000000000..79684874c3 --- /dev/null +++ b/Common/GPU/Shader.cpp @@ -0,0 +1 @@ +#include "Common/GPU/Shader.h" diff --git a/Common/GPU/Shader.h b/Common/GPU/Shader.h new file mode 100644 index 0000000000..1ed1685dde --- /dev/null +++ b/Common/GPU/Shader.h @@ -0,0 +1,40 @@ +#pragma once + +enum ShaderLanguage { + GLSL_140, // really covers a lot more. This set of languages is not good. + GLSL_300, + GLSL_VULKAN, + HLSL_D3D9, + HLSL_D3D11, +}; + +inline bool ShaderLanguageIsOpenGL(ShaderLanguage lang) { + return lang == GLSL_140 || lang == GLSL_300; +} + +enum class ShaderStage { + Vertex, + Fragment +}; + +struct ShaderLanguageDesc { + explicit ShaderLanguageDesc(ShaderLanguage lang); + + int glslVersionNumber = 0; + ShaderLanguage shaderLanguage; + bool gles = false; + const char *varying_fs = nullptr; + const char *varying_vs = nullptr; + const char *attribute = nullptr; + const char *fragColor0 = nullptr; + const char *fragColor1 = nullptr; + const char *texture = nullptr; + const char *texelFetch = nullptr; + const char *lastFragData = nullptr; + const char *framebufferFetchExtension = nullptr; + const char *vsOutPrefix = ""; + bool glslES30 = false; + bool bitwiseOps = false; + bool forceMatrix4x4 = false; + bool coefsFromBuffers = false; +}; diff --git a/GPU/Common/ShaderWriter.cpp b/Common/GPU/ShaderWriter.cpp similarity index 96% rename from GPU/Common/ShaderWriter.cpp rename to Common/GPU/ShaderWriter.cpp index 44959b57fe..cebb0d017a 100644 --- a/GPU/Common/ShaderWriter.cpp +++ b/Common/GPU/ShaderWriter.cpp @@ -1,4 +1,9 @@ -#include "GPU/Common/ShaderWriter.h" +#include +#include +#include + +#include "Common/GPU/Shader.h" +#include "Common/GPU/ShaderWriter.h" const char *vulkan_glsl_preamble_fs = "#version 450\n" diff --git a/GPU/Common/ShaderWriter.h b/Common/GPU/ShaderWriter.h similarity index 93% rename from GPU/Common/ShaderWriter.h rename to Common/GPU/ShaderWriter.h index 7a060c6732..d870f72fe4 100644 --- a/GPU/Common/ShaderWriter.h +++ b/Common/GPU/ShaderWriter.h @@ -1,9 +1,9 @@ #pragma once +#include + #include "Common/Log.h" -#include "GPU/ge_constants.h" -#include "GPU/GPUCommon.h" -#include "GPU/Common/ShaderCommon.h" +#include "Common/GPU/Shader.h" // Helps generate a shader compatible with all backends. // Using #defines and magic in this class, we partially define our own shader language that basically looks diff --git a/GPU/Common/DepalettizeShaderCommon.h b/GPU/Common/DepalettizeShaderCommon.h index 3520fded93..75a46c67ad 100644 --- a/GPU/Common/DepalettizeShaderCommon.h +++ b/GPU/Common/DepalettizeShaderCommon.h @@ -18,8 +18,9 @@ #pragma once #include + +#include "Common/GPU/Shader.h" #include "GPU/ge_constants.h" -#include "GPU/Common/ShaderCommon.h" static const int DEPAL_TEXTURE_OLD_AGE = 120; @@ -32,4 +33,4 @@ public: protected: uint32_t GenerateShaderID(uint32_t clutMode, GEBufferFormat pixelFormat) const; uint32_t GetClutID(GEPaletteFormat clutFormat, uint32_t clutHash) const; -}; \ No newline at end of file +}; diff --git a/GPU/Common/FragmentShaderGenerator.cpp b/GPU/Common/FragmentShaderGenerator.cpp index 676d3b602e..10b34cf167 100644 --- a/GPU/Common/FragmentShaderGenerator.cpp +++ b/GPU/Common/FragmentShaderGenerator.cpp @@ -21,13 +21,13 @@ #include "Common/Log.h" #include "Common/StringUtils.h" #include "Common/GPU/OpenGL/GLFeatures.h" +#include "Common/GPU/ShaderWriter.h" #include "Core/Reporting.h" #include "Core/Config.h" #include "GPU/Common/GPUStateUtils.h" #include "GPU/Common/ShaderId.h" #include "GPU/Common/ShaderUniforms.h" #include "GPU/Common/FragmentShaderGenerator.h" -#include "GPU/Common/ShaderWriter.h" #include "GPU/ge_constants.h" #include "GPU/GPUState.h" diff --git a/GPU/Common/FragmentShaderGenerator.h b/GPU/Common/FragmentShaderGenerator.h index 7c75e35c2f..2e27d165d0 100644 --- a/GPU/Common/FragmentShaderGenerator.h +++ b/GPU/Common/FragmentShaderGenerator.h @@ -17,7 +17,7 @@ #pragma once -#include "GPU/Common/ShaderCommon.h" +#include "Common/GPU/Shader.h" struct FShaderID; diff --git a/GPU/Common/PresentationCommon.h b/GPU/Common/PresentationCommon.h index 7acce4083a..2616e2dfd5 100644 --- a/GPU/Common/PresentationCommon.h +++ b/GPU/Common/PresentationCommon.h @@ -17,7 +17,7 @@ #pragma once -#include "GPU/Common/ShaderCommon.h" +#include "Common/GPU/Shader.h" struct CardboardSettings { bool enabled; diff --git a/GPU/Common/ShaderCommon.cpp b/GPU/Common/ShaderCommon.cpp index 1f13458b93..190270cd3b 100644 --- a/GPU/Common/ShaderCommon.cpp +++ b/GPU/Common/ShaderCommon.cpp @@ -4,7 +4,8 @@ #include "ext/glslang/SPIRV/GlslangToSpv.h" -#include "ShaderCommon.h" +#include "Common/GPU/Shader.h" +#include "GPU/Common/ShaderCommon.h" void init_resources(TBuiltInResource &Resources) { Resources.maxLights = 32; diff --git a/GPU/Common/ShaderCommon.h b/GPU/Common/ShaderCommon.h index e238bd9dc6..4d5a41f077 100644 --- a/GPU/Common/ShaderCommon.h +++ b/GPU/Common/ShaderCommon.h @@ -24,18 +24,6 @@ namespace Draw { class DrawContext; } -enum ShaderLanguage { - GLSL_140, // really covers a lot more. This set of languages is not good. - GLSL_300, - GLSL_VULKAN, - HLSL_D3D9, - HLSL_D3D11, -}; - -inline bool ShaderLanguageIsOpenGL(ShaderLanguage lang) { - return lang == GLSL_140 || lang == GLSL_300; -} - enum DebugShaderType { SHADER_TYPE_VERTEX = 0, SHADER_TYPE_FRAGMENT = 1, @@ -52,11 +40,6 @@ enum DebugShaderStringType { SHADER_STRING_STATS = 2, }; -enum class ShaderStage { - Vertex, - Fragment -}; - // Shared between the backends. Not all are necessarily used by each backend, but this lets us share // more code than before. enum : uint64_t { @@ -147,28 +130,6 @@ enum DoLightComputation { LIGHT_FULL, }; -struct ShaderLanguageDesc { - explicit ShaderLanguageDesc(ShaderLanguage lang); - - int glslVersionNumber = 0; - ShaderLanguage shaderLanguage; - bool gles = false; - const char *varying_fs = nullptr; - const char *varying_vs = nullptr; - const char *attribute = nullptr; - const char *fragColor0 = nullptr; - const char *fragColor1 = nullptr; - const char *texture = nullptr; - const char *texelFetch = nullptr; - const char *lastFragData = nullptr; - const char *framebufferFetchExtension = nullptr; - const char *vsOutPrefix = ""; - bool glslES30 = false; - bool bitwiseOps = false; - bool forceMatrix4x4 = false; - bool coefsFromBuffers = false; -}; - // PSP vertex format. enum class PspAttributeLocation { POSITION = 0, diff --git a/GPU/Common/ShaderTranslation.cpp b/GPU/Common/ShaderTranslation.cpp index 8e4b7c27bb..936cdc2560 100644 --- a/GPU/Common/ShaderTranslation.cpp +++ b/GPU/Common/ShaderTranslation.cpp @@ -36,6 +36,7 @@ #include "Common/Log.h" #include "Common/StringUtils.h" +#include "Common/GPU/Shader.h" #include "GPU/Common/ShaderTranslation.h" #include "ext/glslang/SPIRV/GlslangToSpv.h" diff --git a/GPU/Common/ShaderTranslation.h b/GPU/Common/ShaderTranslation.h index 9d4e41e3f1..e5f92d8ef8 100644 --- a/GPU/Common/ShaderTranslation.h +++ b/GPU/Common/ShaderTranslation.h @@ -18,7 +18,8 @@ #pragma once #include -#include "GPU/Common/ShaderCommon.h" + +#include "Common/GPU/Shader.h" #include "Common/GPU/thin3d.h" struct TranslatedShaderMetadata { diff --git a/GPU/Common/VertexShaderGenerator.cpp b/GPU/Common/VertexShaderGenerator.cpp index da781e111a..a36259ac55 100644 --- a/GPU/Common/VertexShaderGenerator.cpp +++ b/GPU/Common/VertexShaderGenerator.cpp @@ -19,14 +19,14 @@ #include #include -#include "Common/GPU/OpenGL/GLFeatures.h" #include "Common/StringUtils.h" +#include "Common/GPU/OpenGL/GLFeatures.h" +#include "Common/GPU/ShaderWriter.h" #include "Core/Config.h" #include "GPU/ge_constants.h" #include "GPU/GPUState.h" #include "GPU/Common/ShaderId.h" #include "GPU/Common/ShaderUniforms.h" -#include "GPU/Common/ShaderWriter.h" #include "GPU/Common/VertexDecoderCommon.h" #include "GPU/Common/VertexShaderGenerator.h" diff --git a/GPU/Common/VertexShaderGenerator.h b/GPU/Common/VertexShaderGenerator.h index 8f69f5bcd8..df62f76289 100644 --- a/GPU/Common/VertexShaderGenerator.h +++ b/GPU/Common/VertexShaderGenerator.h @@ -17,7 +17,10 @@ #pragma once +#include + #include "Common/CommonTypes.h" +#include "Common/GPU/Shader.h" struct VShaderID; diff --git a/GPU/GLES/ShaderManagerGLES.cpp b/GPU/GLES/ShaderManagerGLES.cpp index 7e77133a85..ba8539f4ee 100644 --- a/GPU/GLES/ShaderManagerGLES.cpp +++ b/GPU/GLES/ShaderManagerGLES.cpp @@ -30,6 +30,7 @@ #include "Common/Math/math_util.h" #include "Common/Math/lin/matrix4x4.h" #include "Common/Profiler/Profiler.h" +#include "Common/GPU/Shader.h" #include "Common/GPU/thin3d.h" #include "Common/GPU/OpenGL/GLRenderManager.h" diff --git a/GPU/GPU.vcxproj b/GPU/GPU.vcxproj index bb7bb6980f..675602d6d5 100644 --- a/GPU/GPU.vcxproj +++ b/GPU/GPU.vcxproj @@ -351,7 +351,6 @@ - @@ -489,7 +488,6 @@ - diff --git a/GPU/GPU.vcxproj.filters b/GPU/GPU.vcxproj.filters index c19594763f..509e962588 100644 --- a/GPU/GPU.vcxproj.filters +++ b/GPU/GPU.vcxproj.filters @@ -270,9 +270,6 @@ Common - - Common - @@ -542,8 +539,5 @@ Common - - Common - \ No newline at end of file diff --git a/UWP/CommonUWP/CommonUWP.vcxproj b/UWP/CommonUWP/CommonUWP.vcxproj index e8d56b3ab6..56f207c60f 100644 --- a/UWP/CommonUWP/CommonUWP.vcxproj +++ b/UWP/CommonUWP/CommonUWP.vcxproj @@ -419,6 +419,8 @@ + + @@ -536,6 +538,8 @@ + + diff --git a/UWP/CommonUWP/CommonUWP.vcxproj.filters b/UWP/CommonUWP/CommonUWP.vcxproj.filters index 7576f5735f..8c7551735d 100644 --- a/UWP/CommonUWP/CommonUWP.vcxproj.filters +++ b/UWP/CommonUWP/CommonUWP.vcxproj.filters @@ -363,6 +363,12 @@ Render\Text + + GPU + + + GPU + @@ -662,6 +668,12 @@ Data\Collections + + GPU + + + GPU + diff --git a/UWP/GPU_UWP/GPU_UWP.vcxproj b/UWP/GPU_UWP/GPU_UWP.vcxproj index aef600ae34..d5b5d3167e 100644 --- a/UWP/GPU_UWP/GPU_UWP.vcxproj +++ b/UWP/GPU_UWP/GPU_UWP.vcxproj @@ -392,7 +392,6 @@ - @@ -450,7 +449,6 @@ - diff --git a/UWP/GPU_UWP/GPU_UWP.vcxproj.filters b/UWP/GPU_UWP/GPU_UWP.vcxproj.filters index c1e17c829d..12f33ec3af 100644 --- a/UWP/GPU_UWP/GPU_UWP.vcxproj.filters +++ b/UWP/GPU_UWP/GPU_UWP.vcxproj.filters @@ -57,7 +57,6 @@ - @@ -115,6 +114,5 @@ - \ No newline at end of file diff --git a/android/jni/Android.mk b/android/jni/Android.mk index 4498059207..845f3ca441 100644 --- a/android/jni/Android.mk +++ b/android/jni/Android.mk @@ -252,6 +252,8 @@ EXEC_AND_LIB_FILES := \ $(SRC)/Common/File/DirListing.cpp \ $(SRC)/Common/File/FileDescriptor.cpp \ $(SRC)/Common/GPU/thin3d.cpp \ + $(SRC)/Common/GPU/Shader.cpp \ + $(SRC)/Common/GPU/ShaderWriter.cpp \ $(SRC)/Common/Render/DrawBuffer.cpp \ $(SRC)/Common/Render/TextureAtlas.cpp \ $(SRC)/Common/Render/Text/draw_text.cpp \ @@ -318,7 +320,6 @@ EXEC_AND_LIB_FILES := \ $(SRC)/GPU/Common/TextureCacheCommon.cpp.arm \ $(SRC)/GPU/Common/TextureScalerCommon.cpp.arm \ $(SRC)/GPU/Common/ShaderCommon.cpp \ - $(SRC)/GPU/Common/ShaderWriter.cpp \ $(SRC)/GPU/Common/ShaderTranslation.cpp \ $(SRC)/GPU/Common/StencilCommon.cpp \ $(SRC)/GPU/Common/SplineCommon.cpp.arm \ diff --git a/libretro/Makefile.common b/libretro/Makefile.common index bd03911b48..15620ed2b6 100644 --- a/libretro/Makefile.common +++ b/libretro/Makefile.common @@ -166,6 +166,8 @@ SOURCES_CXX += \ $(COMMONDIR)/File/FileDescriptor.cpp \ $(COMMONDIR)/File/DirListing.cpp \ $(COMMONDIR)/GPU/thin3d.cpp \ + $(COMMONDIR)/GPU/Shader.cpp \ + $(COMMONDIR)/GPU/ShaderWriter.cpp \ $(COMMONDIR)/GPU/OpenGL/thin3d_gl.cpp \ $(COMMONDIR)/GPU/OpenGL/GLDebugLog.cpp \ $(COMMONDIR)/GPU/OpenGL/GLSLProgram.cpp \ @@ -236,7 +238,6 @@ SOURCES_CXX += \ $(GPUCOMMONDIR)/ShaderCommon.cpp \ $(GPUCOMMONDIR)/ShaderUniforms.cpp \ $(GPUCOMMONDIR)/ShaderTranslation.cpp \ - $(GPUCOMMONDIR)/ShaderWriter.cpp \ $(GPUCOMMONDIR)/GPUDebugInterface.cpp \ $(GPUCOMMONDIR)/DepalettizeShaderCommon.cpp \ $(GPUCOMMONDIR)/TransformCommon.cpp \ From 03e8eac6efb7c101f46b10aca7de08421440a9f2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Wed, 4 Nov 2020 09:40:11 +0100 Subject: [PATCH 191/275] Merge the two ShaderLanguage enums. --- Common/GPU/OpenGL/thin3d_gl.cpp | 12 ++++++----- Common/GPU/Shader.h | 15 ++++++++------ Common/GPU/thin3d.cpp | 10 ++++----- Common/GPU/thin3d.h | 12 ++--------- GPU/Common/DepalettizeShaderCommon.cpp | 6 +++--- GPU/Common/PresentationCommon.cpp | 28 +++----------------------- GPU/Common/ShaderCommon.cpp | 4 ++-- GPU/Common/ShaderTranslation.cpp | 8 ++++---- GPU/GLES/DepalettizeShaderGLES.cpp | 2 +- GPU/GLES/FramebufferManagerGLES.cpp | 2 +- GPU/GLES/ShaderManagerGLES.cpp | 12 +++++------ GPU/Software/SoftGpu.cpp | 2 +- UI/GPUDriverTestScreen.cpp | 5 +++-- unittest/TestShaderGenerators.cpp | 24 +++++++++++----------- 14 files changed, 59 insertions(+), 83 deletions(-) diff --git a/Common/GPU/OpenGL/thin3d_gl.cpp b/Common/GPU/OpenGL/thin3d_gl.cpp index a58432e14b..be13d312e8 100644 --- a/Common/GPU/OpenGL/thin3d_gl.cpp +++ b/Common/GPU/OpenGL/thin3d_gl.cpp @@ -8,6 +8,7 @@ #include "Common/Math/math_util.h" #include "Common/Math/lin/matrix4x4.h" #include "Common/GPU/thin3d.h" +#include "Common/GPU/Shader.h" #include "Common/GPU/OpenGL/DataFormatGL.h" #include "Common/GPU/OpenGL/GLCommon.h" #include "Common/GPU/OpenGL/GLDebugLog.h" @@ -254,7 +255,7 @@ public: private: GLRenderManager *render_; ShaderStage stage_; - ShaderLanguage language_ = ShaderLanguage::GLSL_ES_200; + ShaderLanguage language_ = GLSL_1xx; GLRShader *shader_ = nullptr; GLuint glstage_ = 0; std::string source_; // So we can recompile in case of context loss. @@ -345,10 +346,11 @@ public: return caps_; } uint32_t GetSupportedShaderLanguages() const override { - if (gl_extensions.IsGLES) - return (uint32_t)ShaderLanguage::GLSL_ES_200 | (uint32_t)ShaderLanguage::GLSL_ES_300; - else - return (uint32_t)ShaderLanguage::GLSL_ES_200 | (uint32_t)ShaderLanguage::GLSL_410; + if (gl_extensions.GLES3) { + return (uint32_t)(ShaderLanguage::GLSL_3xx | ShaderLanguage::GLSL_1xx); + } else { + return (uint32_t)ShaderLanguage::GLSL_1xx; + } } uint32_t GetDataFormatSupport(DataFormat fmt) const override; diff --git a/Common/GPU/Shader.h b/Common/GPU/Shader.h index 1ed1685dde..9457a8461b 100644 --- a/Common/GPU/Shader.h +++ b/Common/GPU/Shader.h @@ -1,15 +1,18 @@ #pragma once +// GLSL_1xx and GLSL_3xx each cover a lot of sub variants. All the little quirks +// that differ are covered in ShaderLanguageDesc. +// Defined as a bitmask so stuff like GetSupportedShaderLanguages can return combinations. enum ShaderLanguage { - GLSL_140, // really covers a lot more. This set of languages is not good. - GLSL_300, - GLSL_VULKAN, - HLSL_D3D9, - HLSL_D3D11, + GLSL_1xx = 1, + GLSL_3xx = 2, + GLSL_VULKAN = 4, + HLSL_D3D9 = 8, + HLSL_D3D11 = 16, }; inline bool ShaderLanguageIsOpenGL(ShaderLanguage lang) { - return lang == GLSL_140 || lang == GLSL_300; + return lang == GLSL_1xx || lang == GLSL_3xx; } enum class ShaderStage { diff --git a/Common/GPU/thin3d.cpp b/Common/GPU/thin3d.cpp index 95dce26147..0c1b8917a1 100644 --- a/Common/GPU/thin3d.cpp +++ b/Common/GPU/thin3d.cpp @@ -101,7 +101,7 @@ bool RefCountedObject::ReleaseAssertLast() { // The Vulkan ones can be re-used with modern GL later if desired, as they're just GLSL. static const std::vector fsTexCol = { - {ShaderLanguage::GLSL_ES_200, + {ShaderLanguage::GLSL_1xx, "#ifdef GL_ES\n" "precision lowp float;\n" "#endif\n" @@ -145,7 +145,7 @@ static const std::vector fsTexCol = { }; static const std::vector fsTexColRBSwizzle = { - {ShaderLanguage::GLSL_ES_200, + {GLSL_1xx, "#ifdef GL_ES\n" "precision lowp float;\n" "#endif\n" @@ -189,7 +189,7 @@ static const std::vector fsTexColRBSwizzle = { }; static const std::vector fsCol = { - { ShaderLanguage::GLSL_ES_200, + { GLSL_1xx, "#ifdef GL_ES\n" "precision lowp float;\n" "#endif\n" @@ -226,7 +226,7 @@ static const std::vector fsCol = { // ================================== VERTEX SHADERS static const std::vector vsCol = { - { ShaderLanguage::GLSL_ES_200, + { GLSL_1xx, "#if __VERSION__ >= 130\n" "#define attribute in\n" "#define varying out\n" @@ -288,7 +288,7 @@ const UniformBufferDesc vsColBufDesc { sizeof(VsColUB), { } }; static const std::vector vsTexCol = { - { ShaderLanguage::GLSL_ES_200, + { GLSL_1xx, "#if __VERSION__ >= 130\n" "#define attribute in\n" "#define varying out\n" diff --git a/Common/GPU/thin3d.h b/Common/GPU/thin3d.h index e3f6390afe..8aeaa819b2 100644 --- a/Common/GPU/thin3d.h +++ b/Common/GPU/thin3d.h @@ -12,7 +12,8 @@ #include #include -#include "DataFormat.h" +#include "Common/GPU/DataFormat.h" +#include "Common/GPU/Shader.h" namespace Lin { class Matrix4x4; @@ -203,15 +204,6 @@ enum class TextureAddressMode { CLAMP_TO_BORDER, }; -enum class ShaderLanguage { - GLSL_ES_200 = 1, - GLSL_ES_300 = 2, - GLSL_410 = 4, - GLSL_VULKAN = 8, - HLSL_D3D9 = 32, - HLSL_D3D11 = 64, -}; - enum FormatSupport { FMT_RENDERTARGET = 1, FMT_TEXTURE = 2, diff --git a/GPU/Common/DepalettizeShaderCommon.cpp b/GPU/Common/DepalettizeShaderCommon.cpp index 516c3b9fde..11236f1f9a 100644 --- a/GPU/Common/DepalettizeShaderCommon.cpp +++ b/GPU/Common/DepalettizeShaderCommon.cpp @@ -286,7 +286,7 @@ void GenerateDepalShaderFloat(char *buffer, GEBufferFormat pixelFormat, ShaderLa float texel_offset = ((float)clutBase + 0.5f) / texturePixels; sprintf(offset, " + %f", texel_offset); - if (lang == GLSL_140) { + if (lang == GLSL_1xx) { if (gl_extensions.IsGLES) { WRITE(p, "#version 100\n"); WRITE(p, "precision mediump float;\n"); @@ -318,10 +318,10 @@ void GenerateDepalShaderFloat(char *buffer, GEBufferFormat pixelFormat, ShaderLa void GenerateDepalShader(char *buffer, GEBufferFormat pixelFormat, ShaderLanguage language) { switch (language) { - case GLSL_140: + case GLSL_1xx: GenerateDepalShaderFloat(buffer, pixelFormat, language); break; - case GLSL_300: + case GLSL_3xx: case GLSL_VULKAN: case HLSL_D3D11: GenerateDepalShader300(buffer, pixelFormat, language); diff --git a/GPU/Common/PresentationCommon.cpp b/GPU/Common/PresentationCommon.cpp index c359922085..7636619e24 100644 --- a/GPU/Common/PresentationCommon.cpp +++ b/GPU/Common/PresentationCommon.cpp @@ -240,8 +240,8 @@ bool PresentationCommon::BuildPostShader(const ShaderInfo *shaderInfo, const Sha } std::string vsError, fsError; - Draw::ShaderModule *vs = CompileShaderModule(Draw::ShaderStage::VERTEX, GLSL_140, vsSourceGLSL, &vsError); - Draw::ShaderModule *fs = CompileShaderModule(Draw::ShaderStage::FRAGMENT, GLSL_140, fsSourceGLSL, &fsError); + Draw::ShaderModule *vs = CompileShaderModule(Draw::ShaderStage::VERTEX, GLSL_1xx, vsSourceGLSL, &vsError); + Draw::ShaderModule *fs = CompileShaderModule(Draw::ShaderStage::FRAGMENT, GLSL_1xx, fsSourceGLSL, &fsError); // Don't worry, CompileShaderModule makes sure they get freed if one succeeded. if (!fs || !vs) { @@ -476,29 +476,7 @@ Draw::ShaderModule *PresentationCommon::CompileShaderModule(Draw::ShaderStage st } } - Draw::ShaderLanguage mappedLang; - // These aren't exact, unfortunately, but we just need the type Draw will accept. - switch (lang_) { - case GLSL_140: - mappedLang = Draw::ShaderLanguage::GLSL_ES_200; - break; - case GLSL_300: - mappedLang = Draw::ShaderLanguage::GLSL_410; - break; - case GLSL_VULKAN: - mappedLang = Draw::ShaderLanguage::GLSL_VULKAN; - break; - case HLSL_D3D9: - mappedLang = Draw::ShaderLanguage::HLSL_D3D9; - break; - case HLSL_D3D11: - mappedLang = Draw::ShaderLanguage::HLSL_D3D11; - break; - default: - mappedLang = Draw::ShaderLanguage::GLSL_ES_200; - break; - } - Draw::ShaderModule *shader = draw_->CreateShaderModule(stage, mappedLang, (const uint8_t *)translated.c_str(), translated.size(), "postshader"); + Draw::ShaderModule *shader = draw_->CreateShaderModule(stage, lang_, (const uint8_t *)translated.c_str(), translated.size(), "postshader"); if (shader) postShaderModules_.push_back(shader); return shader; diff --git a/GPU/Common/ShaderCommon.cpp b/GPU/Common/ShaderCommon.cpp index 190270cd3b..45ba5ab357 100644 --- a/GPU/Common/ShaderCommon.cpp +++ b/GPU/Common/ShaderCommon.cpp @@ -105,7 +105,7 @@ void init_resources(TBuiltInResource &Resources) { ShaderLanguageDesc::ShaderLanguageDesc(ShaderLanguage lang) { shaderLanguage = lang; switch (lang) { - case GLSL_140: + case GLSL_1xx: // Just used in the shader test, and as a basis for the others in DetectShaderLanguage. glslVersionNumber = 110; attribute = "attribute"; @@ -120,7 +120,7 @@ ShaderLanguageDesc::ShaderLanguageDesc(ShaderLanguage lang) { gles = false; forceMatrix4x4 = true; break; - case GLSL_300: + case GLSL_3xx: // Just used in the shader test. glslVersionNumber = 300; // GLSL ES 3.0 varying_vs = "out"; diff --git a/GPU/Common/ShaderTranslation.cpp b/GPU/Common/ShaderTranslation.cpp index 936cdc2560..e32d3fb615 100644 --- a/GPU/Common/ShaderTranslation.cpp +++ b/GPU/Common/ShaderTranslation.cpp @@ -220,10 +220,10 @@ bool ConvertToVulkanGLSL(std::string *dest, TranslatedShaderMetadata *destMetada } bool TranslateShader(std::string *dest, ShaderLanguage destLang, TranslatedShaderMetadata *destMetadata, std::string src, ShaderLanguage srcLang, Draw::ShaderStage stage, std::string *errorMessage) { - if (srcLang != GLSL_300 && srcLang != GLSL_140) + if (srcLang != GLSL_3xx && srcLang != GLSL_1xx) return false; - if ((srcLang == GLSL_140 || srcLang == GLSL_300) && destLang == GLSL_VULKAN) { + if ((srcLang == GLSL_1xx || srcLang == GLSL_3xx) && destLang == GLSL_VULKAN) { // Let's just mess about at the string level, no need to recompile. bool result = ConvertToVulkanGLSL(dest, destMetadata, src, stage, errorMessage); return result; @@ -327,7 +327,7 @@ bool TranslateShader(std::string *dest, ShaderLanguage destLang, TranslatedShade return true; } #endif - case GLSL_140: + case GLSL_1xx: { spirv_cross::CompilerGLSL glsl(std::move(spirv)); // The SPIR-V is now parsed, and we can perform reflection on it. @@ -352,7 +352,7 @@ bool TranslateShader(std::string *dest, ShaderLanguage destLang, TranslatedShade *dest = glsl.compile(); return true; } - case GLSL_300: + case GLSL_3xx: { spirv_cross::CompilerGLSL glsl(std::move(spirv)); // The SPIR-V is now parsed, and we can perform reflection on it. diff --git a/GPU/GLES/DepalettizeShaderGLES.cpp b/GPU/GLES/DepalettizeShaderGLES.cpp index 59517c0f4d..8e58de7c55 100644 --- a/GPU/GLES/DepalettizeShaderGLES.cpp +++ b/GPU/GLES/DepalettizeShaderGLES.cpp @@ -162,7 +162,7 @@ DepalShader *DepalShaderCacheGLES::GetDepalettizeShader(uint32_t clutMode, GEBuf char *buffer = new char[2048]; - GenerateDepalShader(buffer, pixelFormat, useGL3_ ? GLSL_300 : GLSL_140); + GenerateDepalShader(buffer, pixelFormat, useGL3_ ? GLSL_3xx : GLSL_1xx); std::string src(buffer); GLRShader *fragShader = render_->CreateShader(GL_FRAGMENT_SHADER, src, "depal"); diff --git a/GPU/GLES/FramebufferManagerGLES.cpp b/GPU/GLES/FramebufferManagerGLES.cpp index c551b7756f..5ba89b5c4e 100644 --- a/GPU/GLES/FramebufferManagerGLES.cpp +++ b/GPU/GLES/FramebufferManagerGLES.cpp @@ -105,7 +105,7 @@ FramebufferManagerGLES::FramebufferManagerGLES(Draw::DrawContext *draw, GLRender needGLESRebinds_ = true; CreateDeviceObjects(); render_ = (GLRenderManager *)draw_->GetNativeObject(Draw::NativeObject::RENDER_MANAGER); - presentation_->SetLanguage(gl_extensions.IsCoreContext ? GLSL_300 : GLSL_140); + presentation_->SetLanguage(gl_extensions.IsCoreContext ? GLSL_3xx : GLSL_1xx); } void FramebufferManagerGLES::Init() { diff --git a/GPU/GLES/ShaderManagerGLES.cpp b/GPU/GLES/ShaderManagerGLES.cpp index ba8539f4ee..e86573a1e8 100644 --- a/GPU/GLES/ShaderManagerGLES.cpp +++ b/GPU/GLES/ShaderManagerGLES.cpp @@ -572,7 +572,7 @@ void LinkedShader::UpdateUniforms(u32 vertType, const ShaderID &vsid, bool useBu } ShaderManagerGLES::ShaderManagerGLES(Draw::DrawContext *draw) - : ShaderManagerCommon(draw), compat_(GLSL_140), fsCache_(16), vsCache_(16) { + : ShaderManagerCommon(draw), compat_(GLSL_1xx), fsCache_(16), vsCache_(16) { render_ = (GLRenderManager *)draw->GetNativeObject(Draw::NativeObject::RENDER_MANAGER); codeBuffer_ = new char[16384]; lastFSID_.set_invalid(); @@ -591,7 +591,7 @@ void ShaderManagerGLES::DetectShaderLanguage() { if (compat.gles) { if (gstate_c.Supports(GPU_SUPPORTS_GLSL_ES_300)) { - compat.shaderLanguage = ShaderLanguage::GLSL_300; + compat.shaderLanguage = ShaderLanguage::GLSL_3xx; compat.glslVersionNumber = 300; // GLSL ES 3.0 compat.fragColor0 = "fragColor0"; compat.texture = "texture"; @@ -602,7 +602,7 @@ void ShaderManagerGLES::DetectShaderLanguage() { compat.varying_fs = "in"; compat.attribute = "in"; } else { - compat.shaderLanguage = ShaderLanguage::GLSL_140; + compat.shaderLanguage = ShaderLanguage::GLSL_1xx; compat.glslVersionNumber = 100; // GLSL ES 1.0 if (gl_extensions.EXT_gpu_shader4) { compat.bitwiseOps = true; @@ -616,7 +616,7 @@ void ShaderManagerGLES::DetectShaderLanguage() { } else { if (!gl_extensions.ForceGL2 || gl_extensions.IsCoreContext) { if (gl_extensions.VersionGEThan(3, 3, 0)) { - compat.shaderLanguage = ShaderLanguage::GLSL_300; + compat.shaderLanguage = ShaderLanguage::GLSL_3xx; compat.glslVersionNumber = 330; compat.fragColor0 = "fragColor0"; compat.texture = "texture"; @@ -627,13 +627,13 @@ void ShaderManagerGLES::DetectShaderLanguage() { compat.varying_fs = "in"; compat.attribute = "in"; } else if (gl_extensions.VersionGEThan(3, 0, 0)) { - compat.shaderLanguage = ShaderLanguage::GLSL_140; + compat.shaderLanguage = ShaderLanguage::GLSL_1xx; compat.glslVersionNumber = 130; compat.fragColor0 = "fragColor0"; compat.bitwiseOps = true; compat.texelFetch = "texelFetch"; } else { - compat.shaderLanguage = ShaderLanguage::GLSL_140; + compat.shaderLanguage = ShaderLanguage::GLSL_1xx; compat.glslVersionNumber = 110; if (gl_extensions.EXT_gpu_shader4) { compat.bitwiseOps = true; diff --git a/GPU/Software/SoftGpu.cpp b/GPU/Software/SoftGpu.cpp index 26453819f9..7016f0b001 100644 --- a/GPU/Software/SoftGpu.cpp +++ b/GPU/Software/SoftGpu.cpp @@ -72,7 +72,7 @@ SoftGPU::SoftGPU(GraphicsContext *gfxCtx, Draw::DrawContext *draw) switch (GetGPUBackend()) { case GPUBackend::OPENGL: - presentation_->SetLanguage(gl_extensions.IsCoreContext ? GLSL_300 : GLSL_140); + presentation_->SetLanguage(gl_extensions.IsCoreContext ? GLSL_3xx : GLSL_1xx); break; case GPUBackend::DIRECT3D9: ShaderTranslationInit(); diff --git a/UI/GPUDriverTestScreen.cpp b/UI/GPUDriverTestScreen.cpp index 56547cd8b9..8089550e25 100644 --- a/UI/GPUDriverTestScreen.cpp +++ b/UI/GPUDriverTestScreen.cpp @@ -1,9 +1,10 @@ #include "GPUDriverTestScreen.h" #include "Common/Data/Text/I18n.h" #include "Common/UI/View.h" +#include "Common/GPU/Shader.h" static const std::vector fsDiscard = { - {Draw::ShaderLanguage::GLSL_ES_200, + {ShaderLanguage::GLSL_1xx, R"( #ifdef GL_ES precision lowp float; @@ -23,7 +24,7 @@ static const std::vector fsDiscard = { gl_FragColor = color; })" }, - {Draw::ShaderLanguage::GLSL_VULKAN, + {ShaderLanguage::GLSL_VULKAN, R"(#version 450 #extension GL_ARB_separate_shader_objects : enable #extension GL_ARB_shading_language_420pack : enable diff --git a/unittest/TestShaderGenerators.cpp b/unittest/TestShaderGenerators.cpp index 645069172e..2f67729573 100644 --- a/unittest/TestShaderGenerators.cpp +++ b/unittest/TestShaderGenerators.cpp @@ -26,14 +26,14 @@ bool GenerateFShader(FShaderID id, char *buffer, ShaderLanguage lang, std::strin ShaderLanguageDesc compat(ShaderLanguage::GLSL_VULKAN); return GenerateFragmentShader(id, buffer, compat, &uniformMask, errorString); } - case ShaderLanguage::GLSL_140: + case ShaderLanguage::GLSL_1xx: { - ShaderLanguageDesc compat(ShaderLanguage::GLSL_140); + ShaderLanguageDesc compat(ShaderLanguage::GLSL_1xx); return GenerateFragmentShader(id, buffer, compat, &uniformMask, errorString); } - case ShaderLanguage::GLSL_300: + case ShaderLanguage::GLSL_3xx: { - ShaderLanguageDesc compat(ShaderLanguage::GLSL_140); + ShaderLanguageDesc compat(ShaderLanguage::GLSL_1xx); return GenerateFragmentShader(id, buffer, compat, &uniformMask, errorString); } case ShaderLanguage::HLSL_D3D9: @@ -60,14 +60,14 @@ bool GenerateVShader(VShaderID id, char *buffer, ShaderLanguage lang, std::strin ShaderLanguageDesc compat(ShaderLanguage::GLSL_VULKAN); return GenerateVertexShader(id, buffer, compat, &attrMask, &uniformMask, errorString); } - case ShaderLanguage::GLSL_140: + case ShaderLanguage::GLSL_1xx: { - ShaderLanguageDesc compat(ShaderLanguage::GLSL_140); + ShaderLanguageDesc compat(ShaderLanguage::GLSL_1xx); return GenerateVertexShader(id, buffer, compat, &attrMask, &uniformMask, errorString); } - case ShaderLanguage::GLSL_300: + case ShaderLanguage::GLSL_3xx: { - ShaderLanguageDesc compat(ShaderLanguage::GLSL_140); + ShaderLanguageDesc compat(ShaderLanguage::GLSL_1xx); return GenerateVertexShader(id, buffer, compat, &attrMask, &uniformMask, errorString); } case ShaderLanguage::HLSL_D3D9: @@ -106,9 +106,9 @@ bool TestCompileShader(const char *buffer, ShaderLanguage lang, bool vertex, std case ShaderLanguage::GLSL_VULKAN: return GLSLtoSPV(vertex ? VK_SHADER_STAGE_VERTEX_BIT : VK_SHADER_STAGE_FRAGMENT_BIT, buffer, GLSLVariant::VULKAN, spirv, errorMessage); - case ShaderLanguage::GLSL_140: + case ShaderLanguage::GLSL_1xx: return GLSLtoSPV(vertex ? VK_SHADER_STAGE_VERTEX_BIT : VK_SHADER_STAGE_FRAGMENT_BIT, buffer, GLSLVariant::GL140, spirv, errorMessage); - case ShaderLanguage::GLSL_300: + case ShaderLanguage::GLSL_3xx: return GLSLtoSPV(vertex ? VK_SHADER_STAGE_VERTEX_BIT : VK_SHADER_STAGE_FRAGMENT_BIT, buffer, GLSLVariant::GLES300, spirv, errorMessage); default: return false; @@ -151,8 +151,8 @@ bool TestShaderGenerators() { ShaderLanguage::HLSL_D3D9, ShaderLanguage::HLSL_D3D11, ShaderLanguage::GLSL_VULKAN, - ShaderLanguage::GLSL_140, - ShaderLanguage::GLSL_300, + ShaderLanguage::GLSL_1xx, + ShaderLanguage::GLSL_3xx, }; const int numLanguages = ARRAY_SIZE(languages); From 207b76da6e46c50df1bf429f8ecd4df18c179cc6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Thu, 5 Nov 2020 00:48:35 +0100 Subject: [PATCH 192/275] Show an error on screen if a shader fails to compile. Part of #1 investigation of #13541 --- Common/GPU/OpenGL/GLFeatures.cpp | 3 ++- Common/GPU/OpenGL/GLFeatures.h | 1 + Common/GPU/OpenGL/GLQueueRunner.cpp | 23 ++++++++++++++--------- Common/GPU/OpenGL/GLQueueRunner.h | 9 +++++++++ Common/GPU/OpenGL/GLRenderManager.h | 4 ++++ Common/GPU/OpenGL/thin3d_gl.cpp | 4 ++++ Common/GPU/Shader.h | 5 +++++ Common/GPU/thin3d.h | 2 ++ GPU/GLES/ShaderManagerGLES.cpp | 1 + Windows/GPU/WindowsGLContext.cpp | 5 +++++ android/jni/app-android.cpp | 10 ++++++++++ ios/ViewController.mm | 5 +++++ 12 files changed, 62 insertions(+), 10 deletions(-) diff --git a/Common/GPU/OpenGL/GLFeatures.cpp b/Common/GPU/OpenGL/GLFeatures.cpp index ad4df92819..df8632779c 100644 --- a/Common/GPU/OpenGL/GLFeatures.cpp +++ b/Common/GPU/OpenGL/GLFeatures.cpp @@ -356,6 +356,7 @@ void CheckGLExtensions() { gl_extensions.ARB_cull_distance = g_set_gl_extensions.count("GL_ARB_cull_distance") != 0; gl_extensions.ARB_depth_clamp = g_set_gl_extensions.count("GL_ARB_depth_clamp") != 0; gl_extensions.ARB_uniform_buffer_object = g_set_gl_extensions.count("GL_ARB_uniform_buffer_object") != 0; + gl_extensions.ARB_explicit_attrib_location = g_set_gl_extensions.count("GL_ARB_explicit_attrib_location") != 0; if (gl_extensions.IsGLES) { gl_extensions.OES_texture_npot = g_set_gl_extensions.count("GL_OES_texture_npot") != 0; @@ -507,7 +508,7 @@ void CheckGLExtensions() { } if (gl_extensions.VersionGEThan(3, 3)) { gl_extensions.ARB_blend_func_extended = true; - // ARB_explicit_attrib_location = true; + gl_extensions.ARB_explicit_attrib_location = true; } if (gl_extensions.VersionGEThan(4, 0)) { // ARB_gpu_shader5 = true; diff --git a/Common/GPU/OpenGL/GLFeatures.h b/Common/GPU/OpenGL/GLFeatures.h index 884b0a3df3..f4da0ce221 100644 --- a/Common/GPU/OpenGL/GLFeatures.h +++ b/Common/GPU/OpenGL/GLFeatures.h @@ -55,6 +55,7 @@ struct GLExtensions { bool ARB_pixel_buffer_object; bool ARB_blend_func_extended; // dual source blending bool EXT_blend_func_extended; // dual source blending (GLES, new 2015) + bool ARB_explicit_attrib_location; bool ARB_shader_image_load_store; bool ARB_shading_language_420pack; bool ARB_conservative_depth; diff --git a/Common/GPU/OpenGL/GLQueueRunner.cpp b/Common/GPU/OpenGL/GLQueueRunner.cpp index c01eb0ed70..e53721bb1b 100644 --- a/Common/GPU/OpenGL/GLQueueRunner.cpp +++ b/Common/GPU/OpenGL/GLQueueRunner.cpp @@ -277,21 +277,26 @@ void GLQueueRunner::RunInitSteps(const std::vector &steps, bool ski glCompileShader(shader); GLint success = 0; glGetShaderiv(shader, GL_COMPILE_STATUS, &success); + std::string infoLog = GetInfoLog(shader, glGetShaderiv, glGetShaderInfoLog); if (!success) { - std::string infoLog = GetInfoLog(shader, glGetShaderiv, glGetShaderInfoLog); -#if PPSSPP_PLATFORM(ANDROID) - ERROR_LOG(G3D, "Error in shader compilation! %s\n", infoLog.c_str()); - ERROR_LOG(G3D, "Shader source:\n%s\n", (const char *)code); -#endif - ERROR_LOG(G3D, "Error in shader compilation for: %s", step.create_shader.shader->desc.c_str()); - ERROR_LOG(G3D, "Info log: %s", infoLog.c_str()); - ERROR_LOG(G3D, "Shader source:\n%s\n", (const char *)code); + std::string errorString = StringFromFormat( + "Error in shader compilation for: %s\n" + "Info log: %s\n" + "Shader source:\n%s\n//END\n\n", + step.create_shader.shader->desc.c_str(), + infoLog.c_str(), + LineNumberString(code).c_str()); + if (errorCallback_) { + std::string desc = StringFromFormat("Shader compilation failed: %s", step.create_shader.stage == GL_VERTEX_SHADER ? "vertex" : "fragment"); + errorCallback_(desc.c_str(), errorString.c_str(), errorCallbackUserData_); + } Reporting::ReportMessage("Error in shader compilation: info: %s\n%s\n%s", infoLog.c_str(), step.create_shader.shader->desc.c_str(), (const char *)code); + } else { #ifdef SHADERLOG OutputDebugStringUTF8(infoLog.c_str()); #endif step.create_shader.shader->failed = true; - step.create_shader.shader->error = infoLog; + step.create_shader.shader->error = infoLog; // Hm, we never use this. } // Before we throw away the code, attach it to the shader for debugging. step.create_shader.shader->code = code; diff --git a/Common/GPU/OpenGL/GLQueueRunner.h b/Common/GPU/OpenGL/GLQueueRunner.h index 79559c4d4d..f47bfd7c40 100644 --- a/Common/GPU/OpenGL/GLQueueRunner.h +++ b/Common/GPU/OpenGL/GLQueueRunner.h @@ -6,6 +6,7 @@ #include "Common/GPU/OpenGL/GLCommon.h" #include "Common/GPU/DataFormat.h" +#include "Common/GPU/Shader.h" #include "Common/Data/Collections/TinySet.h" struct GLRViewport { @@ -341,6 +342,11 @@ class GLQueueRunner { public: GLQueueRunner() {} + void SetErrorCallback(ErrorCallbackFn callback, void *userdata) { + errorCallback_ = callback; + errorCallbackUserData_ = userdata; + } + void RunInitSteps(const std::vector &steps, bool skipGLCalls); void RunSteps(const std::vector &steps, bool skipGLCalls); @@ -423,4 +429,7 @@ private: bool sawOutOfMemory_ = false; bool useDebugGroups_ = false; + + ErrorCallbackFn errorCallback_ = nullptr; + void *errorCallbackUserData_ = nullptr; }; diff --git a/Common/GPU/OpenGL/GLRenderManager.h b/Common/GPU/OpenGL/GLRenderManager.h index a2f3a7effe..3999332e69 100644 --- a/Common/GPU/OpenGL/GLRenderManager.h +++ b/Common/GPU/OpenGL/GLRenderManager.h @@ -357,6 +357,10 @@ public: GLRenderManager(); ~GLRenderManager(); + void SetErrorCallback(ErrorCallbackFn callback, void *userdata) { + queueRunner_.SetErrorCallback(callback, userdata); + } + void ThreadStart(Draw::DrawContext *draw); void ThreadEnd(); bool ThreadFrame(); // Returns false to request exiting the loop. diff --git a/Common/GPU/OpenGL/thin3d_gl.cpp b/Common/GPU/OpenGL/thin3d_gl.cpp index be13d312e8..76f0fa7230 100644 --- a/Common/GPU/OpenGL/thin3d_gl.cpp +++ b/Common/GPU/OpenGL/thin3d_gl.cpp @@ -354,6 +354,10 @@ public: } uint32_t GetDataFormatSupport(DataFormat fmt) const override; + void SetErrorCallback(ErrorCallbackFn callback, void *userdata) override { + renderManager_.SetErrorCallback(callback, userdata); + } + DepthStencilState *CreateDepthStencilState(const DepthStencilStateDesc &desc) override; BlendState *CreateBlendState(const BlendStateDesc &desc) override; SamplerState *CreateSamplerState(const SamplerStateDesc &desc) override; diff --git a/Common/GPU/Shader.h b/Common/GPU/Shader.h index 9457a8461b..c19753420a 100644 --- a/Common/GPU/Shader.h +++ b/Common/GPU/Shader.h @@ -41,3 +41,8 @@ struct ShaderLanguageDesc { bool forceMatrix4x4 = false; bool coefsFromBuffers = false; }; + +// For passing error messages from shader compilation (and other critical issues) back to the host. +// This can run on any thread - be aware! +// TODO: See if we can find a less generic name for this. +typedef void (*ErrorCallbackFn)(const char *shortDesc, const char *details, void *userdata); diff --git a/Common/GPU/thin3d.h b/Common/GPU/thin3d.h index 8aeaa819b2..9b55995eef 100644 --- a/Common/GPU/thin3d.h +++ b/Common/GPU/thin3d.h @@ -567,6 +567,8 @@ public: virtual uint32_t GetSupportedShaderLanguages() const = 0; + virtual void SetErrorCallback(ErrorCallbackFn callback, void *userdata) {} + // Partial pipeline state, used to create pipelines. (in practice, in d3d11 they'll use the native state objects directly). virtual DepthStencilState *CreateDepthStencilState(const DepthStencilStateDesc &desc) = 0; virtual BlendState *CreateBlendState(const BlendStateDesc &desc) = 0; diff --git a/GPU/GLES/ShaderManagerGLES.cpp b/GPU/GLES/ShaderManagerGLES.cpp index e86573a1e8..be3358c959 100644 --- a/GPU/GLES/ShaderManagerGLES.cpp +++ b/GPU/GLES/ShaderManagerGLES.cpp @@ -801,6 +801,7 @@ LinkedShader *ShaderManagerGLES::ApplyFragmentShader(VShaderID VSID, Shader *vs, Shader *fs = fsCache_.Get(FSID); if (!fs) { // Fragment shader not in cache. Let's compile it. + // Can't really tell if we succeeded since the compile is on the GPU thread later. fs = CompileFragmentShader(FSID); fsCache_.Insert(FSID, fs); diskCacheDirty_ = true; diff --git a/Windows/GPU/WindowsGLContext.cpp b/Windows/GPU/WindowsGLContext.cpp index 765321c903..e919a10420 100644 --- a/Windows/GPU/WindowsGLContext.cpp +++ b/Windows/GPU/WindowsGLContext.cpp @@ -27,6 +27,7 @@ #include "Core/Config.h" #include "Core/ConfigValues.h" #include "Core/Core.h" +#include "Core/Host.h" #include "Common/Data/Encoding/Utf8.h" #include "Common/Data/Text/I18n.h" #include "UI/OnScreenDisplay.h" @@ -420,6 +421,10 @@ bool WindowsGLContext::InitFromRenderThread(std::string *error_message) { return false; } + draw_->SetErrorCallback([](const char *shortDesc, const char *details, void *userdata) { + host->NotifyUserMessage(details, 5.0, 0xFFFFFFFF, "error_callback"); + }, nullptr); + // These are auto-reset events. pauseEvent = CreateEvent(NULL, FALSE, FALSE, NULL); resumeEvent = CreateEvent(NULL, FALSE, FALSE, NULL); diff --git a/android/jni/app-android.cpp b/android/jni/app-android.cpp index e36e15ab92..82a69e8c27 100644 --- a/android/jni/app-android.cpp +++ b/android/jni/app-android.cpp @@ -82,6 +82,7 @@ struct JNIEnv {}; #include "Core/System.h" #include "Core/HLE/sceUsbCam.h" #include "Core/HLE/sceUsbGps.h" +#include "Core/Host.h" #include "Common/CPUDetect.h" #include "Common/Log.h" #include "UI/GameInfoCache.h" @@ -777,6 +778,10 @@ extern "C" bool Java_org_ppsspp_ppsspp_NativeRenderer_displayInit(JNIEnv * env, return false; } + graphicsContext->GetDrawContext()->SetErrorCallback([](const char *shortDesc, const char *details, void *userdata) { + host->NotifyUserMessage(details, 5.0, 0xFFFFFFFF, "error_callback"); + }, nullptr); + if (useCPUThread) { EmuThreadStart(); } else { @@ -795,6 +800,11 @@ extern "C" bool Java_org_ppsspp_ppsspp_NativeRenderer_displayInit(JNIEnv * env, SystemToast("Graphics initialization failed. Quitting."); return false; } + + graphicsContext->GetDrawContext()->SetErrorCallback([](const char *shortDesc, const char *details, void *userdata) { + host->NotifyUserMessage(details, 5.0, 0xFFFFFFFF, "error_callback"); + }, nullptr); + graphicsContext->ThreadStart(); renderer_inited = true; } diff --git a/ios/ViewController.mm b/ios/ViewController.mm index 02b18a5ec5..1f665e4b37 100644 --- a/ios/ViewController.mm +++ b/ios/ViewController.mm @@ -34,6 +34,7 @@ #include "Core/System.h" #include "Core/HLE/sceUsbCam.h" #include "Core/HLE/sceUsbGps.h" +#include "Core/Host.h" #include #include @@ -202,6 +203,10 @@ static LocationHelper *locationHelper; graphicsContext = new IOSGraphicsContext(); + graphicsContext->GetDrawContext()->SetErrorCallback([](const char *shortDesc, const char *details, void *userdata) { + host->NotifyUserMessage(details, 5.0, 0xFFFFFFFF, "error_callback"); + }, nullptr); + graphicsContext->ThreadStart(); dp_xscale = (float)dp_xres / (float)pixel_xres; From 6db943e831654f9cb10b6d7af5111a6adbc4f81a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Thu, 5 Nov 2020 08:34:35 +0100 Subject: [PATCH 193/275] Merge the two ShaderStage enums --- Common/GPU/D3D11/thin3d_d3d11.cpp | 22 ++++++++--------- Common/GPU/D3D9/thin3d_d3d9.cpp | 12 ++++----- Common/GPU/OpenGL/thin3d_gl.cpp | 10 +++----- Common/GPU/Shader.h | 4 ++- Common/GPU/Vulkan/thin3d_vulkan.cpp | 10 +++----- Common/GPU/thin3d.cpp | 10 ++++---- Common/GPU/thin3d.h | 9 ------- GPU/Common/PresentationCommon.cpp | 6 ++--- GPU/Common/PresentationCommon.h | 2 +- GPU/Common/ShaderTranslation.cpp | 38 ++++++++++++++--------------- GPU/Common/ShaderTranslation.h | 2 +- UI/GPUDriverTestScreen.cpp | 2 +- 12 files changed, 56 insertions(+), 71 deletions(-) diff --git a/Common/GPU/D3D11/thin3d_d3d11.cpp b/Common/GPU/D3D11/thin3d_d3d11.cpp index 2c1aaeb1f6..ed7de24771 100644 --- a/Common/GPU/D3D11/thin3d_d3d11.cpp +++ b/Common/GPU/D3D11/thin3d_d3d11.cpp @@ -892,16 +892,14 @@ ShaderModule *D3D11DrawContext::CreateShaderModule(ShaderStage stage, ShaderLang std::string errors; const char *target = nullptr; switch (stage) { - case ShaderStage::FRAGMENT: target = fragmentModel; break; - case ShaderStage::VERTEX: target = vertexModel; break; - case ShaderStage::GEOMETRY: + case ShaderStage::Fragment: target = fragmentModel; break; + case ShaderStage::Vertex: target = vertexModel; break; + case ShaderStage::Geometry: if (!geometryModel) return nullptr; target = geometryModel; break; - case ShaderStage::COMPUTE: - case ShaderStage::CONTROL: - case ShaderStage::EVALUATION: + case ShaderStage::Compute: default: Crash(); break; @@ -935,13 +933,13 @@ ShaderModule *D3D11DrawContext::CreateShaderModule(ShaderStage stage, ShaderLang module->stage = stage; module->byteCode_ = std::vector(data, data + dataSize); switch (stage) { - case ShaderStage::VERTEX: + case ShaderStage::Vertex: result = device_->CreateVertexShader(data, dataSize, nullptr, &module->vs); break; - case ShaderStage::FRAGMENT: + case ShaderStage::Fragment: result = device_->CreatePixelShader(data, dataSize, nullptr, &module->ps); break; - case ShaderStage::GEOMETRY: + case ShaderStage::Geometry: result = device_->CreateGeometryShader(data, dataSize, nullptr, &module->gs); break; default: @@ -986,14 +984,14 @@ Pipeline *D3D11DrawContext::CreateGraphicsPipeline(const PipelineDesc &desc) { D3D11ShaderModule *module = (D3D11ShaderModule *)iter; shaders.push_back(module); switch (module->GetStage()) { - case ShaderStage::VERTEX: + case ShaderStage::Vertex: vshader = module; dPipeline->vs = module->vs; break; - case ShaderStage::FRAGMENT: + case ShaderStage::Fragment: dPipeline->ps = module->ps; break; - case ShaderStage::GEOMETRY: + case ShaderStage::Geometry: dPipeline->gs = module->gs; break; } diff --git a/Common/GPU/D3D9/thin3d_d3d9.cpp b/Common/GPU/D3D9/thin3d_d3d9.cpp index 6c7b5c233f..d495814b48 100644 --- a/Common/GPU/D3D9/thin3d_d3d9.cpp +++ b/Common/GPU/D3D9/thin3d_d3d9.cpp @@ -254,7 +254,7 @@ public: } bool Compile(LPDIRECT3DDEVICE9 device, const uint8_t *data, size_t size); void Apply(LPDIRECT3DDEVICE9 device) { - if (stage_ == ShaderStage::FRAGMENT) { + if (stage_ == ShaderStage::Fragment) { device->SetPixelShader(pshader_); } else { device->SetVertexShader(vshader_); @@ -697,10 +697,10 @@ Pipeline *D3D9Context::CreateGraphicsPipeline(const PipelineDesc &desc) { delete pipeline; return NULL; } - if (iter->GetStage() == ShaderStage::FRAGMENT) { + if (iter->GetStage() == ShaderStage::Fragment) { pipeline->pshader = static_cast(iter); } - else if (iter->GetStage() == ShaderStage::VERTEX) { + else if (iter->GetStage() == ShaderStage::Vertex) { pipeline->vshader = static_cast(iter); } } @@ -1034,10 +1034,10 @@ bool D3D9ShaderModule::Compile(LPDIRECT3DDEVICE9 device, const uint8_t *data, si auto compile = [&](const char *profile) -> HRESULT { return dyn_D3DCompile(source, (UINT)strlen(source), nullptr, defines, includes, "main", profile, 0, 0, &codeBuffer, &errorBuffer); }; - HRESULT hr = compile(stage_ == ShaderStage::FRAGMENT ? "ps_2_0" : "vs_2_0"); + HRESULT hr = compile(stage_ == ShaderStage::Fragment ? "ps_2_0" : "vs_2_0"); if (FAILED(hr) && hr == D3DXERR_INVALIDDATA) { // Might be a post shader. Let's try using shader model 3. - hr = compile(stage_ == ShaderStage::FRAGMENT ? "ps_3_0" : "vs_3_0"); + hr = compile(stage_ == ShaderStage::Fragment ? "ps_3_0" : "vs_3_0"); } if (FAILED(hr)) { const char *error = errorBuffer ? (const char *)errorBuffer->GetBufferPointer() : "(no errorbuffer returned)"; @@ -1055,7 +1055,7 @@ bool D3D9ShaderModule::Compile(LPDIRECT3DDEVICE9 device, const uint8_t *data, si } bool success = false; - if (stage_ == ShaderStage::FRAGMENT) { + if (stage_ == ShaderStage::Fragment) { HRESULT result = device->CreatePixelShader((DWORD *)codeBuffer->GetBufferPointer(), &pshader_); success = SUCCEEDED(result); } else { diff --git a/Common/GPU/OpenGL/thin3d_gl.cpp b/Common/GPU/OpenGL/thin3d_gl.cpp index 76f0fa7230..8d620ceae9 100644 --- a/Common/GPU/OpenGL/thin3d_gl.cpp +++ b/Common/GPU/OpenGL/thin3d_gl.cpp @@ -214,14 +214,12 @@ public: GLuint ShaderStageToOpenGL(ShaderStage stage) { switch (stage) { - case ShaderStage::VERTEX: return GL_VERTEX_SHADER; + case ShaderStage::Vertex: return GL_VERTEX_SHADER; #ifndef USING_GLES2 - case ShaderStage::COMPUTE: return GL_COMPUTE_SHADER; - case ShaderStage::EVALUATION: return GL_TESS_EVALUATION_SHADER; - case ShaderStage::CONTROL: return GL_TESS_CONTROL_SHADER; - case ShaderStage::GEOMETRY: return GL_GEOMETRY_SHADER; + case ShaderStage::Compute: return GL_COMPUTE_SHADER; + case ShaderStage::Geometry: return GL_GEOMETRY_SHADER; #endif - case ShaderStage::FRAGMENT: + case ShaderStage::Fragment: default: return GL_FRAGMENT_SHADER; } diff --git a/Common/GPU/Shader.h b/Common/GPU/Shader.h index c19753420a..e5adc8b514 100644 --- a/Common/GPU/Shader.h +++ b/Common/GPU/Shader.h @@ -17,7 +17,9 @@ inline bool ShaderLanguageIsOpenGL(ShaderLanguage lang) { enum class ShaderStage { Vertex, - Fragment + Fragment, + Geometry, + Compute, }; struct ShaderLanguageDesc { diff --git a/Common/GPU/Vulkan/thin3d_vulkan.cpp b/Common/GPU/Vulkan/thin3d_vulkan.cpp index d097e283f2..5f5ad3b808 100644 --- a/Common/GPU/Vulkan/thin3d_vulkan.cpp +++ b/Common/GPU/Vulkan/thin3d_vulkan.cpp @@ -171,13 +171,11 @@ public: VkShaderStageFlagBits StageToVulkan(ShaderStage stage) { switch (stage) { - case ShaderStage::VERTEX: return VK_SHADER_STAGE_VERTEX_BIT; - case ShaderStage::GEOMETRY: return VK_SHADER_STAGE_GEOMETRY_BIT; - case ShaderStage::COMPUTE: return VK_SHADER_STAGE_COMPUTE_BIT; - case ShaderStage::EVALUATION: return VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT; - case ShaderStage::CONTROL: return VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT; + case ShaderStage::Vertex: return VK_SHADER_STAGE_VERTEX_BIT; + case ShaderStage::Geometry: return VK_SHADER_STAGE_GEOMETRY_BIT; + case ShaderStage::Compute: return VK_SHADER_STAGE_COMPUTE_BIT; default: - case ShaderStage::FRAGMENT: return VK_SHADER_STAGE_FRAGMENT_BIT; + case ShaderStage::Fragment: return VK_SHADER_STAGE_FRAGMENT_BIT; } } diff --git a/Common/GPU/thin3d.cpp b/Common/GPU/thin3d.cpp index 0c1b8917a1..3b320fd842 100644 --- a/Common/GPU/thin3d.cpp +++ b/Common/GPU/thin3d.cpp @@ -367,12 +367,12 @@ ShaderModule *CreateShader(DrawContext *draw, ShaderStage stage, const std::vect } bool DrawContext::CreatePresets() { - vsPresets_[VS_TEXTURE_COLOR_2D] = CreateShader(this, ShaderStage::VERTEX, vsTexCol); - vsPresets_[VS_COLOR_2D] = CreateShader(this, ShaderStage::VERTEX, vsCol); + vsPresets_[VS_TEXTURE_COLOR_2D] = CreateShader(this, ShaderStage::Vertex, vsTexCol); + vsPresets_[VS_COLOR_2D] = CreateShader(this, ShaderStage::Vertex, vsCol); - fsPresets_[FS_TEXTURE_COLOR_2D] = CreateShader(this, ShaderStage::FRAGMENT, fsTexCol); - fsPresets_[FS_COLOR_2D] = CreateShader(this, ShaderStage::FRAGMENT, fsCol); - fsPresets_[FS_TEXTURE_COLOR_2D_RB_SWIZZLE] = CreateShader(this, ShaderStage::FRAGMENT, fsTexColRBSwizzle); + fsPresets_[FS_TEXTURE_COLOR_2D] = CreateShader(this, ShaderStage::Fragment, fsTexCol); + fsPresets_[FS_COLOR_2D] = CreateShader(this, ShaderStage::Fragment, fsCol); + fsPresets_[FS_TEXTURE_COLOR_2D_RB_SWIZZLE] = CreateShader(this, ShaderStage::Fragment, fsTexColRBSwizzle); return vsPresets_[VS_TEXTURE_COLOR_2D] && vsPresets_[VS_COLOR_2D] && fsPresets_[FS_TEXTURE_COLOR_2D] && fsPresets_[FS_COLOR_2D] && fsPresets_[FS_TEXTURE_COLOR_2D_RB_SWIZZLE]; } diff --git a/Common/GPU/thin3d.h b/Common/GPU/thin3d.h index 9b55995eef..87238eb3e3 100644 --- a/Common/GPU/thin3d.h +++ b/Common/GPU/thin3d.h @@ -162,15 +162,6 @@ enum class TextureType : uint8_t { ARRAY2D, }; -enum class ShaderStage { - VERTEX, - FRAGMENT, - GEOMETRY, - CONTROL, // HULL - EVALUATION, // DOMAIN - COMPUTE, -}; - enum class CullMode : uint8_t { NONE, FRONT, diff --git a/GPU/Common/PresentationCommon.cpp b/GPU/Common/PresentationCommon.cpp index 7636619e24..54fdccfb3b 100644 --- a/GPU/Common/PresentationCommon.cpp +++ b/GPU/Common/PresentationCommon.cpp @@ -240,8 +240,8 @@ bool PresentationCommon::BuildPostShader(const ShaderInfo *shaderInfo, const Sha } std::string vsError, fsError; - Draw::ShaderModule *vs = CompileShaderModule(Draw::ShaderStage::VERTEX, GLSL_1xx, vsSourceGLSL, &vsError); - Draw::ShaderModule *fs = CompileShaderModule(Draw::ShaderStage::FRAGMENT, GLSL_1xx, fsSourceGLSL, &fsError); + Draw::ShaderModule *vs = CompileShaderModule(ShaderStage::Vertex, GLSL_1xx, vsSourceGLSL, &vsError); + Draw::ShaderModule *fs = CompileShaderModule(ShaderStage::Fragment, GLSL_1xx, fsSourceGLSL, &fsError); // Don't worry, CompileShaderModule makes sure they get freed if one succeeded. if (!fs || !vs) { @@ -465,7 +465,7 @@ void PresentationCommon::DestroyPostShader() { postShaderFBOUsage_.clear(); } -Draw::ShaderModule *PresentationCommon::CompileShaderModule(Draw::ShaderStage stage, ShaderLanguage lang, const std::string &src, std::string *errorString) { +Draw::ShaderModule *PresentationCommon::CompileShaderModule(ShaderStage stage, ShaderLanguage lang, const std::string &src, std::string *errorString) { std::string translated = src; bool translationFailed = false; if (lang != lang_) { diff --git a/GPU/Common/PresentationCommon.h b/GPU/Common/PresentationCommon.h index 2616e2dfd5..0102c3fbcf 100644 --- a/GPU/Common/PresentationCommon.h +++ b/GPU/Common/PresentationCommon.h @@ -109,7 +109,7 @@ protected: void ShowPostShaderError(const std::string &errorString); - Draw::ShaderModule *CompileShaderModule(Draw::ShaderStage stage, ShaderLanguage lang, const std::string &src, std::string *errorString); + Draw::ShaderModule *CompileShaderModule(ShaderStage stage, ShaderLanguage lang, const std::string &src, std::string *errorString); Draw::Pipeline *CreatePipeline(std::vector shaders, bool postShader, const Draw::UniformBufferDesc *uniformDesc); bool BuildPostShader(const ShaderInfo *shaderInfo, const ShaderInfo *next); bool AllocateFramebuffer(int w, int h); diff --git a/GPU/Common/ShaderTranslation.cpp b/GPU/Common/ShaderTranslation.cpp index e32d3fb615..4307bfcf93 100644 --- a/GPU/Common/ShaderTranslation.cpp +++ b/GPU/Common/ShaderTranslation.cpp @@ -53,14 +53,12 @@ extern void init_resources(TBuiltInResource &Resources); -static EShLanguage GetLanguage(const Draw::ShaderStage stage) { +static EShLanguage GetLanguage(const ShaderStage stage) { switch (stage) { - case Draw::ShaderStage::VERTEX: return EShLangVertex; - case Draw::ShaderStage::CONTROL: return EShLangTessControl; - case Draw::ShaderStage::EVALUATION: return EShLangTessEvaluation; - case Draw::ShaderStage::GEOMETRY: return EShLangGeometry; - case Draw::ShaderStage::FRAGMENT: return EShLangFragment; - case Draw::ShaderStage::COMPUTE: return EShLangCompute; + case ShaderStage::Vertex: return EShLangVertex; + case ShaderStage::Geometry: return EShLangGeometry; + case ShaderStage::Fragment: return EShLangFragment; + case ShaderStage::Compute: return EShLangCompute; default: return EShLangVertex; } } @@ -77,7 +75,7 @@ void ShaderTranslationShutdown() { #endif } -std::string Preprocess(std::string code, ShaderLanguage lang, Draw::ShaderStage stage) { +std::string Preprocess(std::string code, ShaderLanguage lang, ShaderStage stage) { // This takes GL up to the version we need. return code; } @@ -126,7 +124,7 @@ float u_video : register(c5); // Also we need to rip out single uniforms and replace them with blocks. // Should probably do it in the source shader instead and then back translate to old style GLSL, but // SPIRV-Cross currently won't compile with the Android NDK so I can't be bothered. -std::string Postprocess(std::string code, ShaderLanguage lang, Draw::ShaderStage stage) { +std::string Postprocess(std::string code, ShaderLanguage lang, ShaderStage stage) { if (lang != HLSL_D3D11 && lang != HLSL_D3D9) return code; @@ -159,24 +157,24 @@ std::string Postprocess(std::string code, ShaderLanguage lang, Draw::ShaderStage return output; } -bool ConvertToVulkanGLSL(std::string *dest, TranslatedShaderMetadata *destMetadata, std::string src, Draw::ShaderStage stage, std::string *errorMessage) { +bool ConvertToVulkanGLSL(std::string *dest, TranslatedShaderMetadata *destMetadata, std::string src, ShaderStage stage, std::string *errorMessage) { std::stringstream out; static struct { - Draw::ShaderStage stage; + ShaderStage stage; const char *needle; const char *replacement; } replacements[] = { - { Draw::ShaderStage::VERTEX, "attribute vec4 a_position;", "layout(location = 0) in vec4 a_position;" }, - { Draw::ShaderStage::VERTEX, "attribute vec2 a_texcoord0;", "layout(location = 2) in vec2 a_texcoord0;"}, - { Draw::ShaderStage::VERTEX, "varying vec2 v_position;", "layout(location = 0) out vec2 v_position;" }, - { Draw::ShaderStage::FRAGMENT, "varying vec2 v_position;", "layout(location = 0) in vec2 v_position;" }, - { Draw::ShaderStage::FRAGMENT, "texture2D(", "texture(" }, - { Draw::ShaderStage::FRAGMENT, "gl_FragColor", "fragColor0" }, + { ShaderStage::Vertex, "attribute vec4 a_position;", "layout(location = 0) in vec4 a_position;" }, + { ShaderStage::Vertex, "attribute vec2 a_texcoord0;", "layout(location = 2) in vec2 a_texcoord0;"}, + { ShaderStage::Vertex, "varying vec2 v_position;", "layout(location = 0) out vec2 v_position;" }, + { ShaderStage::Fragment, "varying vec2 v_position;", "layout(location = 0) in vec2 v_position;" }, + { ShaderStage::Fragment, "texture2D(", "texture(" }, + { ShaderStage::Fragment, "gl_FragColor", "fragColor0" }, }; out << vulkanPrologue; - if (stage == Draw::ShaderStage::FRAGMENT) { + if (stage == ShaderStage::Fragment) { out << "layout (location = 0) out vec4 fragColor0;\n"; } // Output the uniform buffer. @@ -198,7 +196,7 @@ bool ConvertToVulkanGLSL(std::string *dest, TranslatedShaderMetadata *destMetada } else if (line.find("uniform ") != std::string::npos) { continue; } else if (2 == sscanf(line.c_str(), "varying vec%d v_texcoord%d;", &vecSize, &num)) { - if (stage == Draw::ShaderStage::FRAGMENT) { + if (stage == ShaderStage::Fragment) { line = StringFromFormat("layout(location = %d) in vec%d v_texcoord%d;", num, vecSize, num); } else { line = StringFromFormat("layout(location = %d) out vec%d v_texcoord%d;", num, vecSize, num); @@ -219,7 +217,7 @@ bool ConvertToVulkanGLSL(std::string *dest, TranslatedShaderMetadata *destMetada return true; } -bool TranslateShader(std::string *dest, ShaderLanguage destLang, TranslatedShaderMetadata *destMetadata, std::string src, ShaderLanguage srcLang, Draw::ShaderStage stage, std::string *errorMessage) { +bool TranslateShader(std::string *dest, ShaderLanguage destLang, TranslatedShaderMetadata *destMetadata, std::string src, ShaderLanguage srcLang, ShaderStage stage, std::string *errorMessage) { if (srcLang != GLSL_3xx && srcLang != GLSL_1xx) return false; diff --git a/GPU/Common/ShaderTranslation.h b/GPU/Common/ShaderTranslation.h index e5f92d8ef8..3f1a80d3d6 100644 --- a/GPU/Common/ShaderTranslation.h +++ b/GPU/Common/ShaderTranslation.h @@ -29,4 +29,4 @@ struct TranslatedShaderMetadata { void ShaderTranslationInit(); void ShaderTranslationShutdown(); -bool TranslateShader(std::string *dst, ShaderLanguage destLang, TranslatedShaderMetadata *destMetadata, std::string src, ShaderLanguage srcLang, Draw::ShaderStage stage, std::string *errorMessage); +bool TranslateShader(std::string *dst, ShaderLanguage destLang, TranslatedShaderMetadata *destMetadata, std::string src, ShaderLanguage srcLang, ShaderStage stage, std::string *errorMessage); diff --git a/UI/GPUDriverTestScreen.cpp b/UI/GPUDriverTestScreen.cpp index 8089550e25..297d1e55e8 100644 --- a/UI/GPUDriverTestScreen.cpp +++ b/UI/GPUDriverTestScreen.cpp @@ -102,7 +102,7 @@ void GPUDriverTestScreen::DiscardTest() { // Create the special shader module. - discardFragShader_ = CreateShader(draw, Draw::ShaderStage::FRAGMENT, fsDiscard); + discardFragShader_ = CreateShader(draw, ShaderStage::Fragment, fsDiscard); InputLayout *inputLayout = ui_draw2d.CreateInputLayout(draw); BlendState *blendOff = draw->CreateBlendState({ false, 0xF }); From d39badc8c1a63b7fda001d49963e09ab023f0fed Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Thu, 5 Nov 2020 08:49:55 +0100 Subject: [PATCH 194/275] Inline "OptimizeDownloadRange" to make the code more readable --- GPU/Common/FramebufferManagerCommon.cpp | 63 ++++++++++++------------- GPU/Common/FramebufferManagerCommon.h | 1 - 2 files changed, 31 insertions(+), 33 deletions(-) diff --git a/GPU/Common/FramebufferManagerCommon.cpp b/GPU/Common/FramebufferManagerCommon.cpp index 502742c6a4..6a269d2a54 100644 --- a/GPU/Common/FramebufferManagerCommon.cpp +++ b/GPU/Common/FramebufferManagerCommon.cpp @@ -1556,36 +1556,6 @@ void FramebufferManagerCommon::ApplyClearToMemory(int x1, int y1, int x2, int y2 } } -void FramebufferManagerCommon::OptimizeDownloadRange(VirtualFramebuffer * vfb, int & x, int & y, int & w, int & h) { - if (gameUsesSequentialCopies_) { - // Ignore the x/y/etc., read the entire thing. - x = 0; - y = 0; - w = vfb->width; - h = vfb->height; - } - if (x == 0 && y == 0 && w == vfb->width && h == vfb->height) { - // Mark it as fully downloaded until next render to it. - vfb->memoryUpdated = true; - vfb->usageFlags |= FB_USAGE_DOWNLOAD; - } else { - // Let's try to set the flag eventually, if the game copies a lot. - // Some games copy subranges very frequently. - const static int FREQUENT_SEQUENTIAL_COPIES = 3; - static int frameLastCopy = 0; - static u32 bufferLastCopy = 0; - static int copiesThisFrame = 0; - if (frameLastCopy != gpuStats.numFlips || bufferLastCopy != vfb->fb_address) { - frameLastCopy = gpuStats.numFlips; - bufferLastCopy = vfb->fb_address; - copiesThisFrame = 0; - } - if (++copiesThisFrame > FREQUENT_SEQUENTIAL_COPIES) { - gameUsesSequentialCopies_ = true; - } - } -} - bool FramebufferManagerCommon::NotifyBlockTransferBefore(u32 dstBasePtr, int dstStride, int dstX, int dstY, u32 srcBasePtr, int srcStride, int srcX, int srcY, int width, int height, int bpp, u32 skipDrawReason) { if (!useBufferedRendering_) { return false; @@ -2045,7 +2015,35 @@ void FramebufferManagerCommon::ReadFramebufferToMemory(VirtualFramebuffer *vfb, } if (vfb && vfb->fbo) { // We'll pseudo-blit framebuffers here to get a resized version of vfb. - OptimizeDownloadRange(vfb, x, y, w, h); + if (gameUsesSequentialCopies_) { + // Ignore the x/y/etc., read the entire thing. + x = 0; + y = 0; + w = vfb->width; + h = vfb->height; + vfb->memoryUpdated = true; + vfb->usageFlags |= FB_USAGE_DOWNLOAD; + } else if (x == 0 && y == 0 && w == vfb->width && h == vfb->height) { + // Mark it as fully downloaded until next render to it. + vfb->memoryUpdated = true; + vfb->usageFlags |= FB_USAGE_DOWNLOAD; + } else { + // Let's try to set the flag eventually, if the game copies a lot. + // Some games copy subranges very frequently. + const static int FREQUENT_SEQUENTIAL_COPIES = 3; + static int frameLastCopy = 0; + static u32 bufferLastCopy = 0; + static int copiesThisFrame = 0; + if (frameLastCopy != gpuStats.numFlips || bufferLastCopy != vfb->fb_address) { + frameLastCopy = gpuStats.numFlips; + bufferLastCopy = vfb->fb_address; + copiesThisFrame = 0; + } + if (++copiesThisFrame > FREQUENT_SEQUENTIAL_COPIES) { + gameUsesSequentialCopies_ = true; + } + } + if (vfb->renderWidth == vfb->width && vfb->renderHeight == vfb->height) { // No need to blit PackFramebufferSync_(vfb, x, y, w, h); @@ -2089,7 +2087,8 @@ void FramebufferManagerCommon::DownloadFramebufferForClut(u32 fb_address, u32 lo // No need to download if we already have it. if (w > 0 && h > 0 && !vfb->memoryUpdated && vfb->clutUpdatedBytes < loadBytes) { - // We intentionally don't call OptimizeDownloadRange() here - we don't want to over download. + // We intentionally don't try to optimize into a full download here - we don't want to over download. + // CLUT framebuffers are often incorrectly estimated in size. if (x == 0 && y == 0 && w == vfb->width && h == vfb->height) { vfb->memoryUpdated = true; diff --git a/GPU/Common/FramebufferManagerCommon.h b/GPU/Common/FramebufferManagerCommon.h index ca3b69f5cb..acdab123ab 100644 --- a/GPU/Common/FramebufferManagerCommon.h +++ b/GPU/Common/FramebufferManagerCommon.h @@ -353,7 +353,6 @@ protected: virtual void UpdateDownloadTempBuffer(VirtualFramebuffer *nvfb) = 0; VirtualFramebuffer *CreateRAMFramebuffer(uint32_t fbAddress, int width, int height, int stride, GEBufferFormat format); - void OptimizeDownloadRange(VirtualFramebuffer *vfb, int &x, int &y, int &w, int &h); void UpdateFramebufUsage(VirtualFramebuffer *vfb); From 127cf4148090ec75ad38052960a3254e8ec6fe21 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Thu, 5 Nov 2020 08:51:29 +0100 Subject: [PATCH 195/275] Fix bug in framebuffer naming --- GPU/Common/FramebufferManagerCommon.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/GPU/Common/FramebufferManagerCommon.cpp b/GPU/Common/FramebufferManagerCommon.cpp index 6a269d2a54..5e5bded88d 100644 --- a/GPU/Common/FramebufferManagerCommon.cpp +++ b/GPU/Common/FramebufferManagerCommon.cpp @@ -1090,7 +1090,7 @@ void FramebufferManagerCommon::ResizeFramebufFBO(VirtualFramebuffer *vfb, int w, shaderManager_->DirtyLastShader(); char tag[256]; - snprintf(tag, sizeof(tag), "%08x_%08x_%dx%d_%s", vfb->fb_address, vfb->z_address, w, h, GeBufferFormatToString((GEBufferFormat)vfb->colorDepth)); + snprintf(tag, sizeof(tag), "%08x_%08x_%dx%d_%s", vfb->fb_address, vfb->z_address, w, h, GeBufferFormatToString(vfb->format)); vfb->fbo = draw_->CreateFramebuffer({ vfb->renderWidth, vfb->renderHeight, 1, 1, true, (Draw::FBColorDepth)vfb->colorDepth, tag }); if (old.fbo) { INFO_LOG(FRAMEBUF, "Resizing FBO for %08x : %dx%dx%s", vfb->fb_address, w, h, GeBufferFormatToString(vfb->format)); From 7b2236778b0f54c4ece821b6ab2bf52a5b647223 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Thu, 5 Nov 2020 14:38:20 +0100 Subject: [PATCH 196/275] Remove remnants of an old, no longer applicable readback optimization --- Common/GPU/OpenGL/GLQueueRunner.cpp | 1 - GPU/Common/FramebufferManagerCommon.cpp | 40 ++++--------------------- GPU/Common/FramebufferManagerCommon.h | 2 -- GPU/D3D11/FramebufferManagerD3D11.cpp | 4 --- GPU/D3D11/FramebufferManagerD3D11.h | 2 -- GPU/D3D11/GPU_D3D11.cpp | 1 - GPU/Directx9/FramebufferManagerDX9.cpp | 4 --- GPU/Directx9/FramebufferManagerDX9.h | 2 -- GPU/Directx9/GPU_DX9.cpp | 1 - GPU/GLES/FramebufferManagerGLES.cpp | 12 -------- GPU/GLES/FramebufferManagerGLES.h | 2 -- GPU/GLES/GPU_GLES.cpp | 15 ---------- GPU/GPUState.h | 2 +- GPU/Vulkan/FramebufferManagerVulkan.cpp | 4 --- GPU/Vulkan/FramebufferManagerVulkan.h | 1 - GPU/Vulkan/GPU_Vulkan.cpp | 1 - 16 files changed, 7 insertions(+), 87 deletions(-) diff --git a/Common/GPU/OpenGL/GLQueueRunner.cpp b/Common/GPU/OpenGL/GLQueueRunner.cpp index e53721bb1b..b2914e7de0 100644 --- a/Common/GPU/OpenGL/GLQueueRunner.cpp +++ b/Common/GPU/OpenGL/GLQueueRunner.cpp @@ -1434,7 +1434,6 @@ void GLQueueRunner::PerformReadback(const GLRStep &pass) { if (convert && tempBuffer_ && readbackBuffer_) { ConvertFromRGBA8888(readbackBuffer_, tempBuffer_, pixelStride, pixelStride, rect.w, rect.h, pass.readback.dstFormat); } - CHECK_GL_ERROR_IF_DEBUG(); } diff --git a/GPU/Common/FramebufferManagerCommon.cpp b/GPU/Common/FramebufferManagerCommon.cpp index 5e5bded88d..a9c1b75ded 100644 --- a/GPU/Common/FramebufferManagerCommon.cpp +++ b/GPU/Common/FramebufferManagerCommon.cpp @@ -1431,14 +1431,16 @@ VirtualFramebuffer *FramebufferManagerCommon::FindDownloadTempBuffer(VirtualFram nvfb->drawnFormat = vfb->format; nvfb->colorDepth = vfb->colorDepth; - if (!CreateDownloadTempBuffer(nvfb)) { + char name[64]; + snprintf(name, sizeof(name), "download_temp"); + nvfb->fbo = draw_->CreateFramebuffer({ nvfb->bufferWidth, nvfb->bufferHeight, 1, 1, false, (Draw::FBColorDepth)nvfb->colorDepth, name }); + if (!nvfb->fbo) { delete nvfb; - return nullptr; + ERROR_LOG(FRAMEBUF, "Error creating download temp FBO! %d x %d", nvfb->renderWidth, nvfb->renderHeight); + return false; } bvfbs_.push_back(nvfb); - } else { - UpdateDownloadTempBuffer(nvfb); } nvfb->usageFlags |= FB_USAGE_RENDERTARGET; @@ -1448,36 +1450,6 @@ VirtualFramebuffer *FramebufferManagerCommon::FindDownloadTempBuffer(VirtualFram return nvfb; } -bool FramebufferManagerCommon::CreateDownloadTempBuffer(VirtualFramebuffer *nvfb) { - // When updating VRAM, it need to be exact format. - if (!gstate_c.Supports(GPU_PREFER_CPU_DOWNLOAD)) { - switch (nvfb->format) { - case GE_FORMAT_4444: - nvfb->colorDepth = Draw::FBO_4444; - break; - case GE_FORMAT_5551: - nvfb->colorDepth = Draw::FBO_5551; - break; - case GE_FORMAT_565: - nvfb->colorDepth = Draw::FBO_565; - break; - case GE_FORMAT_8888: - default: - nvfb->colorDepth = Draw::FBO_8888; - break; - } - } - - char name[64]; - snprintf(name, sizeof(name), "download_temp"); - nvfb->fbo = draw_->CreateFramebuffer({ nvfb->bufferWidth, nvfb->bufferHeight, 1, 1, false, (Draw::FBColorDepth)nvfb->colorDepth, name }); - if (!nvfb->fbo) { - ERROR_LOG(FRAMEBUF, "Error creating FBO! %d x %d", nvfb->renderWidth, nvfb->renderHeight); - return false; - } - return true; -} - void FramebufferManagerCommon::ApplyClearToMemory(int x1, int y1, int x2, int y2, u32 clearColor) { if (currentRenderVfb_) { if ((currentRenderVfb_->usageFlags & FB_USAGE_DOWNLOAD_CLEAR) != 0) { diff --git a/GPU/Common/FramebufferManagerCommon.h b/GPU/Common/FramebufferManagerCommon.h index acdab123ab..9bd22ff92a 100644 --- a/GPU/Common/FramebufferManagerCommon.h +++ b/GPU/Common/FramebufferManagerCommon.h @@ -349,8 +349,6 @@ protected: void DownloadFramebufferOnSwitch(VirtualFramebuffer *vfb); void FindTransferFramebuffers(VirtualFramebuffer *&dstBuffer, VirtualFramebuffer *&srcBuffer, u32 dstBasePtr, int dstStride, int &dstX, int &dstY, u32 srcBasePtr, int srcStride, int &srcX, int &srcY, int &srcWidth, int &srcHeight, int &dstWidth, int &dstHeight, int bpp); VirtualFramebuffer *FindDownloadTempBuffer(VirtualFramebuffer *vfb); - virtual bool CreateDownloadTempBuffer(VirtualFramebuffer *nvfb); - virtual void UpdateDownloadTempBuffer(VirtualFramebuffer *nvfb) = 0; VirtualFramebuffer *CreateRAMFramebuffer(uint32_t fbAddress, int width, int height, int stride, GEBufferFormat format); diff --git a/GPU/D3D11/FramebufferManagerD3D11.cpp b/GPU/D3D11/FramebufferManagerD3D11.cpp index 92734d5be6..900ac2892e 100644 --- a/GPU/D3D11/FramebufferManagerD3D11.cpp +++ b/GPU/D3D11/FramebufferManagerD3D11.cpp @@ -353,10 +353,6 @@ void FramebufferManagerD3D11::BindFramebufferAsColorTexture(int stage, VirtualFr } } -void FramebufferManagerD3D11::UpdateDownloadTempBuffer(VirtualFramebuffer *nvfb) { - // Nothing to do here. -} - void FramebufferManagerD3D11::SimpleBlit( Draw::Framebuffer *dest, float destX1, float destY1, float destX2, float destY2, Draw::Framebuffer *src, float srcX1, float srcY1, float srcX2, float srcY2, bool linearFilter) { diff --git a/GPU/D3D11/FramebufferManagerD3D11.h b/GPU/D3D11/FramebufferManagerD3D11.h index a8a4089198..6c88dd5855 100644 --- a/GPU/D3D11/FramebufferManagerD3D11.h +++ b/GPU/D3D11/FramebufferManagerD3D11.h @@ -58,8 +58,6 @@ protected: // Used by ReadFramebufferToMemory and later framebuffer block copies void BlitFramebuffer(VirtualFramebuffer *dst, int dstX, int dstY, VirtualFramebuffer *src, int srcX, int srcY, int w, int h, int bpp) override; - void UpdateDownloadTempBuffer(VirtualFramebuffer *nvfb) override; - private: void Bind2DShader() override; void PackDepthbuffer(VirtualFramebuffer *vfb, int x, int y, int w, int h); diff --git a/GPU/D3D11/GPU_D3D11.cpp b/GPU/D3D11/GPU_D3D11.cpp index a8f7b95fa6..63940fab8d 100644 --- a/GPU/D3D11/GPU_D3D11.cpp +++ b/GPU/D3D11/GPU_D3D11.cpp @@ -129,7 +129,6 @@ void GPU_D3D11::CheckGPUFeatures() { features |= GPU_SUPPORTS_VS_RANGE_CULLING; } features |= GPU_SUPPORTS_BLEND_MINMAX; - features |= GPU_PREFER_CPU_DOWNLOAD; // Accurate depth is required because the Direct3D API does not support inverse Z. // So we cannot incorrectly use the viewport transform as the depth range on Direct3D. diff --git a/GPU/Directx9/FramebufferManagerDX9.cpp b/GPU/Directx9/FramebufferManagerDX9.cpp index be182d77f1..a6f73c53b5 100644 --- a/GPU/Directx9/FramebufferManagerDX9.cpp +++ b/GPU/Directx9/FramebufferManagerDX9.cpp @@ -371,10 +371,6 @@ static const D3DVERTEXELEMENT9 g_FramebufferVertexElements[] = { } } - void FramebufferManagerDX9::UpdateDownloadTempBuffer(VirtualFramebuffer *nvfb) { - // Nothing to do here. - } - void FramebufferManagerDX9::BlitFramebuffer(VirtualFramebuffer *dst, int dstX, int dstY, VirtualFramebuffer *src, int srcX, int srcY, int w, int h, int bpp) { if (!dst->fbo || !src->fbo || !useBufferedRendering_) { // This can happen if we recently switched from non-buffered. diff --git a/GPU/Directx9/FramebufferManagerDX9.h b/GPU/Directx9/FramebufferManagerDX9.h index 3a8578599a..6884002eb3 100644 --- a/GPU/Directx9/FramebufferManagerDX9.h +++ b/GPU/Directx9/FramebufferManagerDX9.h @@ -69,8 +69,6 @@ protected: // Used by ReadFramebufferToMemory and later framebuffer block copies void BlitFramebuffer(VirtualFramebuffer *dst, int dstX, int dstY, VirtualFramebuffer *src, int srcX, int srcY, int w, int h, int bpp) override; - void UpdateDownloadTempBuffer(VirtualFramebuffer *nvfb) override; - private: void PackFramebufferSync_(VirtualFramebuffer *vfb, int x, int y, int w, int h) override; void PackDepthbuffer(VirtualFramebuffer *vfb, int x, int y, int w, int h); diff --git a/GPU/Directx9/GPU_DX9.cpp b/GPU/Directx9/GPU_DX9.cpp index 439b443cd7..b2f2b5aa11 100644 --- a/GPU/Directx9/GPU_DX9.cpp +++ b/GPU/Directx9/GPU_DX9.cpp @@ -164,7 +164,6 @@ void GPU_DX9::CheckGPUFeatures() { features |= GPU_SUPPORTS_16BIT_FORMATS; features |= GPU_SUPPORTS_BLEND_MINMAX; features |= GPU_SUPPORTS_TEXTURE_LOD_CONTROL; - features |= GPU_PREFER_CPU_DOWNLOAD; // Accurate depth is required because the Direct3D API does not support inverse Z. // So we cannot incorrectly use the viewport transform as the depth range on Direct3D. diff --git a/GPU/GLES/FramebufferManagerGLES.cpp b/GPU/GLES/FramebufferManagerGLES.cpp index 5ba89b5c4e..a7280d0d8c 100644 --- a/GPU/GLES/FramebufferManagerGLES.cpp +++ b/GPU/GLES/FramebufferManagerGLES.cpp @@ -293,18 +293,6 @@ void FramebufferManagerGLES::BindFramebufferAsColorTexture(int stage, VirtualFra } } -void FramebufferManagerGLES::UpdateDownloadTempBuffer(VirtualFramebuffer *nvfb) { - _assert_msg_(nvfb->fbo, "Expecting a valid nvfb in UpdateDownloadTempBuffer"); - - // Discard the previous contents of this buffer where possible. - if (gl_extensions.GLES3) { - draw_->BindFramebufferAsRenderTarget(nvfb->fbo, { Draw::RPAction::DONT_CARE, Draw::RPAction::DONT_CARE, Draw::RPAction::DONT_CARE }, "UpdateDownloadTempBuffer"); - } else if (gl_extensions.IsGLES) { - draw_->BindFramebufferAsRenderTarget(nvfb->fbo, { Draw::RPAction::CLEAR, Draw::RPAction::CLEAR, Draw::RPAction::CLEAR }, "UpdateDownloadTempBuffer"); - gstate_c.Dirty(DIRTY_BLEND_STATE); - } -} - void FramebufferManagerGLES::BlitFramebuffer(VirtualFramebuffer *dst, int dstX, int dstY, VirtualFramebuffer *src, int srcX, int srcY, int w, int h, int bpp) { if (!dst->fbo || !src->fbo || !useBufferedRendering_) { // This can happen if they recently switched from non-buffered. diff --git a/GPU/GLES/FramebufferManagerGLES.h b/GPU/GLES/FramebufferManagerGLES.h index 51d44af73c..590d2b22fa 100644 --- a/GPU/GLES/FramebufferManagerGLES.h +++ b/GPU/GLES/FramebufferManagerGLES.h @@ -62,8 +62,6 @@ protected: // Used by ReadFramebufferToMemory and later framebuffer block copies void BlitFramebuffer(VirtualFramebuffer *dst, int dstX, int dstY, VirtualFramebuffer *src, int srcX, int srcY, int w, int h, int bpp) override; - void UpdateDownloadTempBuffer(VirtualFramebuffer *nvfb) override; - private: void CreateDeviceObjects(); void DestroyDeviceObjects(); diff --git a/GPU/GLES/GPU_GLES.cpp b/GPU/GLES/GPU_GLES.cpp index 86fd6d8acf..fb18350c1e 100644 --- a/GPU/GLES/GPU_GLES.cpp +++ b/GPU/GLES/GPU_GLES.cpp @@ -189,21 +189,6 @@ void GPU_GLES::CheckGPUFeatures() { features |= GPU_SUPPORTS_VAO; } - bool useCPU = false; - if (!gl_extensions.IsGLES) { - // Some cards or drivers seem to always dither when downloading a framebuffer to 16-bit. - // This causes glitches in games that expect the exact values. - // It has not been experienced on NVIDIA cards, so those are left using the GPU (which is faster.) - if (gl_extensions.gpuVendor != GPU_VENDOR_NVIDIA || !gl_extensions.VersionGEThan(3, 0)) { - useCPU = true; - } - } else { - useCPU = true; - } - - if (useCPU) - features |= GPU_PREFER_CPU_DOWNLOAD; - if ((gl_extensions.gpuVendor == GPU_VENDOR_NVIDIA) || (gl_extensions.gpuVendor == GPU_VENDOR_AMD)) features |= GPU_PREFER_REVERSE_COLOR_ORDER; diff --git a/GPU/GPUState.h b/GPU/GPUState.h index b23b6fd1fb..0deaa9e8f0 100644 --- a/GPU/GPUState.h +++ b/GPU/GPUState.h @@ -493,7 +493,7 @@ enum { GPU_SUPPORTS_FRAMEBUFFER_BLIT_TO_DEPTH = FLAG_BIT(27), GPU_SUPPORTS_OES_TEXTURE_NPOT = FLAG_BIT(28), GPU_NEEDS_Z_EQUAL_W_HACK = FLAG_BIT(29), - GPU_PREFER_CPU_DOWNLOAD = FLAG_BIT(30), + // Free bit: 30 GPU_PREFER_REVERSE_COLOR_ORDER = FLAG_BIT(31), }; diff --git a/GPU/Vulkan/FramebufferManagerVulkan.cpp b/GPU/Vulkan/FramebufferManagerVulkan.cpp index 31ba520907..b3c92ecb5f 100644 --- a/GPU/Vulkan/FramebufferManagerVulkan.cpp +++ b/GPU/Vulkan/FramebufferManagerVulkan.cpp @@ -305,10 +305,6 @@ VkImageView FramebufferManagerVulkan::BindFramebufferAsColorTexture(int stage, V } } -void FramebufferManagerVulkan::UpdateDownloadTempBuffer(VirtualFramebuffer *nvfb) { - // Nothing to do here. -} - void FramebufferManagerVulkan::BlitFramebuffer(VirtualFramebuffer *dst, int dstX, int dstY, VirtualFramebuffer *src, int srcX, int srcY, int w, int h, int bpp) { if (!dst->fbo || !src->fbo || !useBufferedRendering_) { // This can happen if they recently switched from non-buffered. diff --git a/GPU/Vulkan/FramebufferManagerVulkan.h b/GPU/Vulkan/FramebufferManagerVulkan.h index a653aeb15d..47b4255efc 100644 --- a/GPU/Vulkan/FramebufferManagerVulkan.h +++ b/GPU/Vulkan/FramebufferManagerVulkan.h @@ -67,7 +67,6 @@ protected: // Used by ReadFramebufferToMemory and later framebuffer block copies void BlitFramebuffer(VirtualFramebuffer *dst, int dstX, int dstY, VirtualFramebuffer *src, int srcX, int srcY, int w, int h, int bpp) override; - void UpdateDownloadTempBuffer(VirtualFramebuffer *nvfb) override; private: void InitDeviceObjects(); diff --git a/GPU/Vulkan/GPU_Vulkan.cpp b/GPU/Vulkan/GPU_Vulkan.cpp index caa979b8b8..0f06c1a970 100644 --- a/GPU/Vulkan/GPU_Vulkan.cpp +++ b/GPU/Vulkan/GPU_Vulkan.cpp @@ -231,7 +231,6 @@ void GPU_Vulkan::CheckGPUFeatures() { features |= GPU_SUPPORTS_INSTANCE_RENDERING; features |= GPU_SUPPORTS_VERTEX_TEXTURE_FETCH; features |= GPU_SUPPORTS_TEXTURE_FLOAT; - features |= GPU_PREFER_CPU_DOWNLOAD; if (vulkan_->GetDeviceInfo().canBlitToPreferredDepthStencilFormat) { features |= GPU_SUPPORTS_FRAMEBUFFER_BLIT_TO_DEPTH; From 84037f448e0702178ff02d6a6a0091afd0dc385f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Thu, 5 Nov 2020 14:51:46 +0100 Subject: [PATCH 197/275] Remove colorDepth property of framebuffers. They're all 8888. --- Common/GPU/D3D9/thin3d_d3d9.cpp | 2 -- Common/GPU/OpenGL/thin3d_gl.cpp | 2 -- Common/GPU/thin3d.h | 8 -------- GPU/Common/FramebufferManagerCommon.cpp | 14 ++++++-------- GPU/Common/FramebufferManagerCommon.h | 4 +--- GPU/Common/PresentationCommon.cpp | 2 +- GPU/D3D11/FramebufferManagerD3D11.cpp | 4 ++-- GPU/D3D11/TextureCacheD3D11.cpp | 2 +- GPU/Directx9/FramebufferManagerDX9.cpp | 6 +++--- GPU/Directx9/TextureCacheDX9.cpp | 2 +- GPU/GLES/DepthBufferGLES.cpp | 2 +- GPU/GLES/FramebufferManagerGLES.cpp | 5 ++--- GPU/GLES/StencilBufferGLES.cpp | 2 +- GPU/GLES/TextureCacheGLES.cpp | 2 +- GPU/Vulkan/FramebufferManagerVulkan.cpp | 5 ++--- GPU/Vulkan/TextureCacheVulkan.cpp | 2 +- 16 files changed, 23 insertions(+), 41 deletions(-) diff --git a/Common/GPU/D3D9/thin3d_d3d9.cpp b/Common/GPU/D3D9/thin3d_d3d9.cpp index d495814b48..4665f6933f 100644 --- a/Common/GPU/D3D9/thin3d_d3d9.cpp +++ b/Common/GPU/D3D9/thin3d_d3d9.cpp @@ -1081,7 +1081,6 @@ public: int width; int height; - FBColorDepth colorDepth; }; Framebuffer *D3D9Context::CreateFramebuffer(const FramebufferDesc &desc) { @@ -1090,7 +1089,6 @@ Framebuffer *D3D9Context::CreateFramebuffer(const FramebufferDesc &desc) { D3D9Framebuffer *fbo = new D3D9Framebuffer{}; fbo->width = desc.width; fbo->height = desc.height; - fbo->colorDepth = desc.colorDepth; fbo->depthstenciltex = nullptr; HRESULT rtResult = device_->CreateTexture(fbo->width, fbo->height, 1, D3DUSAGE_RENDERTARGET, D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, &fbo->tex, NULL); diff --git a/Common/GPU/OpenGL/thin3d_gl.cpp b/Common/GPU/OpenGL/thin3d_gl.cpp index 8d620ceae9..2dc7768029 100644 --- a/Common/GPU/OpenGL/thin3d_gl.cpp +++ b/Common/GPU/OpenGL/thin3d_gl.cpp @@ -742,8 +742,6 @@ public: GLRenderManager *render_; GLRFramebuffer *framebuffer = nullptr; - - FBColorDepth colorDepth = FBO_8888; }; // TODO: SSE/NEON optimize, and move to ColorConv.cpp. diff --git a/Common/GPU/thin3d.h b/Common/GPU/thin3d.h index 87238eb3e3..1e7ddf0e75 100644 --- a/Common/GPU/thin3d.h +++ b/Common/GPU/thin3d.h @@ -244,13 +244,6 @@ enum class NativeObject { NULL_IMAGEVIEW, }; -enum FBColorDepth { - FBO_8888, - FBO_565, - FBO_4444, - FBO_5551, -}; - enum FBChannel { FB_COLOR_BIT = 1, FB_DEPTH_BIT = 2, @@ -292,7 +285,6 @@ struct FramebufferDesc { int depth; int numColorAttachments; bool z_stencil; - FBColorDepth colorDepth; const char *tag; // For graphics debuggers }; diff --git a/GPU/Common/FramebufferManagerCommon.cpp b/GPU/Common/FramebufferManagerCommon.cpp index a9c1b75ded..f8e136540e 100644 --- a/GPU/Common/FramebufferManagerCommon.cpp +++ b/GPU/Common/FramebufferManagerCommon.cpp @@ -1072,7 +1072,6 @@ void FramebufferManagerCommon::ResizeFramebufFBO(VirtualFramebuffer *vfb, int w, // During hardware rendering, we always render at full color depth even if the game wouldn't on real hardware. // It's not worth the trouble trying to support lower bit-depth rendering, just // more cases to test that nobody will ever use. - vfb->colorDepth = Draw::FBO_8888; textureCache_->ForgetLastTexture(); @@ -1091,7 +1090,7 @@ void FramebufferManagerCommon::ResizeFramebufFBO(VirtualFramebuffer *vfb, int w, shaderManager_->DirtyLastShader(); char tag[256]; snprintf(tag, sizeof(tag), "%08x_%08x_%dx%d_%s", vfb->fb_address, vfb->z_address, w, h, GeBufferFormatToString(vfb->format)); - vfb->fbo = draw_->CreateFramebuffer({ vfb->renderWidth, vfb->renderHeight, 1, 1, true, (Draw::FBColorDepth)vfb->colorDepth, tag }); + vfb->fbo = draw_->CreateFramebuffer({ vfb->renderWidth, vfb->renderHeight, 1, 1, true, tag }); if (old.fbo) { INFO_LOG(FRAMEBUF, "Resizing FBO for %08x : %dx%dx%s", vfb->fb_address, w, h, GeBufferFormatToString(vfb->format)); if (vfb->fbo) { @@ -1380,7 +1379,7 @@ VirtualFramebuffer *FramebufferManagerCommon::CreateRAMFramebuffer(uint32_t fbAd char name[64]; snprintf(name, sizeof(name), "%08x_color_RAM", vfb->fb_address); textureCache_->NotifyFramebuffer(vfb, NOTIFY_FB_CREATED); - vfb->fbo = draw_->CreateFramebuffer({ vfb->renderWidth, vfb->renderHeight, 1, 1, true, (Draw::FBColorDepth)vfb->colorDepth, name }); + vfb->fbo = draw_->CreateFramebuffer({ vfb->renderWidth, vfb->renderHeight, 1, 1, true, name }); vfbs_.push_back(vfb); u32 byteSize = ColorBufferByteSize(vfb); @@ -1429,11 +1428,10 @@ VirtualFramebuffer *FramebufferManagerCommon::FindDownloadTempBuffer(VirtualFram nvfb->drawnWidth = vfb->drawnWidth; nvfb->drawnHeight = vfb->drawnHeight; nvfb->drawnFormat = vfb->format; - nvfb->colorDepth = vfb->colorDepth; char name[64]; snprintf(name, sizeof(name), "download_temp"); - nvfb->fbo = draw_->CreateFramebuffer({ nvfb->bufferWidth, nvfb->bufferHeight, 1, 1, false, (Draw::FBColorDepth)nvfb->colorDepth, name }); + nvfb->fbo = draw_->CreateFramebuffer({ nvfb->bufferWidth, nvfb->bufferHeight, 1, 1, false, name }); if (!nvfb->fbo) { delete nvfb; ERROR_LOG(FRAMEBUF, "Error creating download temp FBO! %d x %d", nvfb->renderWidth, nvfb->renderHeight); @@ -1739,8 +1737,8 @@ void FramebufferManagerCommon::DestroyAllFBOs() { tempFBOs_.clear(); } -Draw::Framebuffer *FramebufferManagerCommon::GetTempFBO(TempFBO reason, u16 w, u16 h, Draw::FBColorDepth color_depth) { - u64 key = ((u64)reason << 48) | ((u64)color_depth << 32) | ((u32)w << 16) | h; +Draw::Framebuffer *FramebufferManagerCommon::GetTempFBO(TempFBO reason, u16 w, u16 h) { + u64 key = ((u64)reason << 48) | ((u32)w << 16) | h; auto it = tempFBOs_.find(key); if (it != tempFBOs_.end()) { it->second.last_frame_used = gpuStats.numFlips; @@ -1750,7 +1748,7 @@ Draw::Framebuffer *FramebufferManagerCommon::GetTempFBO(TempFBO reason, u16 w, u bool z_stencil = reason == TempFBO::STENCIL; char name[128]; snprintf(name, sizeof(name), "temp_fbo_%dx%d%s", w, h, z_stencil ? "_depth" : ""); - Draw::Framebuffer *fbo = draw_->CreateFramebuffer({ w, h, 1, 1, z_stencil, color_depth, name }); + Draw::Framebuffer *fbo = draw_->CreateFramebuffer({ w, h, 1, 1, z_stencil, name }); if (!fbo) { return nullptr; } diff --git a/GPU/Common/FramebufferManagerCommon.h b/GPU/Common/FramebufferManagerCommon.h index 9bd22ff92a..d312039ce3 100644 --- a/GPU/Common/FramebufferManagerCommon.h +++ b/GPU/Common/FramebufferManagerCommon.h @@ -78,8 +78,6 @@ struct VirtualFramebuffer { u16 newHeight; int lastFrameNewSize; - // TODO: Handle fbo and colorDepth better. - u8 colorDepth; Draw::Framebuffer *fbo; u16 drawnWidth; @@ -304,7 +302,7 @@ public: virtual void Resized(); virtual void DestroyAllFBOs(); - Draw::Framebuffer *GetTempFBO(TempFBO reason, u16 w, u16 h, Draw::FBColorDepth colorDepth = Draw::FBO_8888); + Draw::Framebuffer *GetTempFBO(TempFBO reason, u16 w, u16 h); // Debug features virtual bool GetFramebuffer(u32 fb_address, int fb_stride, GEBufferFormat format, GPUDebugBuffer &buffer, int maxRes); diff --git a/GPU/Common/PresentationCommon.cpp b/GPU/Common/PresentationCommon.cpp index 54fdccfb3b..e4b966ff6f 100644 --- a/GPU/Common/PresentationCommon.cpp +++ b/GPU/Common/PresentationCommon.cpp @@ -317,7 +317,7 @@ bool PresentationCommon::AllocateFramebuffer(int w, int h) { } // No depth/stencil for post processing - Draw::Framebuffer *fbo = draw_->CreateFramebuffer({ w, h, 1, 1, false, Draw::FBO_8888, "presentation" }); + Draw::Framebuffer *fbo = draw_->CreateFramebuffer({ w, h, 1, 1, false, "presentation" }); if (!fbo) { return false; } diff --git a/GPU/D3D11/FramebufferManagerD3D11.cpp b/GPU/D3D11/FramebufferManagerD3D11.cpp index 900ac2892e..5213eef9af 100644 --- a/GPU/D3D11/FramebufferManagerD3D11.cpp +++ b/GPU/D3D11/FramebufferManagerD3D11.cpp @@ -331,7 +331,7 @@ void FramebufferManagerD3D11::BindFramebufferAsColorTexture(int stage, VirtualFr // Currently rendering to this framebuffer. Need to make a copy. if (!skipCopy && framebuffer == currentRenderVfb_) { // TODO: Maybe merge with bvfbs_? Not sure if those could be packing, and they're created at a different size. - Draw::Framebuffer *renderCopy = GetTempFBO(TempFBO::COPY, framebuffer->renderWidth, framebuffer->renderHeight, (Draw::FBColorDepth)framebuffer->colorDepth); + Draw::Framebuffer *renderCopy = GetTempFBO(TempFBO::COPY, framebuffer->renderWidth, framebuffer->renderHeight); if (renderCopy) { VirtualFramebuffer copyInfo = *framebuffer; copyInfo.fbo = renderCopy; @@ -441,7 +441,7 @@ void FramebufferManagerD3D11::BlitFramebuffer(VirtualFramebuffer *dst, int dstX, // Direct3D doesn't support rect -> self. Draw::Framebuffer *srcFBO = src->fbo; if (src == dst) { - Draw::Framebuffer *tempFBO = GetTempFBO(TempFBO::BLIT, src->renderWidth, src->renderHeight, (Draw::FBColorDepth)src->colorDepth); + Draw::Framebuffer *tempFBO = GetTempFBO(TempFBO::BLIT, src->renderWidth, src->renderHeight); SimpleBlit(tempFBO, dstX1, dstY1, dstX2, dstY2, src->fbo, srcX1, srcY1, srcX2, srcY2, false); srcFBO = tempFBO; } diff --git a/GPU/D3D11/TextureCacheD3D11.cpp b/GPU/D3D11/TextureCacheD3D11.cpp index a989cf353f..b315d27a83 100644 --- a/GPU/D3D11/TextureCacheD3D11.cpp +++ b/GPU/D3D11/TextureCacheD3D11.cpp @@ -377,7 +377,7 @@ void TextureCacheD3D11::ApplyTextureFramebuffer(VirtualFramebuffer *framebuffer, const GEPaletteFormat clutFormat = gstate.getClutPaletteFormat(); ID3D11ShaderResourceView *clutTexture = depalShaderCache_->GetClutTexture(clutFormat, clutHash_, clutBuf_, expand32); - Draw::Framebuffer *depalFBO = framebufferManagerD3D11_->GetTempFBO(TempFBO::DEPAL, framebuffer->renderWidth, framebuffer->renderHeight, Draw::FBO_8888); + Draw::Framebuffer *depalFBO = framebufferManagerD3D11_->GetTempFBO(TempFBO::DEPAL, framebuffer->renderWidth, framebuffer->renderHeight); shaderManager_->DirtyLastShader(); // Not sure why or if we need this here - we're not about to actually draw using draw_, just use its framebuffer binds. diff --git a/GPU/Directx9/FramebufferManagerDX9.cpp b/GPU/Directx9/FramebufferManagerDX9.cpp index a6f73c53b5..30fb0124fd 100644 --- a/GPU/Directx9/FramebufferManagerDX9.cpp +++ b/GPU/Directx9/FramebufferManagerDX9.cpp @@ -355,7 +355,7 @@ static const D3DVERTEXELEMENT9 g_FramebufferVertexElements[] = { } if (!skipCopy && framebuffer == currentRenderVfb_) { // TODO: Maybe merge with bvfbs_? Not sure if those could be packing, and they're created at a different size. - Draw::Framebuffer *renderCopy = GetTempFBO(TempFBO::COPY, framebuffer->renderWidth, framebuffer->renderHeight, (Draw::FBColorDepth)framebuffer->colorDepth); + Draw::Framebuffer *renderCopy = GetTempFBO(TempFBO::COPY, framebuffer->renderWidth, framebuffer->renderHeight); if (renderCopy) { VirtualFramebuffer copyInfo = *framebuffer; copyInfo.fbo = renderCopy; @@ -404,7 +404,7 @@ static const D3DVERTEXELEMENT9 g_FramebufferVertexElements[] = { // Direct3D 9 doesn't support rect -> self. Draw::Framebuffer *srcFBO = src->fbo; if (src == dst) { - Draw::Framebuffer *tempFBO = GetTempFBO(TempFBO::BLIT, src->renderWidth, src->renderHeight, (Draw::FBColorDepth)src->colorDepth); + Draw::Framebuffer *tempFBO = GetTempFBO(TempFBO::BLIT, src->renderWidth, src->renderHeight); bool result = draw_->BlitFramebuffer( src->fbo, srcX1, srcY1, srcX2, srcY2, tempFBO, dstX1, dstY1, dstX2, dstY2, @@ -602,7 +602,7 @@ static const D3DVERTEXELEMENT9 g_FramebufferVertexElements[] = { // Let's resize. We must stretch to a render target first. w = vfb->width * maxRes; h = vfb->height * maxRes; - tempFBO = draw_->CreateFramebuffer({ w, h, 1, 1, false, Draw::FBO_8888 }); + tempFBO = draw_->CreateFramebuffer({ w, h, 1, 1, false }); if (draw_->BlitFramebuffer(vfb->fbo, 0, 0, vfb->renderWidth, vfb->renderHeight, tempFBO, 0, 0, w, h, Draw::FB_COLOR_BIT, g_Config.iBufFilter == SCALE_LINEAR ? Draw::FB_BLIT_LINEAR : Draw::FB_BLIT_NEAREST, "GetFramebuffer")) { renderTarget = (LPDIRECT3DSURFACE9)draw_->GetFramebufferAPITexture(tempFBO, Draw::FB_COLOR_BIT | Draw::FB_SURFACE_BIT, 0); } diff --git a/GPU/Directx9/TextureCacheDX9.cpp b/GPU/Directx9/TextureCacheDX9.cpp index f2373e0a6b..9cfb36935e 100644 --- a/GPU/Directx9/TextureCacheDX9.cpp +++ b/GPU/Directx9/TextureCacheDX9.cpp @@ -344,7 +344,7 @@ void TextureCacheDX9::ApplyTextureFramebuffer(VirtualFramebuffer *framebuffer, G const GEPaletteFormat clutFormat = gstate.getClutPaletteFormat(); LPDIRECT3DTEXTURE9 clutTexture = depalShaderCache_->GetClutTexture(clutFormat, clutHash_, clutBuf_); - Draw::Framebuffer *depalFBO = framebufferManagerDX9_->GetTempFBO(TempFBO::DEPAL, framebuffer->renderWidth, framebuffer->renderHeight, Draw::FBO_8888); + Draw::Framebuffer *depalFBO = framebufferManagerDX9_->GetTempFBO(TempFBO::DEPAL, framebuffer->renderWidth, framebuffer->renderHeight); draw_->BindFramebufferAsRenderTarget(depalFBO, { Draw::RPAction::DONT_CARE, Draw::RPAction::DONT_CARE, Draw::RPAction::DONT_CARE }, "Depal"); shaderManager_->DirtyLastShader(); diff --git a/GPU/GLES/DepthBufferGLES.cpp b/GPU/GLES/DepthBufferGLES.cpp index fa3ca00c5c..9cd487ae5a 100644 --- a/GPU/GLES/DepthBufferGLES.cpp +++ b/GPU/GLES/DepthBufferGLES.cpp @@ -126,7 +126,7 @@ void FramebufferManagerGLES::PackDepthbuffer(VirtualFramebuffer *vfb, int x, int } shaderManagerGL_->DirtyLastShader(); - auto *blitFBO = GetTempFBO(TempFBO::COPY, vfb->renderWidth, vfb->renderHeight, Draw::FBO_8888); + auto *blitFBO = GetTempFBO(TempFBO::COPY, vfb->renderWidth, vfb->renderHeight); draw_->BindFramebufferAsRenderTarget(blitFBO, { Draw::RPAction::CLEAR, Draw::RPAction::DONT_CARE, Draw::RPAction::DONT_CARE }, "PackDepthbuffer"); render_->SetViewport({ 0, 0, (float)vfb->renderWidth, (float)vfb->renderHeight, 0.0f, 1.0f }); diff --git a/GPU/GLES/FramebufferManagerGLES.cpp b/GPU/GLES/FramebufferManagerGLES.cpp index a7280d0d8c..eaa47b662e 100644 --- a/GPU/GLES/FramebufferManagerGLES.cpp +++ b/GPU/GLES/FramebufferManagerGLES.cpp @@ -278,7 +278,7 @@ void FramebufferManagerGLES::BindFramebufferAsColorTexture(int stage, VirtualFra } if (!skipCopy && framebuffer == currentRenderVfb_) { // TODO: Maybe merge with bvfbs_? Not sure if those could be packing, and they're created at a different size. - Draw::Framebuffer *renderCopy = GetTempFBO(TempFBO::COPY, framebuffer->renderWidth, framebuffer->renderHeight, (Draw::FBColorDepth)framebuffer->colorDepth); + Draw::Framebuffer *renderCopy = GetTempFBO(TempFBO::COPY, framebuffer->renderWidth, framebuffer->renderHeight); if (renderCopy) { VirtualFramebuffer copyInfo = *framebuffer; copyInfo.fbo = renderCopy; @@ -335,12 +335,11 @@ void FramebufferManagerGLES::BlitFramebuffer(VirtualFramebuffer *dst, int dstX, // glBlitFramebuffer can clip, but glCopyImageSubData is more restricted. // In case the src goes outside, we just skip the optimization in that case. const bool sameSize = dstX2 - dstX1 == srcX2 - srcX1 && dstY2 - dstY1 == srcY2 - srcY1; - const bool sameDepth = dst->colorDepth == src->colorDepth; const bool srcInsideBounds = srcX2 <= src->renderWidth && srcY2 <= src->renderHeight; const bool dstInsideBounds = dstX2 <= dst->renderWidth && dstY2 <= dst->renderHeight; const bool xOverlap = src == dst && srcX2 > dstX1 && srcX1 < dstX2; const bool yOverlap = src == dst && srcY2 > dstY1 && srcY1 < dstY2; - if (sameSize && sameDepth && srcInsideBounds && dstInsideBounds && !(xOverlap && yOverlap)) { + if (sameSize && srcInsideBounds && dstInsideBounds && !(xOverlap && yOverlap)) { draw_->CopyFramebufferImage(src->fbo, 0, srcX1, srcY1, 0, dst->fbo, 0, dstX1, dstY1, 0, dstX2 - dstX1, dstY2 - dstY1, 1, Draw::FB_COLOR_BIT, "BlitFramebuffer"); return; } diff --git a/GPU/GLES/StencilBufferGLES.cpp b/GPU/GLES/StencilBufferGLES.cpp index 1c19fa09e8..566671d1d3 100644 --- a/GPU/GLES/StencilBufferGLES.cpp +++ b/GPU/GLES/StencilBufferGLES.cpp @@ -170,7 +170,7 @@ bool FramebufferManagerGLES::NotifyStencilUpload(u32 addr, int size, StencilUplo Draw::Framebuffer *blitFBO = nullptr; if (useBlit) { - blitFBO = GetTempFBO(TempFBO::STENCIL, w, h, Draw::FBO_8888); + blitFBO = GetTempFBO(TempFBO::STENCIL, w, h); draw_->BindFramebufferAsRenderTarget(blitFBO, { Draw::RPAction::DONT_CARE, Draw::RPAction::DONT_CARE, Draw::RPAction::DONT_CARE }, "NotifyStencilUpload_Blit"); } else if (dstBuffer->fbo) { draw_->BindFramebufferAsRenderTarget(dstBuffer->fbo, { Draw::RPAction::KEEP, Draw::RPAction::KEEP, Draw::RPAction::DONT_CARE }, "NotifyStencilUpload_NoBlit"); diff --git a/GPU/GLES/TextureCacheGLES.cpp b/GPU/GLES/TextureCacheGLES.cpp index 2e7e35ada3..dfe2f19648 100644 --- a/GPU/GLES/TextureCacheGLES.cpp +++ b/GPU/GLES/TextureCacheGLES.cpp @@ -383,7 +383,7 @@ void TextureCacheGLES::ApplyTextureFramebuffer(VirtualFramebuffer *framebuffer, const GEPaletteFormat clutFormat = gstate.getClutPaletteFormat(); GLRTexture *clutTexture = depalShaderCache_->GetClutTexture(clutFormat, clutHash_, clutBuf_); - Draw::Framebuffer *depalFBO = framebufferManagerGL_->GetTempFBO(TempFBO::DEPAL, framebuffer->renderWidth, framebuffer->renderHeight, Draw::FBO_8888); + Draw::Framebuffer *depalFBO = framebufferManagerGL_->GetTempFBO(TempFBO::DEPAL, framebuffer->renderWidth, framebuffer->renderHeight); draw_->BindFramebufferAsRenderTarget(depalFBO, { Draw::RPAction::DONT_CARE, Draw::RPAction::DONT_CARE, Draw::RPAction::DONT_CARE }, "Depal"); render_->SetScissor(GLRect2D{ 0, 0, (int)framebuffer->renderWidth, (int)framebuffer->renderHeight }); diff --git a/GPU/Vulkan/FramebufferManagerVulkan.cpp b/GPU/Vulkan/FramebufferManagerVulkan.cpp index b3c92ecb5f..13837b4a92 100644 --- a/GPU/Vulkan/FramebufferManagerVulkan.cpp +++ b/GPU/Vulkan/FramebufferManagerVulkan.cpp @@ -284,7 +284,7 @@ VkImageView FramebufferManagerVulkan::BindFramebufferAsColorTexture(int stage, V // Currently rendering to this framebuffer. Need to make a copy. if (!skipCopy && framebuffer == currentRenderVfb_) { // TODO: Maybe merge with bvfbs_? Not sure if those could be packing, and they're created at a different size. - Draw::Framebuffer *renderCopy = GetTempFBO(TempFBO::COPY, framebuffer->renderWidth, framebuffer->renderHeight, (Draw::FBColorDepth)framebuffer->colorDepth); + Draw::Framebuffer *renderCopy = GetTempFBO(TempFBO::COPY, framebuffer->renderWidth, framebuffer->renderHeight); if (renderCopy) { VirtualFramebuffer copyInfo = *framebuffer; copyInfo.fbo = renderCopy; @@ -366,12 +366,11 @@ void FramebufferManagerVulkan::BlitFramebuffer(VirtualFramebuffer *dst, int dstX // BlitFramebuffer can clip, but CopyFramebufferImage is more restricted. // In case the src goes outside, we just skip the optimization in that case. const bool sameSize = dstX2 - dstX1 == srcX2 - srcX1 && dstY2 - dstY1 == srcY2 - srcY1; - const bool sameDepth = dst->colorDepth == src->colorDepth; const bool srcInsideBounds = srcX2 <= src->renderWidth && srcY2 <= src->renderHeight; const bool dstInsideBounds = dstX2 <= dst->renderWidth && dstY2 <= dst->renderHeight; const bool xOverlap = src == dst && srcX2 > dstX1 && srcX1 < dstX2; const bool yOverlap = src == dst && srcY2 > dstY1 && srcY1 < dstY2; - if (sameSize && sameDepth && srcInsideBounds && dstInsideBounds && !(xOverlap && yOverlap)) { + if (sameSize && srcInsideBounds && dstInsideBounds && !(xOverlap && yOverlap)) { draw_->CopyFramebufferImage(src->fbo, 0, srcX1, srcY1, 0, dst->fbo, 0, dstX1, dstY1, 0, dstX2 - dstX1, dstY2 - dstY1, 1, Draw::FB_COLOR_BIT, "BlitFramebuffer_Copy"); } else { draw_->BlitFramebuffer(src->fbo, srcX1, srcY1, srcX2, srcY2, dst->fbo, dstX1, dstY1, dstX2, dstY2, Draw::FB_COLOR_BIT, Draw::FB_BLIT_NEAREST, "BlitFramebuffer_Blit"); diff --git a/GPU/Vulkan/TextureCacheVulkan.cpp b/GPU/Vulkan/TextureCacheVulkan.cpp index 018f76169b..19e232bb93 100644 --- a/GPU/Vulkan/TextureCacheVulkan.cpp +++ b/GPU/Vulkan/TextureCacheVulkan.cpp @@ -571,7 +571,7 @@ void TextureCacheVulkan::ApplyTextureFramebuffer(VirtualFramebuffer *framebuffer const GEPaletteFormat clutFormat = gstate.getClutPaletteFormat(); VulkanTexture *clutTexture = depalShaderCache_->GetClutTexture(clutFormat, clutHash_, clutBuf_, expand32); - Draw::Framebuffer *depalFBO = framebufferManager_->GetTempFBO(TempFBO::DEPAL, framebuffer->renderWidth, framebuffer->renderHeight, Draw::FBO_8888); + Draw::Framebuffer *depalFBO = framebufferManager_->GetTempFBO(TempFBO::DEPAL, framebuffer->renderWidth, framebuffer->renderHeight); draw_->BindFramebufferAsRenderTarget(depalFBO, { Draw::RPAction::DONT_CARE, Draw::RPAction::DONT_CARE, Draw::RPAction::DONT_CARE }, "Depal"); Vulkan2D::Vertex verts[4] = { From 3c5a05acb32c7aade7fdaaacfdfdad214a011e5a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Thu, 5 Nov 2020 18:25:14 +0100 Subject: [PATCH 198/275] Buildfix --- GPU/Common/FramebufferManagerCommon.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/GPU/Common/FramebufferManagerCommon.cpp b/GPU/Common/FramebufferManagerCommon.cpp index f8e136540e..389cd3d778 100644 --- a/GPU/Common/FramebufferManagerCommon.cpp +++ b/GPU/Common/FramebufferManagerCommon.cpp @@ -1435,7 +1435,7 @@ VirtualFramebuffer *FramebufferManagerCommon::FindDownloadTempBuffer(VirtualFram if (!nvfb->fbo) { delete nvfb; ERROR_LOG(FRAMEBUF, "Error creating download temp FBO! %d x %d", nvfb->renderWidth, nvfb->renderHeight); - return false; + return nullptr; } bvfbs_.push_back(nvfb); From 225734c0b3c80fd4fd30079c1bff05f812c440a5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Fri, 6 Nov 2020 09:09:18 +0100 Subject: [PATCH 199/275] Partially revert "Remove remnants of an old, no longer applicable readback optimization" This reverts commit 7b2236778b0f54c4ece821b6ab2bf52a5b647223. Fixes #13628 --- GPU/Common/FramebufferManagerCommon.cpp | 5 +++-- GPU/Common/FramebufferManagerCommon.h | 1 + GPU/D3D11/FramebufferManagerD3D11.cpp | 4 ++++ GPU/D3D11/FramebufferManagerD3D11.h | 2 ++ GPU/Directx9/FramebufferManagerDX9.cpp | 4 ++++ GPU/Directx9/FramebufferManagerDX9.h | 2 ++ GPU/GLES/FramebufferManagerGLES.cpp | 12 ++++++++++++ GPU/GLES/FramebufferManagerGLES.h | 2 ++ GPU/Vulkan/FramebufferManagerVulkan.cpp | 4 ++++ GPU/Vulkan/FramebufferManagerVulkan.h | 1 + 10 files changed, 35 insertions(+), 2 deletions(-) diff --git a/GPU/Common/FramebufferManagerCommon.cpp b/GPU/Common/FramebufferManagerCommon.cpp index 389cd3d778..b83bef2098 100644 --- a/GPU/Common/FramebufferManagerCommon.cpp +++ b/GPU/Common/FramebufferManagerCommon.cpp @@ -1433,12 +1433,13 @@ VirtualFramebuffer *FramebufferManagerCommon::FindDownloadTempBuffer(VirtualFram snprintf(name, sizeof(name), "download_temp"); nvfb->fbo = draw_->CreateFramebuffer({ nvfb->bufferWidth, nvfb->bufferHeight, 1, 1, false, name }); if (!nvfb->fbo) { - delete nvfb; - ERROR_LOG(FRAMEBUF, "Error creating download temp FBO! %d x %d", nvfb->renderWidth, nvfb->renderHeight); + ERROR_LOG(FRAMEBUF, "Error creating FBO! %d x %d", nvfb->renderWidth, nvfb->renderHeight); return nullptr; } bvfbs_.push_back(nvfb); + } else { + UpdateDownloadTempBuffer(nvfb); } nvfb->usageFlags |= FB_USAGE_RENDERTARGET; diff --git a/GPU/Common/FramebufferManagerCommon.h b/GPU/Common/FramebufferManagerCommon.h index d312039ce3..905bdaed14 100644 --- a/GPU/Common/FramebufferManagerCommon.h +++ b/GPU/Common/FramebufferManagerCommon.h @@ -347,6 +347,7 @@ protected: void DownloadFramebufferOnSwitch(VirtualFramebuffer *vfb); void FindTransferFramebuffers(VirtualFramebuffer *&dstBuffer, VirtualFramebuffer *&srcBuffer, u32 dstBasePtr, int dstStride, int &dstX, int &dstY, u32 srcBasePtr, int srcStride, int &srcX, int &srcY, int &srcWidth, int &srcHeight, int &dstWidth, int &dstHeight, int bpp); VirtualFramebuffer *FindDownloadTempBuffer(VirtualFramebuffer *vfb); + virtual void UpdateDownloadTempBuffer(VirtualFramebuffer *nvfb) = 0; VirtualFramebuffer *CreateRAMFramebuffer(uint32_t fbAddress, int width, int height, int stride, GEBufferFormat format); diff --git a/GPU/D3D11/FramebufferManagerD3D11.cpp b/GPU/D3D11/FramebufferManagerD3D11.cpp index 5213eef9af..5e2e716e32 100644 --- a/GPU/D3D11/FramebufferManagerD3D11.cpp +++ b/GPU/D3D11/FramebufferManagerD3D11.cpp @@ -353,6 +353,10 @@ void FramebufferManagerD3D11::BindFramebufferAsColorTexture(int stage, VirtualFr } } +void FramebufferManagerD3D11::UpdateDownloadTempBuffer(VirtualFramebuffer *nvfb) { + // Nothing to do here. +} + void FramebufferManagerD3D11::SimpleBlit( Draw::Framebuffer *dest, float destX1, float destY1, float destX2, float destY2, Draw::Framebuffer *src, float srcX1, float srcY1, float srcX2, float srcY2, bool linearFilter) { diff --git a/GPU/D3D11/FramebufferManagerD3D11.h b/GPU/D3D11/FramebufferManagerD3D11.h index 6c88dd5855..a8a4089198 100644 --- a/GPU/D3D11/FramebufferManagerD3D11.h +++ b/GPU/D3D11/FramebufferManagerD3D11.h @@ -58,6 +58,8 @@ protected: // Used by ReadFramebufferToMemory and later framebuffer block copies void BlitFramebuffer(VirtualFramebuffer *dst, int dstX, int dstY, VirtualFramebuffer *src, int srcX, int srcY, int w, int h, int bpp) override; + void UpdateDownloadTempBuffer(VirtualFramebuffer *nvfb) override; + private: void Bind2DShader() override; void PackDepthbuffer(VirtualFramebuffer *vfb, int x, int y, int w, int h); diff --git a/GPU/Directx9/FramebufferManagerDX9.cpp b/GPU/Directx9/FramebufferManagerDX9.cpp index 30fb0124fd..776cdcf7f3 100644 --- a/GPU/Directx9/FramebufferManagerDX9.cpp +++ b/GPU/Directx9/FramebufferManagerDX9.cpp @@ -371,6 +371,10 @@ static const D3DVERTEXELEMENT9 g_FramebufferVertexElements[] = { } } + void FramebufferManagerDX9::UpdateDownloadTempBuffer(VirtualFramebuffer *nvfb) { + // Nothing to do here. + } + void FramebufferManagerDX9::BlitFramebuffer(VirtualFramebuffer *dst, int dstX, int dstY, VirtualFramebuffer *src, int srcX, int srcY, int w, int h, int bpp) { if (!dst->fbo || !src->fbo || !useBufferedRendering_) { // This can happen if we recently switched from non-buffered. diff --git a/GPU/Directx9/FramebufferManagerDX9.h b/GPU/Directx9/FramebufferManagerDX9.h index 6884002eb3..3a8578599a 100644 --- a/GPU/Directx9/FramebufferManagerDX9.h +++ b/GPU/Directx9/FramebufferManagerDX9.h @@ -69,6 +69,8 @@ protected: // Used by ReadFramebufferToMemory and later framebuffer block copies void BlitFramebuffer(VirtualFramebuffer *dst, int dstX, int dstY, VirtualFramebuffer *src, int srcX, int srcY, int w, int h, int bpp) override; + void UpdateDownloadTempBuffer(VirtualFramebuffer *nvfb) override; + private: void PackFramebufferSync_(VirtualFramebuffer *vfb, int x, int y, int w, int h) override; void PackDepthbuffer(VirtualFramebuffer *vfb, int x, int y, int w, int h); diff --git a/GPU/GLES/FramebufferManagerGLES.cpp b/GPU/GLES/FramebufferManagerGLES.cpp index eaa47b662e..c0fd949930 100644 --- a/GPU/GLES/FramebufferManagerGLES.cpp +++ b/GPU/GLES/FramebufferManagerGLES.cpp @@ -293,6 +293,18 @@ void FramebufferManagerGLES::BindFramebufferAsColorTexture(int stage, VirtualFra } } +void FramebufferManagerGLES::UpdateDownloadTempBuffer(VirtualFramebuffer *nvfb) { + _assert_msg_(nvfb->fbo, "Expecting a valid nvfb in UpdateDownloadTempBuffer"); + + // Discard the previous contents of this buffer where possible. + if (gl_extensions.GLES3) { + draw_->BindFramebufferAsRenderTarget(nvfb->fbo, { Draw::RPAction::DONT_CARE, Draw::RPAction::DONT_CARE, Draw::RPAction::DONT_CARE }, "UpdateDownloadTempBuffer"); + } else if (gl_extensions.IsGLES) { + draw_->BindFramebufferAsRenderTarget(nvfb->fbo, { Draw::RPAction::CLEAR, Draw::RPAction::CLEAR, Draw::RPAction::CLEAR }, "UpdateDownloadTempBuffer"); + gstate_c.Dirty(DIRTY_BLEND_STATE); + } +} + void FramebufferManagerGLES::BlitFramebuffer(VirtualFramebuffer *dst, int dstX, int dstY, VirtualFramebuffer *src, int srcX, int srcY, int w, int h, int bpp) { if (!dst->fbo || !src->fbo || !useBufferedRendering_) { // This can happen if they recently switched from non-buffered. diff --git a/GPU/GLES/FramebufferManagerGLES.h b/GPU/GLES/FramebufferManagerGLES.h index 590d2b22fa..51d44af73c 100644 --- a/GPU/GLES/FramebufferManagerGLES.h +++ b/GPU/GLES/FramebufferManagerGLES.h @@ -62,6 +62,8 @@ protected: // Used by ReadFramebufferToMemory and later framebuffer block copies void BlitFramebuffer(VirtualFramebuffer *dst, int dstX, int dstY, VirtualFramebuffer *src, int srcX, int srcY, int w, int h, int bpp) override; + void UpdateDownloadTempBuffer(VirtualFramebuffer *nvfb) override; + private: void CreateDeviceObjects(); void DestroyDeviceObjects(); diff --git a/GPU/Vulkan/FramebufferManagerVulkan.cpp b/GPU/Vulkan/FramebufferManagerVulkan.cpp index 13837b4a92..8acc1cbe2f 100644 --- a/GPU/Vulkan/FramebufferManagerVulkan.cpp +++ b/GPU/Vulkan/FramebufferManagerVulkan.cpp @@ -305,6 +305,10 @@ VkImageView FramebufferManagerVulkan::BindFramebufferAsColorTexture(int stage, V } } +void FramebufferManagerVulkan::UpdateDownloadTempBuffer(VirtualFramebuffer *nvfb) { + // Nothing to do here. +} + void FramebufferManagerVulkan::BlitFramebuffer(VirtualFramebuffer *dst, int dstX, int dstY, VirtualFramebuffer *src, int srcX, int srcY, int w, int h, int bpp) { if (!dst->fbo || !src->fbo || !useBufferedRendering_) { // This can happen if they recently switched from non-buffered. diff --git a/GPU/Vulkan/FramebufferManagerVulkan.h b/GPU/Vulkan/FramebufferManagerVulkan.h index 47b4255efc..a653aeb15d 100644 --- a/GPU/Vulkan/FramebufferManagerVulkan.h +++ b/GPU/Vulkan/FramebufferManagerVulkan.h @@ -67,6 +67,7 @@ protected: // Used by ReadFramebufferToMemory and later framebuffer block copies void BlitFramebuffer(VirtualFramebuffer *dst, int dstX, int dstY, VirtualFramebuffer *src, int srcX, int srcY, int w, int h, int bpp) override; + void UpdateDownloadTempBuffer(VirtualFramebuffer *nvfb) override; private: void InitDeviceObjects(); From 44ec286ba48931442f82503d6361b9af4b71bb54 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Thu, 5 Nov 2020 11:21:00 +0100 Subject: [PATCH 200/275] Framebuffer: Keep the render scale factor around, no need to recompute it. --- Core/CoreParameter.h | 5 +- GPU/Common/FramebufferManagerCommon.cpp | 86 ++++++++++++------------- GPU/Common/FramebufferManagerCommon.h | 18 ++++-- GPU/Common/PresentationCommon.cpp | 4 +- GPU/Common/PresentationCommon.h | 2 +- GPU/D3D11/FramebufferManagerD3D11.cpp | 8 +-- GPU/Directx9/FramebufferManagerDX9.cpp | 8 +-- GPU/GLES/FramebufferManagerGLES.cpp | 8 +-- GPU/Vulkan/FramebufferManagerVulkan.cpp | 13 ++-- headless/Headless.cpp | 1 + 10 files changed, 78 insertions(+), 75 deletions(-) diff --git a/Core/CoreParameter.h b/Core/CoreParameter.h index a4e542bf02..abfb9e40e6 100644 --- a/Core/CoreParameter.h +++ b/Core/CoreParameter.h @@ -66,11 +66,12 @@ struct CoreParameter { std::string *collectEmuLog = nullptr; bool headLess; // Try to avoid messageboxes etc - // Internal PSP resolution + // Internal PSP rendering resolution and scale factor. + int renderScaleFactor; int renderWidth; int renderHeight; - // Actual pixel output resolution (for use by glViewport and the like) + // Actual output resolution in pixels. int pixelWidth; int pixelHeight; diff --git a/GPU/Common/FramebufferManagerCommon.cpp b/GPU/Common/FramebufferManagerCommon.cpp index b83bef2098..6d0744dea9 100644 --- a/GPU/Common/FramebufferManagerCommon.cpp +++ b/GPU/Common/FramebufferManagerCommon.cpp @@ -77,6 +77,7 @@ bool FramebufferManagerCommon::UpdateSize() { renderWidth_ = (float)PSP_CoreParameter().renderWidth; renderHeight_ = (float)PSP_CoreParameter().renderHeight; + renderScaleFactor_ = (float)PSP_CoreParameter().renderScaleFactor; pixelWidth_ = PSP_CoreParameter().pixelWidth; pixelHeight_ = PSP_CoreParameter().pixelHeight; bloomHack_ = g_Config.iBloomHack; @@ -340,14 +341,6 @@ VirtualFramebuffer *FramebufferManagerCommon::DoSetRenderFrameBuffer(const Frame } } - float renderWidthFactor = renderWidth_ / 480.0f; - float renderHeightFactor = renderHeight_ / 272.0f; - - if (PSP_CoreParameter().compat.flags().Force04154000Download && params.fb_address == 0x04154000) { - renderWidthFactor = 1.0; - renderHeightFactor = 1.0; - } - // None found? Create one. if (!vfb) { vfb = new VirtualFramebuffer{}; @@ -356,28 +349,28 @@ VirtualFramebuffer *FramebufferManagerCommon::DoSetRenderFrameBuffer(const Frame vfb->fb_stride = params.fb_stride; vfb->z_address = params.z_address; vfb->z_stride = params.z_stride; + + // The other width/height parameters are set in ResizeFramebufFBO below. vfb->width = drawing_width; vfb->height = drawing_height; vfb->newWidth = drawing_width; vfb->newHeight = drawing_height; vfb->lastFrameNewSize = gpuStats.numFlips; - vfb->renderWidth = (u16)(drawing_width * renderWidthFactor); - vfb->renderHeight = (u16)(drawing_height * renderHeightFactor); - vfb->bufferWidth = drawing_width; - vfb->bufferHeight = drawing_height; vfb->format = params.fmt; vfb->drawnFormat = params.fmt; vfb->usageFlags = FB_USAGE_RENDERTARGET; - SetColorUpdated(vfb, skipDrawReason); u32 byteSize = ColorBufferByteSize(vfb); if (Memory::IsVRAMAddress(params.fb_address) && params.fb_address + byteSize > framebufRangeEnd_) { framebufRangeEnd_ = params.fb_address + byteSize; } + // This is where we actually create the framebuffer. The true is "force". ResizeFramebufFBO(vfb, drawing_width, drawing_height, true); NotifyRenderFramebufferCreated(vfb); + SetColorUpdated(vfb, skipDrawReason); + INFO_LOG(FRAMEBUF, "Creating FBO for %08x (z: %08x) : %i x %i x %i", vfb->fb_address, vfb->z_address, vfb->width, vfb->height, vfb->format); vfb->last_frame_render = gpuStats.numFlips; @@ -1046,6 +1039,7 @@ void FramebufferManagerCommon::DecimateFBOs() { } } +// Requires width/height to be set already. void FramebufferManagerCommon::ResizeFramebufFBO(VirtualFramebuffer *vfb, int w, int h, bool force, bool skipCopy) { _dbg_assert_(w > 0); _dbg_assert_(h > 0); @@ -1067,7 +1061,32 @@ void FramebufferManagerCommon::ResizeFramebufFBO(VirtualFramebuffer *vfb, int w, vfb->bufferHeight = std::max((int)vfb->bufferHeight, h); } - SetRenderSize(vfb); + bool force1x = false; + switch (bloomHack_) { + case 1: + force1x = vfb->bufferWidth <= 128 || vfb->bufferHeight <= 64; + break; + case 2: + force1x = vfb->bufferWidth <= 256 || vfb->bufferHeight <= 128; + break; + case 3: + force1x = vfb->bufferWidth < 480 || vfb->bufferWidth > 800 || vfb->bufferHeight < 272; // GOW uses 864x272 + break; + } + + if (PSP_CoreParameter().compat.flags().Force04154000Download && vfb->fb_address == 0x04154000) { + force1x = true; + } + + if (force1x && g_Config.iInternalResolution != 1) { + vfb->renderScaleFactor = 1.0f; + vfb->renderWidth = vfb->bufferWidth; + vfb->renderHeight = vfb->bufferHeight; + } else { + vfb->renderScaleFactor = renderScaleFactor_; + vfb->renderWidth = (u16)(vfb->bufferWidth * renderScaleFactor_); + vfb->renderHeight = (u16)(vfb->bufferHeight * renderScaleFactor_); + } // During hardware rendering, we always render at full color depth even if the game wouldn't on real hardware. // It's not worth the trouble trying to support lower bit-depth rendering, just @@ -1655,35 +1674,6 @@ void FramebufferManagerCommon::NotifyBlockTransferAfter(u32 dstBasePtr, int dstS } } -void FramebufferManagerCommon::SetRenderSize(VirtualFramebuffer *vfb) { - float renderWidthFactor = renderWidth_ / 480.0f; - float renderHeightFactor = renderHeight_ / 272.0f; - bool force1x = false; - switch (bloomHack_) { - case 1: - force1x = vfb->bufferWidth <= 128 || vfb->bufferHeight <= 64; - break; - case 2: - force1x = vfb->bufferWidth <= 256 || vfb->bufferHeight <= 128; - break; - case 3: - force1x = vfb->bufferWidth < 480 || vfb->bufferWidth > 800 || vfb->bufferHeight < 272; // GOW uses 864x272 - break; - } - - if (PSP_CoreParameter().compat.flags().Force04154000Download && vfb->fb_address == 0x04154000) { - force1x = true; - } - - if (force1x && g_Config.iInternalResolution != 1) { - vfb->renderWidth = vfb->bufferWidth; - vfb->renderHeight = vfb->bufferHeight; - } else { - vfb->renderWidth = (u16)(vfb->bufferWidth * renderWidthFactor); - vfb->renderHeight = (u16)(vfb->bufferHeight * renderHeightFactor); - } -} - void FramebufferManagerCommon::SetSafeSize(u16 w, u16 h) { VirtualFramebuffer *vfb = currentRenderVfb_; if (vfb) { @@ -1695,10 +1685,11 @@ void FramebufferManagerCommon::SetSafeSize(u16 w, u16 h) { void FramebufferManagerCommon::Resized() { gstate_c.skipDrawReason &= ~SKIPDRAW_NON_DISPLAYED_FB; - int w, h; - presentation_->CalculateRenderResolution(&w, &h, &postShaderIsUpscalingFilter_, &postShaderIsSupersampling_); + int w, h, scaleFactor; + presentation_->CalculateRenderResolution(&w, &h, &scaleFactor, &postShaderIsUpscalingFilter_, &postShaderIsSupersampling_); PSP_CoreParameter().renderWidth = w; PSP_CoreParameter().renderHeight = h; + PSP_CoreParameter().renderScaleFactor = scaleFactor; if (UpdateSize()) { DestroyAllFBOs(); @@ -1736,6 +1727,11 @@ void FramebufferManagerCommon::DestroyAllFBOs() { tempFB.second.fbo->Release(); } tempFBOs_.clear(); + + for (auto iter : fbosToDelete_) { + iter->Release(); + } + fbosToDelete_.clear(); } Draw::Framebuffer *FramebufferManagerCommon::GetTempFBO(TempFBO reason, u16 w, u16 h) { diff --git a/GPU/Common/FramebufferManagerCommon.h b/GPU/Common/FramebufferManagerCommon.h index 905bdaed14..3df8b69acf 100644 --- a/GPU/Common/FramebufferManagerCommon.h +++ b/GPU/Common/FramebufferManagerCommon.h @@ -61,21 +61,24 @@ struct VirtualFramebuffer { u16 width; u16 height; - // renderWidth/renderHeight: The scaled size we render at. May be scaled to render at higher resolutions. - // The physical buffer may be larger than renderWidth/renderHeight. - u16 renderWidth; - u16 renderHeight; - - // bufferWidth/bufferHeight: The pre-scaling size of the buffer itself. May only be bigger than width/height. + // bufferWidth/bufferHeight: The pre-scaling size of the buffer itself. May only be bigger than or equal to width/height. // Actual physical buffer is this size times the render resolution multiplier. // The buffer may be used to render a width or height from 0 to these values without being recreated. u16 bufferWidth; u16 bufferHeight; + // renderWidth/renderHeight: The scaled size we render at. May be scaled to render at higher resolutions. + // The physical buffer may be larger than renderWidth/renderHeight. + u16 renderWidth; + u16 renderHeight; + + float renderScaleFactor; + u16 usageFlags; u16 newWidth; u16 newHeight; + int lastFrameNewSize; Draw::Framebuffer *fbo; @@ -396,9 +399,10 @@ protected: bool gameUsesSequentialCopies_ = false; - // Sampled in BeginFrame for safety. + // Sampled in BeginFrame/UpdateSize for safety. float renderWidth_ = 0.0f; float renderHeight_ = 0.0f; + float renderScaleFactor_ = 1.0f; int pixelWidth_; int pixelHeight_; int bloomHack_ = 0; diff --git a/GPU/Common/PresentationCommon.cpp b/GPU/Common/PresentationCommon.cpp index e4b966ff6f..58233a6d29 100644 --- a/GPU/Common/PresentationCommon.cpp +++ b/GPU/Common/PresentationCommon.cpp @@ -729,7 +729,7 @@ void PresentationCommon::CopyToOutput(OutputFlags flags, int uvRotation, float u draw_->BindPipeline(nullptr); } -void PresentationCommon::CalculateRenderResolution(int *width, int *height, bool *upscaling, bool *ssaa) { +void PresentationCommon::CalculateRenderResolution(int *width, int *height, int *scaleFactor, bool *upscaling, bool *ssaa) { // Check if postprocessing shader is doing upscaling as it requires native resolution std::vector shaderInfo; if (!g_Config.vPostShaderNames.empty() && g_Config.vPostShaderNames[0] != "Off") { @@ -776,4 +776,6 @@ void PresentationCommon::CalculateRenderResolution(int *width, int *height, bool *width = 480 * zoom; *height = 272 * zoom; } + + *scaleFactor = zoom; } diff --git a/GPU/Common/PresentationCommon.h b/GPU/Common/PresentationCommon.h index 0102c3fbcf..959e516d5f 100644 --- a/GPU/Common/PresentationCommon.h +++ b/GPU/Common/PresentationCommon.h @@ -100,7 +100,7 @@ public: void SourceFramebuffer(Draw::Framebuffer *fb, int bufferWidth, int bufferHeight); void CopyToOutput(OutputFlags flags, int uvRotation, float u0, float v0, float u1, float v1); - void CalculateRenderResolution(int *width, int *height, bool *upscaling, bool *ssaa); + void CalculateRenderResolution(int *width, int *height, int *scaleFactor, bool *upscaling, bool *ssaa); protected: void CreateDeviceObjects(); diff --git a/GPU/D3D11/FramebufferManagerD3D11.cpp b/GPU/D3D11/FramebufferManagerD3D11.cpp index 5e2e716e32..2a90aaa4e4 100644 --- a/GPU/D3D11/FramebufferManagerD3D11.cpp +++ b/GPU/D3D11/FramebufferManagerD3D11.cpp @@ -420,8 +420,8 @@ void FramebufferManagerD3D11::BlitFramebuffer(VirtualFramebuffer *dst, int dstX, return; } - float srcXFactor = (float)src->renderWidth / (float)src->bufferWidth; - float srcYFactor = (float)src->renderHeight / (float)src->bufferHeight; + float srcXFactor = src->renderScaleFactor; + float srcYFactor = src->renderScaleFactor; const int srcBpp = src->format == GE_FORMAT_8888 ? 4 : 2; if (srcBpp != bpp && bpp != 0) { srcXFactor = (srcXFactor * bpp) / srcBpp; @@ -431,8 +431,8 @@ void FramebufferManagerD3D11::BlitFramebuffer(VirtualFramebuffer *dst, int dstX, int srcY1 = srcY * srcYFactor; int srcY2 = (srcY + h) * srcYFactor; - float dstXFactor = (float)dst->renderWidth / (float)dst->bufferWidth; - float dstYFactor = (float)dst->renderHeight / (float)dst->bufferHeight; + float dstXFactor = dst->renderScaleFactor; + float dstYFactor = dst->renderScaleFactor; const int dstBpp = dst->format == GE_FORMAT_8888 ? 4 : 2; if (dstBpp != bpp && bpp != 0) { dstXFactor = (dstXFactor * bpp) / dstBpp; diff --git a/GPU/Directx9/FramebufferManagerDX9.cpp b/GPU/Directx9/FramebufferManagerDX9.cpp index 776cdcf7f3..951406c80d 100644 --- a/GPU/Directx9/FramebufferManagerDX9.cpp +++ b/GPU/Directx9/FramebufferManagerDX9.cpp @@ -383,8 +383,8 @@ static const D3DVERTEXELEMENT9 g_FramebufferVertexElements[] = { return; } - float srcXFactor = (float)src->renderWidth / (float)src->bufferWidth; - float srcYFactor = (float)src->renderHeight / (float)src->bufferHeight; + float srcXFactor = (float)src->renderScaleFactor; + float srcYFactor = (float)src->renderScaleFactor; const int srcBpp = src->format == GE_FORMAT_8888 ? 4 : 2; if (srcBpp != bpp && bpp != 0) { srcXFactor = (srcXFactor * bpp) / srcBpp; @@ -394,8 +394,8 @@ static const D3DVERTEXELEMENT9 g_FramebufferVertexElements[] = { int srcY1 = srcY * srcYFactor; int srcY2 = (srcY + h) * srcYFactor; - float dstXFactor = (float)dst->renderWidth / (float)dst->bufferWidth; - float dstYFactor = (float)dst->renderHeight / (float)dst->bufferHeight; + float dstXFactor = (float)dst->renderScaleFactor; + float dstYFactor = (float)dst->renderScaleFactor; const int dstBpp = dst->format == GE_FORMAT_8888 ? 4 : 2; if (dstBpp != bpp && bpp != 0) { dstXFactor = (dstXFactor * bpp) / dstBpp; diff --git a/GPU/GLES/FramebufferManagerGLES.cpp b/GPU/GLES/FramebufferManagerGLES.cpp index c0fd949930..192ed1df28 100644 --- a/GPU/GLES/FramebufferManagerGLES.cpp +++ b/GPU/GLES/FramebufferManagerGLES.cpp @@ -315,8 +315,8 @@ void FramebufferManagerGLES::BlitFramebuffer(VirtualFramebuffer *dst, int dstX, bool useBlit = gstate_c.Supports(GPU_SUPPORTS_FRAMEBUFFER_BLIT); - float srcXFactor = useBlit ? (float)src->renderWidth / (float)src->bufferWidth : 1.0f; - float srcYFactor = useBlit ? (float)src->renderHeight / (float)src->bufferHeight : 1.0f; + float srcXFactor = useBlit ? src->renderScaleFactor : 1.0f; + float srcYFactor = useBlit ? src->renderScaleFactor : 1.0f; const int srcBpp = src->format == GE_FORMAT_8888 ? 4 : 2; if (srcBpp != bpp && bpp != 0) { srcXFactor = (srcXFactor * bpp) / srcBpp; @@ -326,8 +326,8 @@ void FramebufferManagerGLES::BlitFramebuffer(VirtualFramebuffer *dst, int dstX, int srcY1 = srcY * srcYFactor; int srcY2 = (srcY + h) * srcYFactor; - float dstXFactor = useBlit ? (float)dst->renderWidth / (float)dst->bufferWidth : 1.0f; - float dstYFactor = useBlit ? (float)dst->renderHeight / (float)dst->bufferHeight : 1.0f; + float dstXFactor = useBlit ? dst->renderScaleFactor : 1.0f; + float dstYFactor = useBlit ? dst->renderScaleFactor : 1.0f; const int dstBpp = dst->format == GE_FORMAT_8888 ? 4 : 2; if (dstBpp != bpp && bpp != 0) { dstXFactor = (dstXFactor * bpp) / dstBpp; diff --git a/GPU/Vulkan/FramebufferManagerVulkan.cpp b/GPU/Vulkan/FramebufferManagerVulkan.cpp index 8acc1cbe2f..d04021ff58 100644 --- a/GPU/Vulkan/FramebufferManagerVulkan.cpp +++ b/GPU/Vulkan/FramebufferManagerVulkan.cpp @@ -261,7 +261,6 @@ void FramebufferManagerVulkan::ReformatFramebufferFrom(VirtualFramebuffer *vfb, // We have to bind here instead of clear, since it can be that no framebuffer is bound. // The backend can sometimes directly optimize it to a clear. draw_->BindFramebufferAsRenderTarget(vfb->fbo, { Draw::RPAction::CLEAR, Draw::RPAction::KEEP, Draw::RPAction::CLEAR }, "ReformatFramebuffer"); - // draw_->Clear(Draw::FBChannel::FB_COLOR_BIT | Draw::FBChannel::FB_STENCIL_BIT, 0, 0.0f, 0); // Need to dirty anything that has command buffer dynamic state, in case we started a new pass above. // Should find a way to feed that information back, maybe... Or simply correct the issue in the rendermanager. @@ -339,8 +338,10 @@ void FramebufferManagerVulkan::BlitFramebuffer(VirtualFramebuffer *dst, int dstX return; } - float srcXFactor = (float)src->renderWidth / (float)src->bufferWidth; - float srcYFactor = (float)src->renderHeight / (float)src->bufferHeight; + float srcXFactor = (float)src->renderScaleFactor; + float srcYFactor = (float)src->renderScaleFactor; + + // Some games use wrong-format block transfers. Simulate that. const int srcBpp = src->format == GE_FORMAT_8888 ? 4 : 2; if (srcBpp != bpp && bpp != 0) { srcXFactor = (srcXFactor * bpp) / srcBpp; @@ -350,8 +351,8 @@ void FramebufferManagerVulkan::BlitFramebuffer(VirtualFramebuffer *dst, int dstX int srcY1 = srcY * srcYFactor; int srcY2 = (srcY + h) * srcYFactor; - float dstXFactor = (float)dst->renderWidth / (float)dst->bufferWidth; - float dstYFactor = (float)dst->renderHeight / (float)dst->bufferHeight; + float dstXFactor = (float)dst->renderScaleFactor; + float dstYFactor = (float)dst->renderScaleFactor; const int dstBpp = dst->format == GE_FORMAT_8888 ? 4 : 2; if (dstBpp != bpp && bpp != 0) { dstXFactor = (dstXFactor * bpp) / dstBpp; @@ -367,8 +368,6 @@ void FramebufferManagerVulkan::BlitFramebuffer(VirtualFramebuffer *dst, int dstX return; } - // BlitFramebuffer can clip, but CopyFramebufferImage is more restricted. - // In case the src goes outside, we just skip the optimization in that case. const bool sameSize = dstX2 - dstX1 == srcX2 - srcX1 && dstY2 - dstY1 == srcY2 - srcY1; const bool srcInsideBounds = srcX2 <= src->renderWidth && srcY2 <= src->renderHeight; const bool dstInsideBounds = dstX2 <= dst->renderWidth && dstY2 <= dst->renderHeight; diff --git a/headless/Headless.cpp b/headless/Headless.cpp index fb80436d73..1dc70e488d 100644 --- a/headless/Headless.cpp +++ b/headless/Headless.cpp @@ -358,6 +358,7 @@ int main(int argc, const char* argv[]) coreParameter.startBreak = false; coreParameter.printfEmuLog = !autoCompare; coreParameter.headLess = true; + coreParameter.renderScaleFactor = 1; coreParameter.renderWidth = 480; coreParameter.renderHeight = 272; coreParameter.pixelWidth = 480; From 7a690f177ebe458a559a05d61a8316e1ea5afbe0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Fri, 6 Nov 2020 09:01:13 +0100 Subject: [PATCH 201/275] Move shader language feature detection to the draw context. --- Common/Common.vcxproj.filters | 4 +- Common/GPU/D3D11/thin3d_d3d11.cpp | 39 +++++------ Common/GPU/D3D9/thin3d_d3d9.cpp | 32 ++++----- Common/GPU/OpenGL/thin3d_gl.cpp | 100 ++++++++++++++++++++++++---- Common/GPU/Shader.cpp | 80 ++++++++++++++++++++++ Common/GPU/Shader.h | 3 + Common/GPU/Vulkan/thin3d_vulkan.cpp | 12 ++-- Common/GPU/thin3d.h | 14 +++- GPU/Common/ShaderCommon.cpp | 76 --------------------- GPU/D3D11/ShaderManagerD3D11.cpp | 6 +- GPU/D3D11/ShaderManagerD3D11.h | 1 - GPU/Directx9/ShaderManagerDX9.cpp | 8 +-- GPU/Directx9/ShaderManagerDX9.h | 1 - GPU/GLES/FramebufferManagerGLES.cpp | 4 +- GPU/GLES/ShaderManagerGLES.cpp | 84 +---------------------- GPU/GLES/ShaderManagerGLES.h | 2 - 16 files changed, 244 insertions(+), 222 deletions(-) diff --git a/Common/Common.vcxproj.filters b/Common/Common.vcxproj.filters index 0d11399460..38d3896534 100644 --- a/Common/Common.vcxproj.filters +++ b/Common/Common.vcxproj.filters @@ -729,10 +729,10 @@ Render\Text - + GPU - + GPU diff --git a/Common/GPU/D3D11/thin3d_d3d11.cpp b/Common/GPU/D3D11/thin3d_d3d11.cpp index ed7de24771..21db0ab5cb 100644 --- a/Common/GPU/D3D11/thin3d_d3d11.cpp +++ b/Common/GPU/D3D11/thin3d_d3d11.cpp @@ -294,6 +294,8 @@ D3D11DrawContext::D3D11DrawContext(ID3D11Device *device, ID3D11DeviceContext *de packDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM; hr = device_->CreateTexture2D(&packDesc, nullptr, &packTexture_); _assert_(SUCCEEDED(hr)); + + shaderLanguageDesc_.Init(HLSL_D3D11); } D3D11DrawContext::~D3D11DrawContext() { @@ -1205,7 +1207,10 @@ uint32_t D3D11DrawContext::GetDataFormatSupport(DataFormat fmt) const { // A D3D11Framebuffer is a D3D11Framebuffer plus all the textures it owns. class D3D11Framebuffer : public Framebuffer { public: - D3D11Framebuffer() {} + D3D11Framebuffer(int width, int height) { + width_ = width; + height_ = height; + } ~D3D11Framebuffer() { if (colorTex) colorTex->Release(); @@ -1220,8 +1225,6 @@ public: if (depthStencilRTView) depthStencilRTView->Release(); } - int width; - int height; ID3D11Texture2D *colorTex = nullptr; ID3D11RenderTargetView *colorRTView = nullptr; @@ -1236,9 +1239,7 @@ public: Framebuffer *D3D11DrawContext::CreateFramebuffer(const FramebufferDesc &desc) { HRESULT hr; - D3D11Framebuffer *fb = new D3D11Framebuffer(); - fb->width = desc.width; - fb->height = desc.height; + D3D11Framebuffer *fb = new D3D11Framebuffer(desc.width, desc.height); if (desc.numColorAttachments) { fb->colorFormat = DXGI_FORMAT_R8G8B8A8_UNORM; D3D11_TEXTURE2D_DESC descColor{}; @@ -1396,7 +1397,7 @@ void D3D11DrawContext::CopyFramebufferImage(Framebuffer *srcfb, int level, int x } // TODO: Check for level too! - if (width == src->width && width == dst->width && height == src->height && height == dst->height && x == 0 && y == 0 && z == 0 && dstX == 0 && dstY == 0 && dstZ == 0) { + if (width == src->Width() && width == dst->Width() && height == src->Height() && height == dst->Height() && x == 0 && y == 0 && z == 0 && dstX == 0 && dstY == 0 && dstZ == 0) { // Don't need to specify region. This might be faster, too. context_->CopyResource(dstTex, srcTex); return; @@ -1415,11 +1416,11 @@ void D3D11DrawContext::CopyFramebufferImage(Framebuffer *srcfb, int level, int x dstY -= y; y = 0; } - if (x + width > src->width) { - width = src->width - x; + if (x + width > src->Width()) { + width = src->Width() - x; } - if (y + height > src->height) { - height = src->height - y; + if (y + height > src->Height()) { + height = src->Height() - y; } D3D11_BOX srcBox{ (UINT)x, (UINT)y, (UINT)z, (UINT)(x + width), (UINT)(y + height), (UINT)(z + depth) }; context_->CopySubresourceRegion(dstTex, dstLevel, dstX, dstY, dstZ, srcTex, level, &srcBox); @@ -1441,11 +1442,11 @@ bool D3D11DrawContext::CopyFramebufferToMemorySync(Framebuffer *src, int channel _assert_(fb->colorFormat == DXGI_FORMAT_R8G8B8A8_UNORM); // TODO: Figure out where the badness really comes from. - if (bx + bw > fb->width) { - bw -= (bx + bw) - fb->width; + if (bx + bw > fb->Width()) { + bw -= (bx + bw) - fb->Width(); } - if (by + bh > fb->height) { - bh -= (by + bh) - fb->height; + if (by + bh > fb->Height()) { + bh -= (by + bh) - fb->Height(); } } @@ -1565,8 +1566,8 @@ void D3D11DrawContext::BindFramebufferAsRenderTarget(Framebuffer *fbo, const Ren context_->OMSetRenderTargets(1, &fb->colorRTView, fb->depthStencilRTView); curRenderTargetView_ = fb->colorRTView; curDepthStencilView_ = fb->depthStencilRTView; - curRTWidth_ = fb->width; - curRTHeight_ = fb->height; + curRTWidth_ = fb->Width(); + curRTHeight_ = fb->Height(); } } else { if (curRenderTargetView_ == bbRenderTargetView_ && curDepthStencilView_ == bbDepthStencilView_) { @@ -1634,8 +1635,8 @@ uintptr_t D3D11DrawContext::GetFramebufferAPITexture(Framebuffer *fbo, int chann void D3D11DrawContext::GetFramebufferDimensions(Framebuffer *fbo, int *w, int *h) { D3D11Framebuffer *fb = (D3D11Framebuffer *)fbo; if (fb) { - *w = fb->width; - *h = fb->height; + *w = fb->Width(); + *h = fb->Height(); } else { *w = bbWidth_; *h = bbHeight_; diff --git a/Common/GPU/D3D9/thin3d_d3d9.cpp b/Common/GPU/D3D9/thin3d_d3d9.cpp index 4665f6933f..44a559ee50 100644 --- a/Common/GPU/D3D9/thin3d_d3d9.cpp +++ b/Common/GPU/D3D9/thin3d_d3d9.cpp @@ -670,6 +670,8 @@ D3D9Context::D3D9Context(IDirect3D9 *d3d, IDirect3D9Ex *d3dEx, int adapterId, ID HRESULT fboINTZ = d3d->CheckDeviceFormat(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, D3DFMT_A8R8G8B8, D3DUSAGE_DEPTHSTENCIL, D3DRTYPE_TEXTURE, FOURCC_INTZ); supportsINTZ = SUCCEEDED(displayINTZ) && SUCCEEDED(fboINTZ); } + + shaderLanguageDesc_.Init(HLSL_D3D9); } D3D9Context::~D3D9Context() { @@ -1072,26 +1074,26 @@ bool D3D9ShaderModule::Compile(LPDIRECT3DDEVICE9 device, const uint8_t *data, si class D3D9Framebuffer : public Framebuffer { public: + D3D9Framebuffer(int width, int height) { + width_ = width; + height_ = height; + } ~D3D9Framebuffer(); - uint32_t id; - LPDIRECT3DSURFACE9 surf; - LPDIRECT3DSURFACE9 depthstencil; - LPDIRECT3DTEXTURE9 tex; - LPDIRECT3DTEXTURE9 depthstenciltex; - int width; - int height; + uint32_t id = 0; + LPDIRECT3DSURFACE9 surf = nullptr; + LPDIRECT3DSURFACE9 depthstencil = nullptr; + LPDIRECT3DTEXTURE9 tex = nullptr; + LPDIRECT3DTEXTURE9 depthstenciltex = nullptr; }; Framebuffer *D3D9Context::CreateFramebuffer(const FramebufferDesc &desc) { static uint32_t id = 0; - D3D9Framebuffer *fbo = new D3D9Framebuffer{}; - fbo->width = desc.width; - fbo->height = desc.height; + D3D9Framebuffer *fbo = new D3D9Framebuffer(desc.width, desc.height); fbo->depthstenciltex = nullptr; - HRESULT rtResult = device_->CreateTexture(fbo->width, fbo->height, 1, D3DUSAGE_RENDERTARGET, D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, &fbo->tex, NULL); + HRESULT rtResult = device_->CreateTexture(desc.width, desc.height, 1, D3DUSAGE_RENDERTARGET, D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, &fbo->tex, NULL); if (FAILED(rtResult)) { ERROR_LOG(G3D, "Failed to create render target"); delete fbo; @@ -1101,12 +1103,12 @@ Framebuffer *D3D9Context::CreateFramebuffer(const FramebufferDesc &desc) { HRESULT dsResult; if (supportsINTZ) { - dsResult = device_->CreateTexture(fbo->width, fbo->height, 1, D3DUSAGE_DEPTHSTENCIL, FOURCC_INTZ, D3DPOOL_DEFAULT, &fbo->depthstenciltex, NULL); + dsResult = device_->CreateTexture(desc.width, desc.height, 1, D3DUSAGE_DEPTHSTENCIL, FOURCC_INTZ, D3DPOOL_DEFAULT, &fbo->depthstenciltex, NULL); if (SUCCEEDED(dsResult)) { dsResult = fbo->depthstenciltex->GetSurfaceLevel(0, &fbo->depthstencil); } } else { - dsResult = device_->CreateDepthStencilSurface(fbo->width, fbo->height, D3DFMT_D24S8, D3DMULTISAMPLE_NONE, 0, FALSE, &fbo->depthstencil, NULL); + dsResult = device_->CreateDepthStencilSurface(desc.width, desc.height, D3DFMT_D24S8, D3DMULTISAMPLE_NONE, 0, FALSE, &fbo->depthstencil, NULL); } if (FAILED(dsResult)) { ERROR_LOG(G3D, "Failed to create depth buffer"); @@ -1208,8 +1210,8 @@ void D3D9Context::BindFramebufferAsTexture(Framebuffer *fbo, int binding, FBChan void D3D9Context::GetFramebufferDimensions(Framebuffer *fbo, int *w, int *h) { D3D9Framebuffer *fb = (D3D9Framebuffer *)fbo; if (fb) { - *w = fb->width; - *h = fb->height; + *w = fb->Width(); + *h = fb->Height(); } else { *w = targetWidth_; *h = targetHeight_; diff --git a/Common/GPU/OpenGL/thin3d_gl.cpp b/Common/GPU/OpenGL/thin3d_gl.cpp index 2dc7768029..ff5d0e08cf 100644 --- a/Common/GPU/OpenGL/thin3d_gl.cpp +++ b/Common/GPU/OpenGL/thin3d_gl.cpp @@ -350,6 +350,7 @@ public: return (uint32_t)ShaderLanguage::GLSL_1xx; } } + uint32_t GetDataFormatSupport(DataFormat fmt) const override; void SetErrorCallback(ErrorCallbackFn callback, void *userdata) override { @@ -601,6 +602,78 @@ OpenGLContext::OpenGLContext() { // TODO: Should this workaround be removed for newer devices/drivers? bugs_.Infest(Bugs::PVR_GENMIPMAP_HEIGHT_GREATER); } + + shaderLanguageDesc_.Init(GLSL_1xx); + + // Detect shader language features. + if (gl_extensions.IsGLES) { + if (gl_extensions.GLES3) { + shaderLanguageDesc_.shaderLanguage = ShaderLanguage::GLSL_3xx; + shaderLanguageDesc_.glslVersionNumber = 300; // GLSL ES 3.0 + shaderLanguageDesc_.fragColor0 = "fragColor0"; + shaderLanguageDesc_.texture = "texture"; + shaderLanguageDesc_.glslES30 = true; + shaderLanguageDesc_.bitwiseOps = true; + shaderLanguageDesc_.texelFetch = "texelFetch"; + shaderLanguageDesc_.varying_vs = "out"; + shaderLanguageDesc_.varying_fs = "in"; + shaderLanguageDesc_.attribute = "in"; + } else { + shaderLanguageDesc_.shaderLanguage = ShaderLanguage::GLSL_1xx; + shaderLanguageDesc_.glslVersionNumber = 100; // GLSL ES 1.0 + if (gl_extensions.EXT_gpu_shader4) { + shaderLanguageDesc_.bitwiseOps = true; + shaderLanguageDesc_.texelFetch = "texelFetch2D"; + } + if (gl_extensions.EXT_blend_func_extended) { + // Oldy moldy GLES, so use the fixed output name. + shaderLanguageDesc_.fragColor1 = "gl_SecondaryFragColorEXT"; + } + } + } else { + if (!gl_extensions.ForceGL2 || gl_extensions.IsCoreContext) { + if (gl_extensions.VersionGEThan(3, 3, 0)) { + shaderLanguageDesc_.shaderLanguage = ShaderLanguage::GLSL_3xx; + shaderLanguageDesc_.glslVersionNumber = 330; + shaderLanguageDesc_.fragColor0 = "fragColor0"; + shaderLanguageDesc_.texture = "texture"; + shaderLanguageDesc_.glslES30 = true; + shaderLanguageDesc_.bitwiseOps = true; + shaderLanguageDesc_.texelFetch = "texelFetch"; + shaderLanguageDesc_.varying_vs = "out"; + shaderLanguageDesc_.varying_fs = "in"; + shaderLanguageDesc_.attribute = "in"; + } else if (gl_extensions.VersionGEThan(3, 0, 0)) { + shaderLanguageDesc_.shaderLanguage = ShaderLanguage::GLSL_1xx; + shaderLanguageDesc_.glslVersionNumber = 130; + shaderLanguageDesc_.fragColor0 = "fragColor0"; + shaderLanguageDesc_.bitwiseOps = true; + shaderLanguageDesc_.texelFetch = "texelFetch"; + } else { + shaderLanguageDesc_.shaderLanguage = ShaderLanguage::GLSL_1xx; + shaderLanguageDesc_.glslVersionNumber = 110; + if (gl_extensions.EXT_gpu_shader4) { + shaderLanguageDesc_.bitwiseOps = true; + shaderLanguageDesc_.texelFetch = "texelFetch2D"; + } + } + } + } + + if (gl_extensions.IsGLES && gl_extensions.GLES3) { + caps_.framebufferFetchSupported = (gl_extensions.EXT_shader_framebuffer_fetch || gl_extensions.NV_shader_framebuffer_fetch || gl_extensions.ARM_shader_framebuffer_fetch); + if (gl_extensions.EXT_shader_framebuffer_fetch) { + shaderLanguageDesc_.framebufferFetchExtension = "#extension GL_EXT_shader_framebuffer_fetch : require"; + shaderLanguageDesc_.lastFragData = "gl_LastFragData[0]"; + } else if (gl_extensions.NV_shader_framebuffer_fetch) { + // GL_NV_shader_framebuffer_fetch is available on mobile platform and ES 2.0 only but not on desktop. + shaderLanguageDesc_.framebufferFetchExtension = "#extension GL_NV_shader_framebuffer_fetch : require"; + shaderLanguageDesc_.lastFragData = "gl_LastFragData[0]"; + } else if (gl_extensions.ARM_shader_framebuffer_fetch) { + shaderLanguageDesc_.framebufferFetchExtension = "#extension GL_ARM_shader_framebuffer_fetch : require"; + shaderLanguageDesc_.lastFragData = "gl_LastFragColorARM"; + } + } } OpenGLContext::~OpenGLContext() { @@ -735,13 +808,16 @@ OpenGLTexture::~OpenGLTexture() { class OpenGLFramebuffer : public Framebuffer { public: - OpenGLFramebuffer(GLRenderManager *render) : render_(render) {} + OpenGLFramebuffer(GLRenderManager *render, GLRFramebuffer *framebuffer) : render_(render), framebuffer_(framebuffer) { + width_ = framebuffer->width; + height_ = framebuffer->height; + } ~OpenGLFramebuffer() { - render_->DeleteFramebuffer(framebuffer); + render_->DeleteFramebuffer(framebuffer_); } GLRenderManager *render_; - GLRFramebuffer *framebuffer = nullptr; + GLRFramebuffer *framebuffer_ = nullptr; }; // TODO: SSE/NEON optimize, and move to ColorConv.cpp. @@ -843,7 +919,7 @@ bool OpenGLContext::CopyFramebufferToMemorySync(Framebuffer *src, int channelBit aspect |= GL_DEPTH_BUFFER_BIT; if (channelBits & FB_STENCIL_BIT) aspect |= GL_STENCIL_BUFFER_BIT; - renderManager_.CopyFramebufferToMemorySync(fb ? fb->framebuffer : nullptr, aspect, x, y, w, h, dataFormat, (uint8_t *)pixels, pixelStride, tag); + renderManager_.CopyFramebufferToMemorySync(fb ? fb->framebuffer_ : nullptr, aspect, x, y, w, h, dataFormat, (uint8_t *)pixels, pixelStride, tag); return true; } @@ -1239,8 +1315,8 @@ void OpenGLInputLayout::Compile(const InputLayoutDesc &desc) { Framebuffer *OpenGLContext::CreateFramebuffer(const FramebufferDesc &desc) { CheckGLExtensions(); - OpenGLFramebuffer *fbo = new OpenGLFramebuffer(&renderManager_); - fbo->framebuffer = renderManager_.CreateFramebuffer(desc.width, desc.height, desc.z_stencil); + GLRFramebuffer *framebuffer = renderManager_.CreateFramebuffer(desc.width, desc.height, desc.z_stencil); + OpenGLFramebuffer *fbo = new OpenGLFramebuffer(&renderManager_, framebuffer); return fbo; } @@ -1250,7 +1326,7 @@ void OpenGLContext::BindFramebufferAsRenderTarget(Framebuffer *fbo, const Render GLRRenderPassAction depth = (GLRRenderPassAction)rp.depth; GLRRenderPassAction stencil = (GLRRenderPassAction)rp.stencil; - renderManager_.BindFramebufferAsRenderTarget(fb ? fb->framebuffer : nullptr, color, depth, stencil, rp.clearColor, rp.clearDepth, rp.clearStencil, tag); + renderManager_.BindFramebufferAsRenderTarget(fb ? fb->framebuffer_ : nullptr, color, depth, stencil, rp.clearColor, rp.clearDepth, rp.clearStencil, tag); } void OpenGLContext::CopyFramebufferImage(Framebuffer *fbsrc, int srcLevel, int srcX, int srcY, int srcZ, Framebuffer *fbdst, int dstLevel, int dstX, int dstY, int dstZ, int width, int height, int depth, int channelBits, const char *tag) { @@ -1266,7 +1342,7 @@ void OpenGLContext::CopyFramebufferImage(Framebuffer *fbsrc, int srcLevel, int s if (channelBits & FB_STENCIL_BIT) aspect |= GL_STENCIL_BUFFER_BIT; } - renderManager_.CopyFramebuffer(src->framebuffer, GLRect2D{ srcX, srcY, width, height }, dst->framebuffer, GLOffset2D{ dstX, dstY }, aspect, tag); + renderManager_.CopyFramebuffer(src->framebuffer_, GLRect2D{ srcX, srcY, width, height }, dst->framebuffer_, GLOffset2D{ dstX, dstY }, aspect, tag); } bool OpenGLContext::BlitFramebuffer(Framebuffer *fbsrc, int srcX1, int srcY1, int srcX2, int srcY2, Framebuffer *fbdst, int dstX1, int dstY1, int dstX2, int dstY2, int channels, FBBlitFilter linearFilter, const char *tag) { @@ -1280,7 +1356,7 @@ bool OpenGLContext::BlitFramebuffer(Framebuffer *fbsrc, int srcX1, int srcY1, in if (channels & FB_STENCIL_BIT) aspect |= GL_STENCIL_BUFFER_BIT; - renderManager_.BlitFramebuffer(src->framebuffer, GLRect2D{ srcX1, srcY1, srcX2 - srcX1, srcY2 - srcY1 }, dst->framebuffer, GLRect2D{ dstX1, dstY1, dstX2 - dstX1, dstY2 - dstY1 }, aspect, linearFilter == FB_BLIT_LINEAR, tag); + renderManager_.BlitFramebuffer(src->framebuffer_, GLRect2D{ srcX1, srcY1, srcX2 - srcX1, srcY2 - srcY1 }, dst->framebuffer_, GLRect2D{ dstX1, dstY1, dstX2 - dstX1, dstY2 - dstY1 }, aspect, linearFilter == FB_BLIT_LINEAR, tag); return true; } @@ -1294,14 +1370,14 @@ void OpenGLContext::BindFramebufferAsTexture(Framebuffer *fbo, int binding, FBCh aspect |= GL_DEPTH_BUFFER_BIT; if (channelBit & FB_STENCIL_BIT) aspect |= GL_STENCIL_BUFFER_BIT; - renderManager_.BindFramebufferAsTexture(fb->framebuffer, binding, aspect, color); + renderManager_.BindFramebufferAsTexture(fb->framebuffer_, binding, aspect, color); } void OpenGLContext::GetFramebufferDimensions(Framebuffer *fbo, int *w, int *h) { OpenGLFramebuffer *fb = (OpenGLFramebuffer *)fbo; if (fb) { - *w = fb->framebuffer->width; - *h = fb->framebuffer->height; + *w = fb->Width(); + *h = fb->Height(); } else { *w = targetWidth_; *h = targetHeight_; diff --git a/Common/GPU/Shader.cpp b/Common/GPU/Shader.cpp index 79684874c3..f4bfe96b69 100644 --- a/Common/GPU/Shader.cpp +++ b/Common/GPU/Shader.cpp @@ -1 +1,81 @@ #include "Common/GPU/Shader.h" + +ShaderLanguageDesc::ShaderLanguageDesc(ShaderLanguage lang) { + Init(lang); +} + +void ShaderLanguageDesc::Init(ShaderLanguage lang) { + shaderLanguage = lang; + switch (lang) { + case GLSL_1xx: + // Just used in the shader test, and as a basis for the others in DetectShaderLanguage. + glslVersionNumber = 110; + attribute = "attribute"; + varying_vs = "varying"; + varying_fs = "varying"; + fragColor0 = "gl_FragColor"; + fragColor1 = "fragColor1"; + texture = "texture2D"; + texelFetch = nullptr; + bitwiseOps = false; + lastFragData = nullptr; + gles = false; + forceMatrix4x4 = true; + break; + case GLSL_3xx: + // Just used in the shader test. + glslVersionNumber = 300; // GLSL ES 3.0 + varying_vs = "out"; + varying_fs = "in"; + attribute = "in"; + fragColor0 = "fragColor0"; + fragColor1 = "fragColor1"; + texture = "texture"; + texelFetch = nullptr; + bitwiseOps = false; + lastFragData = nullptr; + gles = false; + forceMatrix4x4 = true; + glslES30 = true; + bitwiseOps = true; + texelFetch = "texelFetch"; + break; + case GLSL_VULKAN: + fragColor0 = "fragColor0"; + fragColor1 = "fragColor1"; + varying_fs = "in"; + varying_vs = "out"; + attribute = "in"; + bitwiseOps = true; + framebufferFetchExtension = nullptr; + gles = false; + glslES30 = true; + glslVersionNumber = 450; + lastFragData = nullptr; + texture = "texture"; + texelFetch = "texelFetch"; + forceMatrix4x4 = false; + coefsFromBuffers = true; + break; + case HLSL_D3D9: + case HLSL_D3D11: + fragColor0 = "outfragment.target"; + fragColor1 = "outfragment.target1"; + varying_fs = "in"; + varying_vs = "out"; + attribute = "in"; + bitwiseOps = lang == HLSL_D3D11; + framebufferFetchExtension = nullptr; + gles = false; + glslES30 = true; + glslVersionNumber = 0; + lastFragData = nullptr; + texture = "texture"; + texelFetch = "texelFetch"; + forceMatrix4x4 = false; + coefsFromBuffers = true; + vsOutPrefix = "Out."; + break; + } +} + diff --git a/Common/GPU/Shader.h b/Common/GPU/Shader.h index e5adc8b514..d574cd4738 100644 --- a/Common/GPU/Shader.h +++ b/Common/GPU/Shader.h @@ -23,8 +23,11 @@ enum class ShaderStage { }; struct ShaderLanguageDesc { + ShaderLanguageDesc() {} explicit ShaderLanguageDesc(ShaderLanguage lang); + void Init(ShaderLanguage lang); + int glslVersionNumber = 0; ShaderLanguage shaderLanguage; bool gles = false; diff --git a/Common/GPU/Vulkan/thin3d_vulkan.cpp b/Common/GPU/Vulkan/thin3d_vulkan.cpp index 5f5ad3b808..eabd2b0a72 100644 --- a/Common/GPU/Vulkan/thin3d_vulkan.cpp +++ b/Common/GPU/Vulkan/thin3d_vulkan.cpp @@ -497,7 +497,6 @@ public: void InvalidateCachedState() override; private: - VulkanTexture *GetNullTexture(); VulkanContext *vulkan_ = nullptr; @@ -760,6 +759,8 @@ bool VKTexture::Create(VkCommandBuffer cmd, VulkanPushBuffer *push, const Textur VKContext::VKContext(VulkanContext *vulkan, bool splitSubmit) : vulkan_(vulkan), caps_{}, renderManager_(vulkan) { + shaderLanguageDesc_.Init(GLSL_VULKAN); + caps_.anisoSupported = vulkan->GetDeviceFeatures().enabled.samplerAnisotropy != 0; caps_.geometryShaderSupported = vulkan->GetDeviceFeatures().enabled.geometryShader != 0; caps_.tesselationShaderSupported = vulkan->GetDeviceFeatures().enabled.tessellationShader != 0; @@ -780,8 +781,7 @@ VKContext::VKContext(VulkanContext *vulkan, bool splitSubmit) case VULKAN_VENDOR_NVIDIA: caps_.vendor = GPUVendor::VENDOR_NVIDIA; break; case VULKAN_VENDOR_QUALCOMM: caps_.vendor = GPUVendor::VENDOR_QUALCOMM; break; case VULKAN_VENDOR_INTEL: caps_.vendor = GPUVendor::VENDOR_INTEL; break; - default: - caps_.vendor = GPUVendor::VENDOR_UNKNOWN; + default: caps_.vendor = GPUVendor::VENDOR_UNKNOWN; break; } if (caps_.vendor == GPUVendor::VENDOR_QUALCOMM) { @@ -1448,7 +1448,11 @@ uint32_t VKContext::GetDataFormatSupport(DataFormat fmt) const { // use this frame's init command buffer. class VKFramebuffer : public Framebuffer { public: - VKFramebuffer(VKRFramebuffer *fb) : buf_(fb) { _assert_msg_(fb, "Null fb in VKFramebuffer constructor"); } + VKFramebuffer(VKRFramebuffer *fb) : buf_(fb) { + _assert_msg_(fb, "Null fb in VKFramebuffer constructor"); + width_ = fb->width; + height_ = fb->height; + } ~VKFramebuffer() { _assert_msg_(buf_, "Null buf_ in VKFramebuffer - double delete?"); buf_->vulkan_->Delete().QueueCallback([](void *fb) { diff --git a/Common/GPU/thin3d.h b/Common/GPU/thin3d.h index 1e7ddf0e75..055cb93e1e 100644 --- a/Common/GPU/thin3d.h +++ b/Common/GPU/thin3d.h @@ -347,6 +347,10 @@ public: class Framebuffer : public RefCountedObject { public: + int Width() { return width_; } + int Height() { return height_; } +protected: + int width_ = -1, height_ = -1; }; class Buffer : public RefCountedObject { @@ -359,7 +363,7 @@ public: int Height() { return height_; } int Depth() { return depth_; } protected: - int width_, height_, depth_; + int width_ = -1, height_ = -1, depth_ = -1; }; struct BindingDesc { @@ -496,6 +500,7 @@ struct DeviceCaps { bool framebufferBlitSupported; bool framebufferDepthCopySupported; bool framebufferDepthBlitSupported; + bool framebufferFetchSupported; std::string deviceName; // The device name to use when creating the thin3d context, to get the same one. }; @@ -548,6 +553,11 @@ public: virtual std::vector GetExtensionList() const { return std::vector(); } virtual std::vector GetDeviceList() const { return std::vector(); } + // Describes the primary shader language that this implementation prefers. + const ShaderLanguageDesc &GetShaderLanguageDesc() { + return shaderLanguageDesc_; + } + virtual uint32_t GetSupportedShaderLanguages() const = 0; virtual void SetErrorCallback(ErrorCallbackFn callback, void *userdata) {} @@ -663,6 +673,8 @@ protected: ShaderModule *vsPresets_[VS_MAX_PRESET]; ShaderModule *fsPresets_[FS_MAX_PRESET]; + ShaderLanguageDesc shaderLanguageDesc_; + int targetWidth_; int targetHeight_; diff --git a/GPU/Common/ShaderCommon.cpp b/GPU/Common/ShaderCommon.cpp index 45ba5ab357..360e7f9d8b 100644 --- a/GPU/Common/ShaderCommon.cpp +++ b/GPU/Common/ShaderCommon.cpp @@ -101,79 +101,3 @@ void init_resources(TBuiltInResource &Resources) { Resources.limits.generalVariableIndexing = 1; Resources.limits.generalConstantMatrixVectorIndexing = 1; } - -ShaderLanguageDesc::ShaderLanguageDesc(ShaderLanguage lang) { - shaderLanguage = lang; - switch (lang) { - case GLSL_1xx: - // Just used in the shader test, and as a basis for the others in DetectShaderLanguage. - glslVersionNumber = 110; - attribute = "attribute"; - varying_vs = "varying"; - varying_fs = "varying"; - fragColor0 = "gl_FragColor"; - fragColor1 = "fragColor1"; - texture = "texture2D"; - texelFetch = nullptr; - bitwiseOps = false; - lastFragData = nullptr; - gles = false; - forceMatrix4x4 = true; - break; - case GLSL_3xx: - // Just used in the shader test. - glslVersionNumber = 300; // GLSL ES 3.0 - varying_vs = "out"; - varying_fs = "in"; - attribute = "in"; - fragColor0 = "fragColor0"; - fragColor1 = "fragColor1"; - texture = "texture"; - texelFetch = nullptr; - bitwiseOps = false; - lastFragData = nullptr; - gles = false; - forceMatrix4x4 = true; - glslES30 = true; - bitwiseOps = true; - texelFetch = "texelFetch"; - break; - case GLSL_VULKAN: - fragColor0 = "fragColor0"; - fragColor1 = "fragColor1"; - varying_fs = "in"; - varying_vs = "out"; - attribute = "in"; - bitwiseOps = true; - framebufferFetchExtension = nullptr; - gles = false; - glslES30 = true; - glslVersionNumber = 450; - lastFragData = nullptr; - texture = "texture"; - texelFetch = "texelFetch"; - forceMatrix4x4 = false; - coefsFromBuffers = true; - break; - case HLSL_D3D9: - case HLSL_D3D11: - fragColor0 = "outfragment.target"; - fragColor1 = "outfragment.target1"; - varying_fs = "in"; - varying_vs = "out"; - attribute = "in"; - bitwiseOps = lang == HLSL_D3D11; - framebufferFetchExtension = nullptr; - gles = false; - glslES30 = true; - glslVersionNumber = 0; - lastFragData = nullptr; - texture = "texture"; - texelFetch = "texelFetch"; - forceMatrix4x4 = false; - coefsFromBuffers = true; - vsOutPrefix = "Out."; - break; - } -} - diff --git a/GPU/D3D11/ShaderManagerD3D11.cpp b/GPU/D3D11/ShaderManagerD3D11.cpp index 88730eec70..255c547ee9 100644 --- a/GPU/D3D11/ShaderManagerD3D11.cpp +++ b/GPU/D3D11/ShaderManagerD3D11.cpp @@ -89,7 +89,7 @@ std::string D3D11VertexShader::GetShaderString(DebugShaderStringType type) const } ShaderManagerD3D11::ShaderManagerD3D11(Draw::DrawContext *draw, ID3D11Device *device, ID3D11DeviceContext *context, D3D_FEATURE_LEVEL featureLevel) - : ShaderManagerCommon(draw), device_(device), context_(context), featureLevel_(featureLevel), compat_(ShaderLanguage::HLSL_D3D11) { + : ShaderManagerCommon(draw), device_(device), context_(context), featureLevel_(featureLevel) { codeBuffer_ = new char[16384]; memset(&ub_base, 0, sizeof(ub_base)); memset(&ub_lights, 0, sizeof(ub_lights)); @@ -210,7 +210,7 @@ void ShaderManagerD3D11::GetShaders(int prim, u32 vertType, D3D11VertexShader ** std::string genErrorString; uint32_t attrMask; uint64_t uniformMask; - GenerateVertexShader(VSID, codeBuffer_, compat_, &attrMask, &uniformMask, &genErrorString); + GenerateVertexShader(VSID, codeBuffer_, draw_->GetShaderLanguageDesc(), &attrMask, &uniformMask, &genErrorString); vs = new D3D11VertexShader(device_, featureLevel_, VSID, codeBuffer_, vertType, useHWTransform); vsCache_[VSID] = vs; } else { @@ -224,7 +224,7 @@ void ShaderManagerD3D11::GetShaders(int prim, u32 vertType, D3D11VertexShader ** // Fragment shader not in cache. Let's compile it. std::string genErrorString; uint64_t uniformMask; - GenerateFragmentShader(FSID, codeBuffer_, compat_, &uniformMask, &genErrorString); + GenerateFragmentShader(FSID, codeBuffer_, draw_->GetShaderLanguageDesc(), &uniformMask, &genErrorString); fs = new D3D11FragmentShader(device_, featureLevel_, FSID, codeBuffer_, useHWTransform); fsCache_[FSID] = fs; } else { diff --git a/GPU/D3D11/ShaderManagerD3D11.h b/GPU/D3D11/ShaderManagerD3D11.h index 140a9a3656..fe21710ad9 100644 --- a/GPU/D3D11/ShaderManagerD3D11.h +++ b/GPU/D3D11/ShaderManagerD3D11.h @@ -110,7 +110,6 @@ private: ID3D11Device *device_; ID3D11DeviceContext *context_; D3D_FEATURE_LEVEL featureLevel_; - ShaderLanguageDesc compat_; typedef std::map FSCache; FSCache fsCache_; diff --git a/GPU/Directx9/ShaderManagerDX9.cpp b/GPU/Directx9/ShaderManagerDX9.cpp index 4aafbcb290..bb423ca233 100644 --- a/GPU/Directx9/ShaderManagerDX9.cpp +++ b/GPU/Directx9/ShaderManagerDX9.cpp @@ -502,7 +502,7 @@ void ShaderManagerDX9::VSUpdateUniforms(u64 dirtyUniforms) { } ShaderManagerDX9::ShaderManagerDX9(Draw::DrawContext *draw, LPDIRECT3DDEVICE9 device) - : ShaderManagerCommon(draw), device_(device), compat_(HLSL_D3D9) { + : ShaderManagerCommon(draw), device_(device) { codeBuffer_ = new char[32768]; } @@ -582,7 +582,7 @@ VSShader *ShaderManagerDX9::ApplyShader(bool useHWTransform, bool useHWTessellat std::string genErrorString; uint32_t attrMask; uint64_t uniformMask; - if (GenerateVertexShader(VSID, codeBuffer_, compat_, &attrMask, &uniformMask, &genErrorString)) { + if (GenerateVertexShader(VSID, codeBuffer_, draw_->GetShaderLanguageDesc(), &attrMask, &uniformMask, &genErrorString)) { vs = new VSShader(device_, VSID, codeBuffer_, useHWTransform); } if (!vs || vs->Failed()) { @@ -607,7 +607,7 @@ VSShader *ShaderManagerDX9::ApplyShader(bool useHWTransform, bool useHWTessellat // Can still work with software transform. uint32_t attrMask; uint64_t uniformMask; - bool success = GenerateVertexShader(VSID, codeBuffer_, compat_, &attrMask, &uniformMask, &genErrorString); + bool success = GenerateVertexShader(VSID, codeBuffer_, draw_->GetShaderLanguageDesc(), &attrMask, &uniformMask, &genErrorString); _assert_(success); vs = new VSShader(device_, VSID, codeBuffer_, false); } @@ -624,7 +624,7 @@ VSShader *ShaderManagerDX9::ApplyShader(bool useHWTransform, bool useHWTessellat // Fragment shader not in cache. Let's compile it. std::string errorString; uint64_t uniformMask; - bool success = GenerateFragmentShader(FSID, codeBuffer_, compat_, &uniformMask, &errorString); + bool success = GenerateFragmentShader(FSID, codeBuffer_, draw_->GetShaderLanguageDesc(), &uniformMask, &errorString); // We're supposed to handle all possible cases. _assert_(success); fs = new PSShader(device_, FSID, codeBuffer_); diff --git a/GPU/Directx9/ShaderManagerDX9.h b/GPU/Directx9/ShaderManagerDX9.h index 8e132e2a31..d8062ef881 100644 --- a/GPU/Directx9/ShaderManagerDX9.h +++ b/GPU/Directx9/ShaderManagerDX9.h @@ -111,7 +111,6 @@ private: void Clear(); LPDIRECT3DDEVICE9 device_; - ShaderLanguageDesc compat_; FShaderID lastFSID_; VShaderID lastVSID_; diff --git a/GPU/GLES/FramebufferManagerGLES.cpp b/GPU/GLES/FramebufferManagerGLES.cpp index 192ed1df28..6d625b2de5 100644 --- a/GPU/GLES/FramebufferManagerGLES.cpp +++ b/GPU/GLES/FramebufferManagerGLES.cpp @@ -360,6 +360,8 @@ void FramebufferManagerGLES::BlitFramebuffer(VirtualFramebuffer *dst, int dstX, if (useBlit) { draw_->BlitFramebuffer(src->fbo, srcX1, srcY1, srcX2, srcY2, dst->fbo, dstX1, dstY1, dstX2, dstY2, Draw::FB_COLOR_BIT, Draw::FB_BLIT_NEAREST, "BlitFramebuffer"); } else { + // TODO: Move this workaround out into thin3d, instead of dirtying up the code here. + draw_->BindFramebufferAsRenderTarget(dst->fbo, { Draw::RPAction::KEEP, Draw::RPAction::KEEP, Draw::RPAction::KEEP }, "BlitFramebuffer"); draw_->BindFramebufferAsTexture(src->fbo, 0, Draw::FB_COLOR_BIT, 0); @@ -376,7 +378,7 @@ void FramebufferManagerGLES::BlitFramebuffer(VirtualFramebuffer *dst, int dstX, float srcW = src->bufferWidth; float srcH = src->bufferHeight; render_->BindProgram(draw2dprogram_); - DrawActiveTexture(dstX1, dstY1, w * dstXFactor, h, dst->bufferWidth, dst->bufferHeight, srcX1 / srcW, srcY1 / srcH, srcX2 / srcW, srcY2 / srcH, ROTATION_LOCKED_HORIZONTAL, DRAWTEX_NEAREST); + DrawActiveTexture(dstX1, dstY1, w * dstXFactor, h * dstYFactor, dst->bufferWidth, dst->bufferHeight, srcX1 / srcW, srcY1 / srcH, srcX2 / srcW, srcY2 / srcH, ROTATION_LOCKED_HORIZONTAL, DRAWTEX_NEAREST); textureCacheGL_->ForgetLastTexture(); } diff --git a/GPU/GLES/ShaderManagerGLES.cpp b/GPU/GLES/ShaderManagerGLES.cpp index be3358c959..a8d23c88ba 100644 --- a/GPU/GLES/ShaderManagerGLES.cpp +++ b/GPU/GLES/ShaderManagerGLES.cpp @@ -572,95 +572,17 @@ void LinkedShader::UpdateUniforms(u32 vertType, const ShaderID &vsid, bool useBu } ShaderManagerGLES::ShaderManagerGLES(Draw::DrawContext *draw) - : ShaderManagerCommon(draw), compat_(GLSL_1xx), fsCache_(16), vsCache_(16) { + : ShaderManagerCommon(draw), fsCache_(16), vsCache_(16) { render_ = (GLRenderManager *)draw->GetNativeObject(Draw::NativeObject::RENDER_MANAGER); codeBuffer_ = new char[16384]; lastFSID_.set_invalid(); lastVSID_.set_invalid(); - DetectShaderLanguage(); } ShaderManagerGLES::~ShaderManagerGLES() { delete [] codeBuffer_; } -void ShaderManagerGLES::DetectShaderLanguage() { - ShaderLanguageDesc &compat = compat_; - - compat.gles = gl_extensions.IsGLES; - - if (compat.gles) { - if (gstate_c.Supports(GPU_SUPPORTS_GLSL_ES_300)) { - compat.shaderLanguage = ShaderLanguage::GLSL_3xx; - compat.glslVersionNumber = 300; // GLSL ES 3.0 - compat.fragColor0 = "fragColor0"; - compat.texture = "texture"; - compat.glslES30 = true; - compat.bitwiseOps = true; - compat.texelFetch = "texelFetch"; - compat.varying_vs = "out"; - compat.varying_fs = "in"; - compat.attribute = "in"; - } else { - compat.shaderLanguage = ShaderLanguage::GLSL_1xx; - compat.glslVersionNumber = 100; // GLSL ES 1.0 - if (gl_extensions.EXT_gpu_shader4) { - compat.bitwiseOps = true; - compat.texelFetch = "texelFetch2D"; - } - if (gl_extensions.EXT_blend_func_extended) { - // Oldy moldy GLES, so use the fixed output name. - compat.fragColor1 = "gl_SecondaryFragColorEXT"; - } - } - } else { - if (!gl_extensions.ForceGL2 || gl_extensions.IsCoreContext) { - if (gl_extensions.VersionGEThan(3, 3, 0)) { - compat.shaderLanguage = ShaderLanguage::GLSL_3xx; - compat.glslVersionNumber = 330; - compat.fragColor0 = "fragColor0"; - compat.texture = "texture"; - compat.glslES30 = true; - compat.bitwiseOps = true; - compat.texelFetch = "texelFetch"; - compat.varying_vs = "out"; - compat.varying_fs = "in"; - compat.attribute = "in"; - } else if (gl_extensions.VersionGEThan(3, 0, 0)) { - compat.shaderLanguage = ShaderLanguage::GLSL_1xx; - compat.glslVersionNumber = 130; - compat.fragColor0 = "fragColor0"; - compat.bitwiseOps = true; - compat.texelFetch = "texelFetch"; - } else { - compat.shaderLanguage = ShaderLanguage::GLSL_1xx; - compat.glslVersionNumber = 110; - if (gl_extensions.EXT_gpu_shader4) { - compat.bitwiseOps = true; - compat.texelFetch = "texelFetch2D"; - } - } - } - } - - if (gstate_c.Supports(GPU_SUPPORTS_ANY_FRAMEBUFFER_FETCH)) { - if (gstate_c.Supports(GPU_SUPPORTS_GLSL_ES_300) && gl_extensions.EXT_shader_framebuffer_fetch) { - compat.framebufferFetchExtension = "#extension GL_EXT_shader_framebuffer_fetch : require"; - compat.lastFragData = "fragColor0"; - } else if (gl_extensions.EXT_shader_framebuffer_fetch) { - compat.framebufferFetchExtension = "#extension GL_EXT_shader_framebuffer_fetch : require"; - compat.lastFragData = "gl_LastFragData[0]"; - } else if (gl_extensions.NV_shader_framebuffer_fetch) { - // GL_NV_shader_framebuffer_fetch is available on mobile platform and ES 2.0 only but not on desktop. - compat.framebufferFetchExtension = "#extension GL_NV_shader_framebuffer_fetch : require"; - compat.lastFragData = "gl_LastFragData[0]"; - } else if (gl_extensions.ARM_shader_framebuffer_fetch) { - compat.framebufferFetchExtension = "#extension GL_ARM_shader_framebuffer_fetch : require"; - compat.lastFragData = "gl_LastFragColorARM"; - } - } -} - void ShaderManagerGLES::Clear() { DirtyLastShader(); for (auto iter = linkedShaderCache_.begin(); iter != linkedShaderCache_.end(); ++iter) { @@ -709,7 +631,7 @@ void ShaderManagerGLES::DirtyLastShader() { Shader *ShaderManagerGLES::CompileFragmentShader(FShaderID FSID) { uint64_t uniformMask; std::string errorString; - if (!GenerateFragmentShader(FSID, codeBuffer_, compat_, &uniformMask, &errorString)) { + if (!GenerateFragmentShader(FSID, codeBuffer_, draw_->GetShaderLanguageDesc(), &uniformMask, &errorString)) { ERROR_LOG(G3D, "Shader gen error: %s", errorString.c_str()); return nullptr; } @@ -722,7 +644,7 @@ Shader *ShaderManagerGLES::CompileVertexShader(VShaderID VSID) { uint32_t attrMask; uint64_t uniformMask; std::string errorString; - if (!GenerateVertexShader(VSID, codeBuffer_, compat_, &attrMask, &uniformMask, &errorString)) { + if (!GenerateVertexShader(VSID, codeBuffer_, draw_->GetShaderLanguageDesc(), &attrMask, &uniformMask, &errorString)) { ERROR_LOG(G3D, "Shader gen error: %s", errorString.c_str()); return nullptr; } diff --git a/GPU/GLES/ShaderManagerGLES.h b/GPU/GLES/ShaderManagerGLES.h index 2343f7d508..71e5541631 100644 --- a/GPU/GLES/ShaderManagerGLES.h +++ b/GPU/GLES/ShaderManagerGLES.h @@ -170,7 +170,6 @@ private: void Clear(); Shader *CompileFragmentShader(FShaderID id); Shader *CompileVertexShader(VShaderID id); - void DetectShaderLanguage(); struct LinkedShaderCacheEntry { LinkedShaderCacheEntry(Shader *vs_, Shader *fs_, LinkedShader *ls_) @@ -183,7 +182,6 @@ private: typedef std::vector LinkedShaderCache; GLRenderManager *render_; - ShaderLanguageDesc compat_; LinkedShaderCache linkedShaderCache_; bool lastVShaderSame_; From 6cf261a0f7319cdc43d0b1439a6c970056444ed3 Mon Sep 17 00:00:00 2001 From: iota97 Date: Fri, 6 Nov 2020 10:53:57 +0100 Subject: [PATCH 202/275] Fix off by one --- Qt/mainwindow.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Qt/mainwindow.cpp b/Qt/mainwindow.cpp index a38e7f1fa3..38258740ce 100644 --- a/Qt/mainwindow.cpp +++ b/Qt/mainwindow.cpp @@ -477,6 +477,7 @@ void MainWindow::SetWindowScale(int zoom) { #else resize(g_Config.iWindowWidth, g_Config.iWindowHeight); #endif + updateMenus(); } void MainWindow::SetGameTitle(QString text) @@ -603,7 +604,7 @@ void MainWindow::createMenus() MenuTree* windowMenu = new MenuTree(this, gameSettingsMenu, QT_TR_NOOP("&Window size")); windowGroup = new MenuActionGroup(this, windowMenu, SLOT(windowGroup_triggered(QAction *)), QStringList() << "&1x" << "&2x" << "&3x" << "&4x" << "&5x" << "&6x" << "&7x" << "&8x" << "&9x" << "1&0x", - QList() << 0 << 1 << 2 << 3 << 4 << 5 << 6 << 7 << 8 << 9); + QList() << 1 << 2 << 3 << 4 << 5 << 6 << 7 << 8 << 9 << 10); MenuTree* renderingModeMenu = new MenuTree(this, gameSettingsMenu, QT_TR_NOOP("Rendering m&ode")); renderingModeGroup = new MenuActionGroup(this, renderingModeMenu, SLOT(renderingModeGroup_triggered(QAction *)), From 381ca11561fcd23a06839a8cb192c97bb895d635 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Fri, 6 Nov 2020 21:40:31 +0100 Subject: [PATCH 203/275] Fix bugs caused by 44ec286ba4 --- GPU/Common/FramebufferManagerCommon.cpp | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/GPU/Common/FramebufferManagerCommon.cpp b/GPU/Common/FramebufferManagerCommon.cpp index 6d0744dea9..566128150c 100644 --- a/GPU/Common/FramebufferManagerCommon.cpp +++ b/GPU/Common/FramebufferManagerCommon.cpp @@ -1368,9 +1368,6 @@ void FramebufferManagerCommon::FindTransferFramebuffers(VirtualFramebuffer *&dst } VirtualFramebuffer *FramebufferManagerCommon::CreateRAMFramebuffer(uint32_t fbAddress, int width, int height, int stride, GEBufferFormat format) { - float renderWidthFactor = renderWidth_ / 480.0f; - float renderHeightFactor = renderHeight_ / 272.0f; - INFO_LOG(G3D, "Creating RAM framebuffer at %08x (%dx%d, stride %d, format %d)", fbAddress, width, height, stride, format); // A target for the destination is missing - so just create one! @@ -1387,8 +1384,9 @@ VirtualFramebuffer *FramebufferManagerCommon::CreateRAMFramebuffer(uint32_t fbAd vfb->newWidth = vfb->width; vfb->newHeight = vfb->height; vfb->lastFrameNewSize = gpuStats.numFlips; - vfb->renderWidth = (u16)(vfb->width * renderWidthFactor); - vfb->renderHeight = (u16)(vfb->height * renderHeightFactor); + vfb->renderScaleFactor = renderScaleFactor_; + vfb->renderWidth = (u16)(vfb->width * renderScaleFactor_); + vfb->renderHeight = (u16)(vfb->height * renderScaleFactor_); vfb->bufferWidth = vfb->width; vfb->bufferHeight = vfb->height; vfb->format = format; @@ -1441,6 +1439,7 @@ VirtualFramebuffer *FramebufferManagerCommon::FindDownloadTempBuffer(VirtualFram nvfb->height = vfb->height; nvfb->renderWidth = vfb->bufferWidth; nvfb->renderHeight = vfb->bufferHeight; + nvfb->renderScaleFactor = 1.0f; // For readbacks we resize to the original size, of course. nvfb->bufferWidth = vfb->bufferWidth; nvfb->bufferHeight = vfb->bufferHeight; nvfb->format = vfb->format; From 6a1e669c45b56c4f887064fd3c50cf6423a519df Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Fri, 6 Nov 2020 21:54:51 +0100 Subject: [PATCH 204/275] Fix GLSL version detection bug. Fixes #13631 --- Common/GPU/OpenGL/thin3d_gl.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/Common/GPU/OpenGL/thin3d_gl.cpp b/Common/GPU/OpenGL/thin3d_gl.cpp index ff5d0e08cf..4e9b5b4f92 100644 --- a/Common/GPU/OpenGL/thin3d_gl.cpp +++ b/Common/GPU/OpenGL/thin3d_gl.cpp @@ -607,6 +607,7 @@ OpenGLContext::OpenGLContext() { // Detect shader language features. if (gl_extensions.IsGLES) { + shaderLanguageDesc_.gles = true; if (gl_extensions.GLES3) { shaderLanguageDesc_.shaderLanguage = ShaderLanguage::GLSL_3xx; shaderLanguageDesc_.glslVersionNumber = 300; // GLSL ES 3.0 From 26e09c758bb1d5ac3989a494236fa44e0107bc4b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Fri, 6 Nov 2020 22:42:09 +0100 Subject: [PATCH 205/275] Some GL error logging improvements --- Common/GPU/OpenGL/GLQueueRunner.cpp | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/Common/GPU/OpenGL/GLQueueRunner.cpp b/Common/GPU/OpenGL/GLQueueRunner.cpp index b2914e7de0..35169c03a6 100644 --- a/Common/GPU/OpenGL/GLQueueRunner.cpp +++ b/Common/GPU/OpenGL/GLQueueRunner.cpp @@ -286,6 +286,11 @@ void GLQueueRunner::RunInitSteps(const std::vector &steps, bool ski step.create_shader.shader->desc.c_str(), infoLog.c_str(), LineNumberString(code).c_str()); + std::vector lines; + SplitString(errorString, '\n', lines); + for (auto &line : lines) { + ERROR_LOG(G3D, "%s", line.c_str()); + } if (errorCallback_) { std::string desc = StringFromFormat("Shader compilation failed: %s", step.create_shader.stage == GL_VERTEX_SHADER ? "vertex" : "fragment"); errorCallback_(desc.c_str(), errorString.c_str(), errorCallbackUserData_); @@ -384,14 +389,18 @@ void GLQueueRunner::RunInitSteps(const std::vector &steps, bool ski if (allocatedTextures) { // Users may use replacements or scaling, with high render resolutions, and run out of VRAM. // This detects that, rather than looking like PPSSPP is broken. - // Calling glGetError() isn't great, but at the end of init shouldn't be too bad... + // Calling glGetError() isn't great, but at the end of init, only after creating textures, shouldn't be too bad... GLenum err = glGetError(); if (err == GL_OUT_OF_MEMORY) { WARN_LOG_REPORT(G3D, "GL ran out of GPU memory; switching to low memory mode"); sawOutOfMemory_ = true; } else if (err != GL_NO_ERROR) { // We checked the err anyway, might as well log if there is one. - WARN_LOG(G3D, "Got an error after init: %08x (%s)", err, GLEnumToString(err).c_str()); + std::string errorString = GLEnumToString(err); + WARN_LOG(G3D, "Got an error after init: %08x (%s)", err, errorString.c_str()); + if (errorCallback_) { + errorCallback_("GL frame init error", errorString.c_str(), errorCallbackUserData_); + } } } From e12c0fb205123e1a35eacf0a925779bf59432c2c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Fri, 6 Nov 2020 23:19:44 +0100 Subject: [PATCH 206/275] Oops, what happened there.. --- Common/GPU/OpenGL/GLQueueRunner.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/Common/GPU/OpenGL/GLQueueRunner.cpp b/Common/GPU/OpenGL/GLQueueRunner.cpp index 35169c03a6..597f92cac1 100644 --- a/Common/GPU/OpenGL/GLQueueRunner.cpp +++ b/Common/GPU/OpenGL/GLQueueRunner.cpp @@ -296,7 +296,6 @@ void GLQueueRunner::RunInitSteps(const std::vector &steps, bool ski errorCallback_(desc.c_str(), errorString.c_str(), errorCallbackUserData_); } Reporting::ReportMessage("Error in shader compilation: info: %s\n%s\n%s", infoLog.c_str(), step.create_shader.shader->desc.c_str(), (const char *)code); - } else { #ifdef SHADERLOG OutputDebugStringUTF8(infoLog.c_str()); #endif From caa960ee8e8cf0fcaa150eed4087cc799f10d28f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Sat, 7 Nov 2020 00:32:00 +0100 Subject: [PATCH 207/275] GLSL ES compilers can be very picky about uint/int. Fixes #13628 - for real this time hopefully --- GPU/Common/FragmentShaderGenerator.cpp | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/GPU/Common/FragmentShaderGenerator.cpp b/GPU/Common/FragmentShaderGenerator.cpp index 10b34cf167..420b14c192 100644 --- a/GPU/Common/FragmentShaderGenerator.cpp +++ b/GPU/Common/FragmentShaderGenerator.cpp @@ -500,7 +500,7 @@ bool GenerateFragmentShader(const FShaderID &id, char *buffer, const ShaderLangu } WRITE(p, " vec2 tsize = vec2(textureSize(tex, 0));\n"); WRITE(p, " vec2 fraction;\n"); - WRITE(p, " bool bilinear = (u_depal_mask_shift_off_fmt >> 31) != 0;\n"); + WRITE(p, " bool bilinear = (u_depal_mask_shift_off_fmt >> 31) != 0U;\n"); WRITE(p, " if (bilinear) {\n"); WRITE(p, " uv_round = uv * tsize - vec2(0.5, 0.5);\n"); WRITE(p, " fraction = fract(uv_round);\n"); @@ -512,13 +512,13 @@ bool GenerateFragmentShader(const FShaderID &id, char *buffer, const ShaderLangu WRITE(p, " vec4 t1 = %sOffset(tex, uv_round, ivec2(1, 0));\n", compat.texture); WRITE(p, " vec4 t2 = %sOffset(tex, uv_round, ivec2(0, 1));\n", compat.texture); WRITE(p, " vec4 t3 = %sOffset(tex, uv_round, ivec2(1, 1));\n", compat.texture); - WRITE(p, " uint depalMask = (u_depal_mask_shift_off_fmt & 0xFF);\n"); - WRITE(p, " uint depalShift = (u_depal_mask_shift_off_fmt >> 8) & 0xFF;\n"); - WRITE(p, " uint depalOffset = ((u_depal_mask_shift_off_fmt >> 16) & 0xFF) << 4;\n"); - WRITE(p, " uint depalFmt = (u_depal_mask_shift_off_fmt >> 24) & 0x3;\n"); + WRITE(p, " uint depalMask = (u_depal_mask_shift_off_fmt & 0xFFU);\n"); + WRITE(p, " uint depalShift = (u_depal_mask_shift_off_fmt >> 8) & 0xFFU;\n"); + WRITE(p, " uint depalOffset = ((u_depal_mask_shift_off_fmt >> 16) & 0xFFU) << 4;\n"); + WRITE(p, " uint depalFmt = (u_depal_mask_shift_off_fmt >> 24) & 0x3U;\n"); WRITE(p, " uvec4 col; uint index0; uint index1; uint index2; uint index3;\n"); WRITE(p, " switch (depalFmt) {\n"); // We might want to include fmt in the shader ID if this is a performance issue. - WRITE(p, " case 0:\n"); // 565 + WRITE(p, " case 0U:\n"); // 565 WRITE(p, " col = uvec4(t.rgb * vec3(31.99, 63.99, 31.99), 0);\n"); WRITE(p, " index0 = (col.b << 11) | (col.g << 5) | (col.r);\n"); WRITE(p, " if (bilinear) {\n"); @@ -530,7 +530,7 @@ bool GenerateFragmentShader(const FShaderID &id, char *buffer, const ShaderLangu WRITE(p, " index3 = (col.b << 11) | (col.g << 5) | (col.r);\n"); WRITE(p, " }\n"); WRITE(p, " break;\n"); - WRITE(p, " case 1:\n"); // 5551 + WRITE(p, " case 1U:\n"); // 5551 WRITE(p, " col = uvec4(t.rgba * vec4(31.99, 31.99, 31.99, 1.0));\n"); WRITE(p, " index0 = (col.a << 15) | (col.b << 10) | (col.g << 5) | (col.r);\n"); WRITE(p, " if (bilinear) {\n"); @@ -542,7 +542,7 @@ bool GenerateFragmentShader(const FShaderID &id, char *buffer, const ShaderLangu WRITE(p, " index3 = (col.a << 15) | (col.b << 10) | (col.g << 5) | (col.r);\n"); WRITE(p, " }\n"); WRITE(p, " break;\n"); - WRITE(p, " case 2:\n"); // 4444 + WRITE(p, " case 2U:\n"); // 4444 WRITE(p, " col = uvec4(t.rgba * 15.99);\n"); WRITE(p, " index0 = (col.a << 12) | (col.b << 8) | (col.g << 4) | (col.r);\n"); WRITE(p, " if (bilinear) {\n"); @@ -554,7 +554,7 @@ bool GenerateFragmentShader(const FShaderID &id, char *buffer, const ShaderLangu WRITE(p, " index3 = (col.a << 12) | (col.b << 8) | (col.g << 4) | (col.r);\n"); WRITE(p, " }\n"); WRITE(p, " break;\n"); - WRITE(p, " case 3:\n"); // 8888 + WRITE(p, " case 3U:\n"); // 8888 WRITE(p, " col = uvec4(t.rgba * 255.99);\n"); WRITE(p, " index0 = (col.a << 24) | (col.b << 16) | (col.g << 8) | (col.r);\n"); WRITE(p, " if (bilinear) {\n"); From e37468700d9048b8e2af72c5b0d0a2e4fc034ca4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Sat, 7 Nov 2020 00:57:26 +0100 Subject: [PATCH 208/275] Remove some accidentally added lines --- GPU/Common/FramebufferManagerCommon.h | 5 ----- 1 file changed, 5 deletions(-) diff --git a/GPU/Common/FramebufferManagerCommon.h b/GPU/Common/FramebufferManagerCommon.h index 3df8b69acf..3f3388bb17 100644 --- a/GPU/Common/FramebufferManagerCommon.h +++ b/GPU/Common/FramebufferManagerCommon.h @@ -424,9 +424,4 @@ protected: FBO_OLD_AGE = 5, FBO_OLD_USAGE_FLAG = 15, }; - - // Thin3D stuff for reinterpreting image data between the various 16-bit formats. - // Safe, not optimal - there might be input attachment tricks, etc, but we can't use them - // since we don't want N different implementations. - Draw::Pipeline *reinterpretFromTo_[3][3]; }; From d9ee06a60d52bbeec06d7fcc988b7960a0e987d9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Sat, 7 Nov 2020 00:56:48 +0100 Subject: [PATCH 209/275] Reorganize the DeviceLost code a little. FramebufferManagerCommon now sees it. --- Common/GPU/Vulkan/thin3d_vulkan.cpp | 2 ++ GPU/Common/FramebufferManagerCommon.cpp | 11 +++++++++++ GPU/Common/FramebufferManagerCommon.h | 3 +++ GPU/D3D11/FramebufferManagerD3D11.cpp | 4 ---- GPU/D3D11/FramebufferManagerD3D11.h | 1 - GPU/D3D11/GPU_D3D11.cpp | 4 +++- GPU/Directx9/FramebufferManagerDX9.cpp | 4 ---- GPU/Directx9/FramebufferManagerDX9.h | 1 - GPU/Directx9/GPU_DX9.cpp | 4 ++-- GPU/GLES/FramebufferManagerGLES.cpp | 8 +++----- GPU/GLES/FramebufferManagerGLES.h | 7 ++++--- GPU/GLES/GPU_GLES.cpp | 9 +++------ GPU/GPUCommon.cpp | 12 ++++++++++++ GPU/GPUCommon.h | 3 +++ GPU/Vulkan/FramebufferManagerVulkan.cpp | 11 ++++------- GPU/Vulkan/FramebufferManagerVulkan.h | 5 +++-- GPU/Vulkan/GPU_Vulkan.cpp | 7 +++---- 17 files changed, 56 insertions(+), 40 deletions(-) diff --git a/Common/GPU/Vulkan/thin3d_vulkan.cpp b/Common/GPU/Vulkan/thin3d_vulkan.cpp index eabd2b0a72..e59f88d42c 100644 --- a/Common/GPU/Vulkan/thin3d_vulkan.cpp +++ b/Common/GPU/Vulkan/thin3d_vulkan.cpp @@ -465,6 +465,8 @@ public: uint64_t GetNativeObject(NativeObject obj) override { switch (obj) { + case NativeObject::CONTEXT: + return (uint64_t)vulkan_; case NativeObject::FRAMEBUFFER_RENDERPASS: // Return a representative renderpass. return (uint64_t)renderManager_.GetFramebufferRenderPass(); diff --git a/GPU/Common/FramebufferManagerCommon.cpp b/GPU/Common/FramebufferManagerCommon.cpp index 566128150c..9419a0c87a 100644 --- a/GPU/Common/FramebufferManagerCommon.cpp +++ b/GPU/Common/FramebufferManagerCommon.cpp @@ -2102,3 +2102,14 @@ std::vector FramebufferManagerCommon::GetFramebufferList() { return list; } + +void FramebufferManagerCommon::DeviceLost() { + DestroyAllFBOs(); + presentation_->DeviceLost(); + draw_ = nullptr; +} + +void FramebufferManagerCommon::DeviceRestore(Draw::DrawContext *draw) { + draw_ = draw; + presentation_->DeviceRestore(draw); +} diff --git a/GPU/Common/FramebufferManagerCommon.h b/GPU/Common/FramebufferManagerCommon.h index 3f3388bb17..fd5ce18f7b 100644 --- a/GPU/Common/FramebufferManagerCommon.h +++ b/GPU/Common/FramebufferManagerCommon.h @@ -305,6 +305,9 @@ public: virtual void Resized(); virtual void DestroyAllFBOs(); + virtual void DeviceLost(); + virtual void DeviceRestore(Draw::DrawContext *draw); + Draw::Framebuffer *GetTempFBO(TempFBO reason, u16 w, u16 h); // Debug features diff --git a/GPU/D3D11/FramebufferManagerD3D11.cpp b/GPU/D3D11/FramebufferManagerD3D11.cpp index 2a90aaa4e4..85c4896a92 100644 --- a/GPU/D3D11/FramebufferManagerD3D11.cpp +++ b/GPU/D3D11/FramebufferManagerD3D11.cpp @@ -468,7 +468,3 @@ void FramebufferManagerD3D11::PackDepthbuffer(VirtualFramebuffer *vfb, int x, in void FramebufferManagerD3D11::EndFrame() { } - -void FramebufferManagerD3D11::DeviceLost() { - DestroyAllFBOs(); -} diff --git a/GPU/D3D11/FramebufferManagerD3D11.h b/GPU/D3D11/FramebufferManagerD3D11.h index a8a4089198..6f8922fbe8 100644 --- a/GPU/D3D11/FramebufferManagerD3D11.h +++ b/GPU/D3D11/FramebufferManagerD3D11.h @@ -42,7 +42,6 @@ public: void DrawActiveTexture(float x, float y, float w, float h, float destW, float destH, float u0, float v0, float u1, float v1, int uvRotation, int flags) override; void EndFrame(); - void DeviceLost(); void ReformatFramebufferFrom(VirtualFramebuffer *vfb, GEBufferFormat old) override; void BindFramebufferAsColorTexture(int stage, VirtualFramebuffer *framebuffer, int flags); diff --git a/GPU/D3D11/GPU_D3D11.cpp b/GPU/D3D11/GPU_D3D11.cpp index 63940fab8d..6207358c73 100644 --- a/GPU/D3D11/GPU_D3D11.cpp +++ b/GPU/D3D11/GPU_D3D11.cpp @@ -198,10 +198,12 @@ void GPU_D3D11::DeviceLost() { shaderManagerD3D11_->ClearShaders(); drawEngine_.ClearInputLayoutMap(); textureCacheD3D11_->Clear(false); - framebufferManagerD3D11_->DeviceLost(); + + GPUCommon::DeviceLost(); } void GPU_D3D11::DeviceRestore() { + GPUCommon::DeviceRestore(); // Nothing needed. } diff --git a/GPU/Directx9/FramebufferManagerDX9.cpp b/GPU/Directx9/FramebufferManagerDX9.cpp index 951406c80d..a820c3ece0 100644 --- a/GPU/Directx9/FramebufferManagerDX9.cpp +++ b/GPU/Directx9/FramebufferManagerDX9.cpp @@ -559,10 +559,6 @@ static const D3DVERTEXELEMENT9 g_FramebufferVertexElements[] = { void FramebufferManagerDX9::EndFrame() { } - void FramebufferManagerDX9::DeviceLost() { - DestroyAllFBOs(); - } - void FramebufferManagerDX9::DecimateFBOs() { FramebufferManagerCommon::DecimateFBOs(); for (auto it = offscreenSurfaces_.begin(); it != offscreenSurfaces_.end(); ) { diff --git a/GPU/Directx9/FramebufferManagerDX9.h b/GPU/Directx9/FramebufferManagerDX9.h index 3a8578599a..24ea2b0e28 100644 --- a/GPU/Directx9/FramebufferManagerDX9.h +++ b/GPU/Directx9/FramebufferManagerDX9.h @@ -47,7 +47,6 @@ public: void DestroyAllFBOs(); void EndFrame(); - void DeviceLost(); void ReformatFramebufferFrom(VirtualFramebuffer *vfb, GEBufferFormat old) override; void BindFramebufferAsColorTexture(int stage, VirtualFramebuffer *framebuffer, int flags); diff --git a/GPU/Directx9/GPU_DX9.cpp b/GPU/Directx9/GPU_DX9.cpp index b2f2b5aa11..ec9cf20385 100644 --- a/GPU/Directx9/GPU_DX9.cpp +++ b/GPU/Directx9/GPU_DX9.cpp @@ -242,13 +242,13 @@ void GPU_DX9::BuildReportingInfo() { void GPU_DX9::DeviceLost() { // Simply drop all caches and textures. - // FBOs appear to survive? Or no? shaderManagerDX9_->ClearCache(false); textureCacheDX9_->Clear(false); - framebufferManagerDX9_->DeviceLost(); + GPUCommon::DeviceLost(); } void GPU_DX9::DeviceRestore() { + GPUCommon::DeviceRestore(); // Nothing needed. } diff --git a/GPU/GLES/FramebufferManagerGLES.cpp b/GPU/GLES/FramebufferManagerGLES.cpp index 6d625b2de5..8e6a8e2233 100644 --- a/GPU/GLES/FramebufferManagerGLES.cpp +++ b/GPU/GLES/FramebufferManagerGLES.cpp @@ -389,16 +389,14 @@ void FramebufferManagerGLES::EndFrame() { } void FramebufferManagerGLES::DeviceLost() { - DestroyAllFBOs(); + FramebufferManagerCommon::DeviceLost(); DestroyDeviceObjects(); - presentation_->DeviceLost(); } void FramebufferManagerGLES::DeviceRestore(Draw::DrawContext *draw) { - draw_ = draw; - presentation_->DeviceRestore(draw); - render_ = (GLRenderManager *)draw_->GetNativeObject(Draw::NativeObject::RENDER_MANAGER); + FramebufferManagerCommon::DeviceRestore(draw); CreateDeviceObjects(); + render_ = (GLRenderManager *)draw_->GetNativeObject(Draw::NativeObject::RENDER_MANAGER); } void FramebufferManagerGLES::Resized() { diff --git a/GPU/GLES/FramebufferManagerGLES.h b/GPU/GLES/FramebufferManagerGLES.h index 51d44af73c..f87c707ab8 100644 --- a/GPU/GLES/FramebufferManagerGLES.h +++ b/GPU/GLES/FramebufferManagerGLES.h @@ -46,7 +46,10 @@ public: virtual void Init() override; void EndFrame(); void Resized() override; - void DeviceLost(); + + void DeviceLost() override; + void DeviceRestore(Draw::DrawContext *draw) override; + void ReformatFramebufferFrom(VirtualFramebuffer *vfb, GEBufferFormat old) override; // For use when texturing from a framebuffer. May create a duplicate if target. @@ -56,8 +59,6 @@ public: bool GetOutputFramebuffer(GPUDebugBuffer &buffer) override; - void DeviceRestore(Draw::DrawContext *draw); - protected: // Used by ReadFramebufferToMemory and later framebuffer block copies void BlitFramebuffer(VirtualFramebuffer *dst, int dstX, int dstY, VirtualFramebuffer *src, int srcX, int srcY, int w, int h, int bpp) override; diff --git a/GPU/GLES/GPU_GLES.cpp b/GPU/GLES/GPU_GLES.cpp index fb18350c1e..ea55a990ed 100644 --- a/GPU/GLES/GPU_GLES.cpp +++ b/GPU/GLES/GPU_GLES.cpp @@ -300,21 +300,18 @@ void GPU_GLES::DeviceLost() { fragmentTestCache_.DeviceLost(); depalShaderCache_.DeviceLost(); drawEngine_.DeviceLost(); - framebufferManagerGL_->DeviceLost(); - // Don't even try to access the lost device. - draw_ = nullptr; + + GPUCommon::DeviceLost(); } void GPU_GLES::DeviceRestore() { - draw_ = (Draw::DrawContext *)PSP_CoreParameter().graphicsContext->GetDrawContext(); - INFO_LOG(G3D, "GPU_GLES: DeviceRestore"); + GPUCommon::DeviceRestore(); UpdateCmdInfo(); UpdateVsyncInterval(true); shaderManagerGL_->DeviceRestore(draw_); textureCacheGL_->DeviceRestore(draw_); - framebufferManagerGL_->DeviceRestore(draw_); drawEngine_.DeviceRestore(draw_); fragmentTestCache_.DeviceRestore(draw_); depalShaderCache_.DeviceRestore(draw_); diff --git a/GPU/GPUCommon.cpp b/GPU/GPUCommon.cpp index a77a8269ad..b32e26f785 100644 --- a/GPU/GPUCommon.cpp +++ b/GPU/GPUCommon.cpp @@ -468,6 +468,18 @@ void GPUCommon::Reinitialize() { framebufferManager_->DestroyAllFBOs(); } +// Call at the END of the GPU implementation's DeviceLost +void GPUCommon::DeviceLost() { + framebufferManager_->DeviceLost(); + draw_ = nullptr; +} + +// Call at the start of the GPU implementation's DeviceRestore +void GPUCommon::DeviceRestore() { + draw_ = (Draw::DrawContext *)PSP_CoreParameter().graphicsContext->GetDrawContext(); + framebufferManager_->DeviceRestore(draw_); +} + void GPUCommon::UpdateVsyncInterval(bool force) { #if !(PPSSPP_PLATFORM(ANDROID) || defined(USING_QT_UI) || PPSSPP_PLATFORM(UWP) || PPSSPP_PLATFORM(IOS)) int desiredVSyncInterval = g_Config.bVSync ? 1 : 0; diff --git a/GPU/GPUCommon.h b/GPU/GPUCommon.h index f5ff5b87c4..14c0cf4eb9 100644 --- a/GPU/GPUCommon.h +++ b/GPU/GPUCommon.h @@ -260,6 +260,9 @@ public: } protected: + void DeviceLost() override; + void DeviceRestore() override; + void SetDrawType(DrawType type, GEPrimitiveType prim) { if (type != lastDraw_) { // We always flush when drawing splines/beziers so no need to do so here diff --git a/GPU/Vulkan/FramebufferManagerVulkan.cpp b/GPU/Vulkan/FramebufferManagerVulkan.cpp index d04021ff58..1b1c5ae65c 100644 --- a/GPU/Vulkan/FramebufferManagerVulkan.cpp +++ b/GPU/Vulkan/FramebufferManagerVulkan.cpp @@ -388,15 +388,12 @@ void FramebufferManagerVulkan::EndFrame() { } void FramebufferManagerVulkan::DeviceLost() { - DestroyAllFBOs(); + FramebufferManagerCommon::DeviceLost(); DestroyDeviceObjects(); - presentation_->DeviceLost(); } -void FramebufferManagerVulkan::DeviceRestore(VulkanContext *vulkan, Draw::DrawContext *draw) { - vulkan_ = vulkan; - draw_ = draw; - presentation_->DeviceRestore(draw); - +void FramebufferManagerVulkan::DeviceRestore(Draw::DrawContext *draw) { + FramebufferManagerCommon::DeviceRestore(draw); + vulkan_ = (VulkanContext *)draw->GetNativeObject(Draw::NativeObject::CONTEXT); InitDeviceObjects(); } diff --git a/GPU/Vulkan/FramebufferManagerVulkan.h b/GPU/Vulkan/FramebufferManagerVulkan.h index a653aeb15d..9ba0f0fb1d 100644 --- a/GPU/Vulkan/FramebufferManagerVulkan.h +++ b/GPU/Vulkan/FramebufferManagerVulkan.h @@ -49,8 +49,9 @@ public: void BeginFrameVulkan(); // there's a BeginFrame in the base class, which this calls void EndFrame(); - void DeviceLost(); - void DeviceRestore(VulkanContext *vulkan, Draw::DrawContext *draw); + void DeviceLost() override; + void DeviceRestore(Draw::DrawContext *draw) override; + int GetLineWidth(); void ReformatFramebufferFrom(VirtualFramebuffer *vfb, GEBufferFormat old) override; diff --git a/GPU/Vulkan/GPU_Vulkan.cpp b/GPU/Vulkan/GPU_Vulkan.cpp index 0f06c1a970..afdebeef05 100644 --- a/GPU/Vulkan/GPU_Vulkan.cpp +++ b/GPU/Vulkan/GPU_Vulkan.cpp @@ -526,26 +526,25 @@ void GPU_Vulkan::DeviceLost() { SaveCache(shaderCachePath_); } DestroyDeviceObjects(); - framebufferManagerVulkan_->DeviceLost(); vulkan2D_.DeviceLost(); drawEngine_.DeviceLost(); pipelineManager_->DeviceLost(); textureCacheVulkan_->DeviceLost(); depalShaderCache_.DeviceLost(); shaderManagerVulkan_->ClearShaders(); - draw_ = nullptr; + + GPUCommon::DeviceLost(); } void GPU_Vulkan::DeviceRestore() { + GPUCommon::DeviceRestore(); vulkan_ = (VulkanContext *)PSP_CoreParameter().graphicsContext->GetAPIContext(); - draw_ = (Draw::DrawContext *)PSP_CoreParameter().graphicsContext->GetDrawContext(); InitDeviceObjects(); CheckGPUFeatures(); BuildReportingInfo(); UpdateCmdInfo(); - framebufferManagerVulkan_->DeviceRestore(vulkan_, draw_); vulkan2D_.DeviceRestore(vulkan_); drawEngine_.DeviceRestore(vulkan_, draw_); pipelineManager_->DeviceRestore(vulkan_); From a24f4e3e701cf261a6e1c5832fea2fe6a7c0c18f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Sat, 7 Nov 2020 11:03:53 +0100 Subject: [PATCH 210/275] Start unifying BindFramebufferAsColorTexture --- GPU/D3D11/FramebufferManagerD3D11.cpp | 14 +++++++------- GPU/D3D11/FramebufferManagerD3D11.h | 2 +- GPU/Directx9/FramebufferManagerDX9.cpp | 10 ++++------ GPU/Directx9/FramebufferManagerDX9.h | 2 +- GPU/GLES/FramebufferManagerGLES.cpp | 6 ++++-- GPU/GLES/FramebufferManagerGLES.h | 2 +- GPU/Vulkan/FramebufferManagerVulkan.cpp | 16 +++++++++++----- GPU/Vulkan/FramebufferManagerVulkan.h | 2 +- GPU/Vulkan/TextureCacheVulkan.cpp | 13 +++++++++++-- 9 files changed, 41 insertions(+), 26 deletions(-) diff --git a/GPU/D3D11/FramebufferManagerD3D11.cpp b/GPU/D3D11/FramebufferManagerD3D11.cpp index 85c4896a92..c4ebb5f450 100644 --- a/GPU/D3D11/FramebufferManagerD3D11.cpp +++ b/GPU/D3D11/FramebufferManagerD3D11.cpp @@ -314,12 +314,11 @@ static void CopyPixelDepthOnly(u32 *dstp, const u32 *srcp, size_t c) { } } -void FramebufferManagerD3D11::BindFramebufferAsColorTexture(int stage, VirtualFramebuffer *framebuffer, int flags) { +bool FramebufferManagerD3D11::BindFramebufferAsColorTexture(int stage, VirtualFramebuffer *framebuffer, int flags) { if (!framebuffer->fbo || !useBufferedRendering_) { - ID3D11ShaderResourceView *view = nullptr; - context_->PSSetShaderResources(stage, 1, &view); + draw_->BindTexture(0, nullptr); gstate_c.skipDrawReason |= SKIPDRAW_BAD_FB_TEXTURE; - return; + return false; } // currentRenderVfb_ will always be set when this is called, except from the GE debugger. @@ -341,15 +340,16 @@ void FramebufferManagerD3D11::BindFramebufferAsColorTexture(int stage, VirtualFr } else { draw_->BindFramebufferAsTexture(framebuffer->fbo, stage, Draw::FB_COLOR_BIT, 0); } + return true; } else if (framebuffer != currentRenderVfb_ || (flags & BINDFBCOLOR_FORCE_SELF) != 0) { draw_->BindFramebufferAsTexture(framebuffer->fbo, stage, Draw::FB_COLOR_BIT, 0); + return true; } else { ERROR_LOG_REPORT_ONCE(d3d11SelfTexture, G3D, "Attempting to texture from target (src=%08x / target=%08x / flags=%d)", framebuffer->fb_address, currentRenderVfb_->fb_address, flags); // Badness on D3D11 to bind the currently rendered-to framebuffer as a texture. - ID3D11ShaderResourceView *view = nullptr; - context_->PSSetShaderResources(stage, 1, &view); + draw_->BindTexture(0, nullptr); gstate_c.skipDrawReason |= SKIPDRAW_BAD_FB_TEXTURE; - return; + return false; } } diff --git a/GPU/D3D11/FramebufferManagerD3D11.h b/GPU/D3D11/FramebufferManagerD3D11.h index 6f8922fbe8..497af969a1 100644 --- a/GPU/D3D11/FramebufferManagerD3D11.h +++ b/GPU/D3D11/FramebufferManagerD3D11.h @@ -44,7 +44,7 @@ public: void EndFrame(); void ReformatFramebufferFrom(VirtualFramebuffer *vfb, GEBufferFormat old) override; - void BindFramebufferAsColorTexture(int stage, VirtualFramebuffer *framebuffer, int flags); + bool BindFramebufferAsColorTexture(int stage, VirtualFramebuffer *framebuffer, int flags); virtual bool NotifyStencilUpload(u32 addr, int size, StencilUpload flags = StencilUpload::NEEDS_CLEAR) override; diff --git a/GPU/Directx9/FramebufferManagerDX9.cpp b/GPU/Directx9/FramebufferManagerDX9.cpp index a820c3ece0..b017a59f64 100644 --- a/GPU/Directx9/FramebufferManagerDX9.cpp +++ b/GPU/Directx9/FramebufferManagerDX9.cpp @@ -336,15 +336,11 @@ static const D3DVERTEXELEMENT9 g_FramebufferVertexElements[] = { return offscreen; } - void FramebufferManagerDX9::BindFramebufferAsColorTexture(int stage, VirtualFramebuffer *framebuffer, int flags) { - if (framebuffer == NULL) { - framebuffer = currentRenderVfb_; - } - + bool FramebufferManagerDX9::BindFramebufferAsColorTexture(int stage, VirtualFramebuffer *framebuffer, int flags) { if (!framebuffer->fbo || !useBufferedRendering_) { device_->SetTexture(stage, nullptr); gstate_c.skipDrawReason |= SKIPDRAW_BAD_FB_TEXTURE; - return; + return false; } // currentRenderVfb_ will always be set when this is called, except from the GE debugger. @@ -366,8 +362,10 @@ static const D3DVERTEXELEMENT9 g_FramebufferVertexElements[] = { } else { draw_->BindFramebufferAsTexture(framebuffer->fbo, stage, Draw::FB_COLOR_BIT, 0); } + return true; } else { draw_->BindFramebufferAsTexture(framebuffer->fbo, stage, Draw::FB_COLOR_BIT, 0); + return true; } } diff --git a/GPU/Directx9/FramebufferManagerDX9.h b/GPU/Directx9/FramebufferManagerDX9.h index 24ea2b0e28..99b93c6a62 100644 --- a/GPU/Directx9/FramebufferManagerDX9.h +++ b/GPU/Directx9/FramebufferManagerDX9.h @@ -49,7 +49,7 @@ public: void EndFrame(); void ReformatFramebufferFrom(VirtualFramebuffer *vfb, GEBufferFormat old) override; - void BindFramebufferAsColorTexture(int stage, VirtualFramebuffer *framebuffer, int flags); + bool BindFramebufferAsColorTexture(int stage, VirtualFramebuffer *framebuffer, int flags); virtual bool NotifyStencilUpload(u32 addr, int size, StencilUpload flags = StencilUpload::NEEDS_CLEAR) override; diff --git a/GPU/GLES/FramebufferManagerGLES.cpp b/GPU/GLES/FramebufferManagerGLES.cpp index 8e6a8e2233..eb742f3370 100644 --- a/GPU/GLES/FramebufferManagerGLES.cpp +++ b/GPU/GLES/FramebufferManagerGLES.cpp @@ -263,11 +263,11 @@ void FramebufferManagerGLES::ReformatFramebufferFrom(VirtualFramebuffer *vfb, GE } } -void FramebufferManagerGLES::BindFramebufferAsColorTexture(int stage, VirtualFramebuffer *framebuffer, int flags) { +bool FramebufferManagerGLES::BindFramebufferAsColorTexture(int stage, VirtualFramebuffer *framebuffer, int flags) { if (!framebuffer->fbo || !useBufferedRendering_) { render_->BindTexture(stage, nullptr); gstate_c.skipDrawReason |= SKIPDRAW_BAD_FB_TEXTURE; - return; + return false; } // currentRenderVfb_ will always be set when this is called, except from the GE debugger. @@ -288,8 +288,10 @@ void FramebufferManagerGLES::BindFramebufferAsColorTexture(int stage, VirtualFra } else { draw_->BindFramebufferAsTexture(framebuffer->fbo, stage, Draw::FB_COLOR_BIT, 0); } + return true; } else { draw_->BindFramebufferAsTexture(framebuffer->fbo, stage, Draw::FB_COLOR_BIT, 0); + return true; } } diff --git a/GPU/GLES/FramebufferManagerGLES.h b/GPU/GLES/FramebufferManagerGLES.h index f87c707ab8..fc2e5bcbad 100644 --- a/GPU/GLES/FramebufferManagerGLES.h +++ b/GPU/GLES/FramebufferManagerGLES.h @@ -53,7 +53,7 @@ public: void ReformatFramebufferFrom(VirtualFramebuffer *vfb, GEBufferFormat old) override; // For use when texturing from a framebuffer. May create a duplicate if target. - void BindFramebufferAsColorTexture(int stage, VirtualFramebuffer *framebuffer, int flags); + bool BindFramebufferAsColorTexture(int stage, VirtualFramebuffer *framebuffer, int flags); bool NotifyStencilUpload(u32 addr, int size, StencilUpload flags = StencilUpload::NEEDS_CLEAR) override; diff --git a/GPU/Vulkan/FramebufferManagerVulkan.cpp b/GPU/Vulkan/FramebufferManagerVulkan.cpp index 1b1c5ae65c..4923da7087 100644 --- a/GPU/Vulkan/FramebufferManagerVulkan.cpp +++ b/GPU/Vulkan/FramebufferManagerVulkan.cpp @@ -268,10 +268,11 @@ void FramebufferManagerVulkan::ReformatFramebufferFrom(VirtualFramebuffer *vfb, } } -VkImageView FramebufferManagerVulkan::BindFramebufferAsColorTexture(int stage, VirtualFramebuffer *framebuffer, int flags) { +bool FramebufferManagerVulkan::BindFramebufferAsColorTexture(int stage, VirtualFramebuffer *framebuffer, int flags) { if (!framebuffer->fbo || !useBufferedRendering_) { + draw_->BindTexture(0, nullptr); gstate_c.skipDrawReason |= SKIPDRAW_BAD_FB_TEXTURE; - return VK_NULL_HANDLE; + return false; } // currentRenderVfb_ will always be set when this is called, except from the GE debugger. @@ -293,14 +294,19 @@ VkImageView FramebufferManagerVulkan::BindFramebufferAsColorTexture(int stage, V } else { draw_->BindFramebufferAsTexture(framebuffer->fbo, stage, Draw::FB_COLOR_BIT, 0); } - return (VkImageView)draw_->GetNativeObject(Draw::NativeObject::BOUND_TEXTURE0_IMAGEVIEW); + return true; } else if (framebuffer != currentRenderVfb_ || (flags & BINDFBCOLOR_FORCE_SELF) != 0) { draw_->BindFramebufferAsTexture(framebuffer->fbo, stage, Draw::FB_COLOR_BIT, 0); - return (VkImageView)draw_->GetNativeObject(Draw::NativeObject::BOUND_TEXTURE0_IMAGEVIEW); + return true; } else { ERROR_LOG_REPORT_ONCE(vulkanSelfTexture, G3D, "Attempting to texture from target (src=%08x / target=%08x / flags=%d)", framebuffer->fb_address, currentRenderVfb_->fb_address, flags); // To do this safely in Vulkan, we need to use input attachments. - return VK_NULL_HANDLE; + // Actually if the texture region and render regions don't overlap, this is safe, but we need + // to transition to GENERAL image layout which will take some trickery. + // Badness on D3D11 to bind the currently rendered-to framebuffer as a texture. + draw_->BindTexture(0, nullptr); + gstate_c.skipDrawReason |= SKIPDRAW_BAD_FB_TEXTURE; + return false; } } diff --git a/GPU/Vulkan/FramebufferManagerVulkan.h b/GPU/Vulkan/FramebufferManagerVulkan.h index 9ba0f0fb1d..96e6a74569 100644 --- a/GPU/Vulkan/FramebufferManagerVulkan.h +++ b/GPU/Vulkan/FramebufferManagerVulkan.h @@ -57,7 +57,7 @@ public: bool NotifyStencilUpload(u32 addr, int size, StencilUpload flags = StencilUpload::NEEDS_CLEAR) override; - VkImageView BindFramebufferAsColorTexture(int stage, VirtualFramebuffer *framebuffer, int flags); + bool BindFramebufferAsColorTexture(int stage, VirtualFramebuffer *framebuffer, int flags); // If within a render pass, this will just issue a regular clear. If beginning a new render pass, // do that. diff --git a/GPU/Vulkan/TextureCacheVulkan.cpp b/GPU/Vulkan/TextureCacheVulkan.cpp index 19e232bb93..cf3f6d1758 100644 --- a/GPU/Vulkan/TextureCacheVulkan.cpp +++ b/GPU/Vulkan/TextureCacheVulkan.cpp @@ -558,7 +558,11 @@ void TextureCacheVulkan::ApplyTextureFramebuffer(VirtualFramebuffer *framebuffer TexCacheEntry::TexStatus alphaStatus = CheckAlpha(clutBuf_, getClutDestFormatVulkan(clutFormat), clutTotalColors, clutTotalColors, 1); gstate_c.SetTextureFullAlpha(alphaStatus == TexCacheEntry::STATUS_ALPHA_FULL); curSampler_ = samplerCache_.GetOrCreateSampler(samplerKey); - imageView_ = framebufferManagerVulkan_->BindFramebufferAsColorTexture(0, framebuffer, BINDFBCOLOR_MAY_COPY_WITH_UV | BINDFBCOLOR_APPLY_TEX_OFFSET); + if (framebufferManagerVulkan_->BindFramebufferAsColorTexture(0, framebuffer, BINDFBCOLOR_MAY_COPY_WITH_UV | BINDFBCOLOR_APPLY_TEX_OFFSET)) { + imageView_ = (VkImageView)draw_->GetNativeObject(Draw::NativeObject::BOUND_TEXTURE0_IMAGEVIEW); + } else { + imageView_ = (VkImageView)draw_->GetNativeObject(Draw::NativeObject::NULL_IMAGEVIEW); + } return; } else { depalShader = depalShaderCache_->GetDepalettizeShader(clutMode, depth ? GE_FORMAT_DEPTH16 : framebuffer->drawnFormat); @@ -667,7 +671,12 @@ void TextureCacheVulkan::ApplyTextureFramebuffer(VirtualFramebuffer *framebuffer // Since we may have switched render targets, we need to re-set depth/stencil etc states. gstate_c.Dirty(DIRTY_VIEWPORTSCISSOR_STATE | DIRTY_DEPTHSTENCIL_STATE | DIRTY_BLEND_STATE | DIRTY_RASTER_STATE); } else { - imageView_ = framebufferManagerVulkan_->BindFramebufferAsColorTexture(0, framebuffer, BINDFBCOLOR_MAY_COPY_WITH_UV | BINDFBCOLOR_APPLY_TEX_OFFSET); + if (framebufferManagerVulkan_->BindFramebufferAsColorTexture(0, framebuffer, BINDFBCOLOR_MAY_COPY_WITH_UV | BINDFBCOLOR_APPLY_TEX_OFFSET)) { + imageView_ = (VkImageView)draw_->GetNativeObject(Draw::NativeObject::BOUND_TEXTURE0_IMAGEVIEW); + } else { + imageView_ = (VkImageView)draw_->GetNativeObject(Draw::NativeObject::NULL_IMAGEVIEW); + } + drawEngine_->SetDepalTexture(VK_NULL_HANDLE); gstate_c.SetUseShaderDepal(false); From c23ed09a329da49143c010d1b7fb7cdfa1de5e28 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Sat, 7 Nov 2020 11:10:54 +0100 Subject: [PATCH 211/275] Unify FramebufferManager::BindFramebufferAsColorTexture --- GPU/Common/FramebufferManagerCommon.cpp | 44 +++++++++++++++++++++++++ GPU/Common/FramebufferManagerCommon.h | 1 + GPU/D3D11/FramebufferManagerD3D11.cpp | 39 ---------------------- GPU/D3D11/FramebufferManagerD3D11.h | 2 -- GPU/Directx9/FramebufferManagerDX9.cpp | 33 ------------------- GPU/Directx9/FramebufferManagerDX9.h | 2 -- GPU/GLES/FramebufferManagerGLES.cpp | 32 ------------------ GPU/GLES/FramebufferManagerGLES.h | 3 -- GPU/Vulkan/FramebufferManagerVulkan.cpp | 42 ----------------------- GPU/Vulkan/FramebufferManagerVulkan.h | 2 -- 10 files changed, 45 insertions(+), 155 deletions(-) diff --git a/GPU/Common/FramebufferManagerCommon.cpp b/GPU/Common/FramebufferManagerCommon.cpp index 9419a0c87a..cbfb7a58a3 100644 --- a/GPU/Common/FramebufferManagerCommon.cpp +++ b/GPU/Common/FramebufferManagerCommon.cpp @@ -36,6 +36,7 @@ #include "GPU/Common/PresentationCommon.h" #include "GPU/Common/TextureCacheCommon.h" #include "GPU/Debugger/Record.h" +#include "GPU/Debugger/Stepping.h" #include "GPU/GPUInterface.h" #include "GPU/GPUState.h" @@ -702,6 +703,49 @@ void FramebufferManagerCommon::DrawPixels(VirtualFramebuffer *vfb, int dstX, int } } +bool FramebufferManagerCommon::BindFramebufferAsColorTexture(int stage, VirtualFramebuffer *framebuffer, int flags) { + if (!framebuffer->fbo || !useBufferedRendering_) { + draw_->BindTexture(0, nullptr); + gstate_c.skipDrawReason |= SKIPDRAW_BAD_FB_TEXTURE; + return false; + } + + // currentRenderVfb_ will always be set when this is called, except from the GE debugger. + // Let's just not bother with the copy in that case. + bool skipCopy = (flags & BINDFBCOLOR_MAY_COPY) == 0; + if (GPUStepping::IsStepping()) { + skipCopy = true; + } + // Currently rendering to this framebuffer. Need to make a copy. + if (!skipCopy && framebuffer == currentRenderVfb_) { + // TODO: Maybe merge with bvfbs_? Not sure if those could be packing, and they're created at a different size. + Draw::Framebuffer *renderCopy = GetTempFBO(TempFBO::COPY, framebuffer->renderWidth, framebuffer->renderHeight); + if (renderCopy) { + VirtualFramebuffer copyInfo = *framebuffer; + copyInfo.fbo = renderCopy; + CopyFramebufferForColorTexture(©Info, framebuffer, flags); + RebindFramebuffer("After BindFramebufferAsColorTexture"); + draw_->BindFramebufferAsTexture(renderCopy, stage, Draw::FB_COLOR_BIT, 0); + } else { + draw_->BindFramebufferAsTexture(framebuffer->fbo, stage, Draw::FB_COLOR_BIT, 0); + } + return true; + } else if (framebuffer != currentRenderVfb_ || (flags & BINDFBCOLOR_FORCE_SELF) != 0) { + draw_->BindFramebufferAsTexture(framebuffer->fbo, stage, Draw::FB_COLOR_BIT, 0); + return true; + } else { + ERROR_LOG_REPORT_ONCE(vulkanSelfTexture, G3D, "Attempting to texture from target (src=%08x / target=%08x / flags=%d)", framebuffer->fb_address, currentRenderVfb_->fb_address, flags); + // To do this safely in Vulkan, we need to use input attachments. + // Actually if the texture region and render regions don't overlap, this is safe, but we need + // to transition to GENERAL image layout which will take some trickery. + // Badness on D3D11 to bind the currently rendered-to framebuffer as a texture. + draw_->BindTexture(0, nullptr); + gstate_c.skipDrawReason |= SKIPDRAW_BAD_FB_TEXTURE; + return false; + } + +} + void FramebufferManagerCommon::CopyFramebufferForColorTexture(VirtualFramebuffer *dst, VirtualFramebuffer *src, int flags) { int x = 0; int y = 0; diff --git a/GPU/Common/FramebufferManagerCommon.h b/GPU/Common/FramebufferManagerCommon.h index fd5ce18f7b..26c7e02323 100644 --- a/GPU/Common/FramebufferManagerCommon.h +++ b/GPU/Common/FramebufferManagerCommon.h @@ -233,6 +233,7 @@ public: bool NotifyBlockTransferBefore(u32 dstBasePtr, int dstStride, int dstX, int dstY, u32 srcBasePtr, int srcStride, int srcX, int srcY, int w, int h, int bpp, u32 skipDrawReason); void NotifyBlockTransferAfter(u32 dstBasePtr, int dstStride, int dstX, int dstY, u32 srcBasePtr, int srcStride, int srcX, int srcY, int w, int h, int bpp, u32 skipDrawReason); + bool BindFramebufferAsColorTexture(int stage, VirtualFramebuffer *framebuffer, int flags); void ReadFramebufferToMemory(VirtualFramebuffer *vfb, int x, int y, int w, int h); void DownloadFramebufferForClut(u32 fb_address, u32 loadBytes); diff --git a/GPU/D3D11/FramebufferManagerD3D11.cpp b/GPU/D3D11/FramebufferManagerD3D11.cpp index c4ebb5f450..2538f65edb 100644 --- a/GPU/D3D11/FramebufferManagerD3D11.cpp +++ b/GPU/D3D11/FramebufferManagerD3D11.cpp @@ -314,45 +314,6 @@ static void CopyPixelDepthOnly(u32 *dstp, const u32 *srcp, size_t c) { } } -bool FramebufferManagerD3D11::BindFramebufferAsColorTexture(int stage, VirtualFramebuffer *framebuffer, int flags) { - if (!framebuffer->fbo || !useBufferedRendering_) { - draw_->BindTexture(0, nullptr); - gstate_c.skipDrawReason |= SKIPDRAW_BAD_FB_TEXTURE; - return false; - } - - // currentRenderVfb_ will always be set when this is called, except from the GE debugger. - // Let's just not bother with the copy in that case. - bool skipCopy = (flags & BINDFBCOLOR_MAY_COPY) == 0; - if (GPUStepping::IsStepping()) { - skipCopy = true; - } - // Currently rendering to this framebuffer. Need to make a copy. - if (!skipCopy && framebuffer == currentRenderVfb_) { - // TODO: Maybe merge with bvfbs_? Not sure if those could be packing, and they're created at a different size. - Draw::Framebuffer *renderCopy = GetTempFBO(TempFBO::COPY, framebuffer->renderWidth, framebuffer->renderHeight); - if (renderCopy) { - VirtualFramebuffer copyInfo = *framebuffer; - copyInfo.fbo = renderCopy; - CopyFramebufferForColorTexture(©Info, framebuffer, flags); - RebindFramebuffer("RebindFramebuffer - BindFramebufferAsColorTexture"); - draw_->BindFramebufferAsTexture(renderCopy, stage, Draw::FB_COLOR_BIT, 0); - } else { - draw_->BindFramebufferAsTexture(framebuffer->fbo, stage, Draw::FB_COLOR_BIT, 0); - } - return true; - } else if (framebuffer != currentRenderVfb_ || (flags & BINDFBCOLOR_FORCE_SELF) != 0) { - draw_->BindFramebufferAsTexture(framebuffer->fbo, stage, Draw::FB_COLOR_BIT, 0); - return true; - } else { - ERROR_LOG_REPORT_ONCE(d3d11SelfTexture, G3D, "Attempting to texture from target (src=%08x / target=%08x / flags=%d)", framebuffer->fb_address, currentRenderVfb_->fb_address, flags); - // Badness on D3D11 to bind the currently rendered-to framebuffer as a texture. - draw_->BindTexture(0, nullptr); - gstate_c.skipDrawReason |= SKIPDRAW_BAD_FB_TEXTURE; - return false; - } -} - void FramebufferManagerD3D11::UpdateDownloadTempBuffer(VirtualFramebuffer *nvfb) { // Nothing to do here. } diff --git a/GPU/D3D11/FramebufferManagerD3D11.h b/GPU/D3D11/FramebufferManagerD3D11.h index 497af969a1..ec8f1b00e0 100644 --- a/GPU/D3D11/FramebufferManagerD3D11.h +++ b/GPU/D3D11/FramebufferManagerD3D11.h @@ -44,8 +44,6 @@ public: void EndFrame(); void ReformatFramebufferFrom(VirtualFramebuffer *vfb, GEBufferFormat old) override; - bool BindFramebufferAsColorTexture(int stage, VirtualFramebuffer *framebuffer, int flags); - virtual bool NotifyStencilUpload(u32 addr, int size, StencilUpload flags = StencilUpload::NEEDS_CLEAR) override; // TODO: Remove diff --git a/GPU/Directx9/FramebufferManagerDX9.cpp b/GPU/Directx9/FramebufferManagerDX9.cpp index b017a59f64..4f0aafb78d 100644 --- a/GPU/Directx9/FramebufferManagerDX9.cpp +++ b/GPU/Directx9/FramebufferManagerDX9.cpp @@ -336,39 +336,6 @@ static const D3DVERTEXELEMENT9 g_FramebufferVertexElements[] = { return offscreen; } - bool FramebufferManagerDX9::BindFramebufferAsColorTexture(int stage, VirtualFramebuffer *framebuffer, int flags) { - if (!framebuffer->fbo || !useBufferedRendering_) { - device_->SetTexture(stage, nullptr); - gstate_c.skipDrawReason |= SKIPDRAW_BAD_FB_TEXTURE; - return false; - } - - // currentRenderVfb_ will always be set when this is called, except from the GE debugger. - // Let's just not bother with the copy in that case. - bool skipCopy = (flags & BINDFBCOLOR_MAY_COPY) == 0; - if (GPUStepping::IsStepping()) { - skipCopy = true; - } - if (!skipCopy && framebuffer == currentRenderVfb_) { - // TODO: Maybe merge with bvfbs_? Not sure if those could be packing, and they're created at a different size. - Draw::Framebuffer *renderCopy = GetTempFBO(TempFBO::COPY, framebuffer->renderWidth, framebuffer->renderHeight); - if (renderCopy) { - VirtualFramebuffer copyInfo = *framebuffer; - copyInfo.fbo = renderCopy; - - CopyFramebufferForColorTexture(©Info, framebuffer, flags); - RebindFramebuffer("RebindFramebuffer - BindFramebufferAsColorTexture"); - draw_->BindFramebufferAsTexture(renderCopy, stage, Draw::FB_COLOR_BIT, 0); - } else { - draw_->BindFramebufferAsTexture(framebuffer->fbo, stage, Draw::FB_COLOR_BIT, 0); - } - return true; - } else { - draw_->BindFramebufferAsTexture(framebuffer->fbo, stage, Draw::FB_COLOR_BIT, 0); - return true; - } - } - void FramebufferManagerDX9::UpdateDownloadTempBuffer(VirtualFramebuffer *nvfb) { // Nothing to do here. } diff --git a/GPU/Directx9/FramebufferManagerDX9.h b/GPU/Directx9/FramebufferManagerDX9.h index 99b93c6a62..a35a154265 100644 --- a/GPU/Directx9/FramebufferManagerDX9.h +++ b/GPU/Directx9/FramebufferManagerDX9.h @@ -49,8 +49,6 @@ public: void EndFrame(); void ReformatFramebufferFrom(VirtualFramebuffer *vfb, GEBufferFormat old) override; - bool BindFramebufferAsColorTexture(int stage, VirtualFramebuffer *framebuffer, int flags); - virtual bool NotifyStencilUpload(u32 addr, int size, StencilUpload flags = StencilUpload::NEEDS_CLEAR) override; bool GetFramebuffer(u32 fb_address, int fb_stride, GEBufferFormat format, GPUDebugBuffer &buffer, int maxRes); diff --git a/GPU/GLES/FramebufferManagerGLES.cpp b/GPU/GLES/FramebufferManagerGLES.cpp index eb742f3370..befbe06177 100644 --- a/GPU/GLES/FramebufferManagerGLES.cpp +++ b/GPU/GLES/FramebufferManagerGLES.cpp @@ -263,38 +263,6 @@ void FramebufferManagerGLES::ReformatFramebufferFrom(VirtualFramebuffer *vfb, GE } } -bool FramebufferManagerGLES::BindFramebufferAsColorTexture(int stage, VirtualFramebuffer *framebuffer, int flags) { - if (!framebuffer->fbo || !useBufferedRendering_) { - render_->BindTexture(stage, nullptr); - gstate_c.skipDrawReason |= SKIPDRAW_BAD_FB_TEXTURE; - return false; - } - - // currentRenderVfb_ will always be set when this is called, except from the GE debugger. - // Let's just not bother with the copy in that case. - bool skipCopy = (flags & BINDFBCOLOR_MAY_COPY) == 0; - if (GPUStepping::IsStepping()) { - skipCopy = true; - } - if (!skipCopy && framebuffer == currentRenderVfb_) { - // TODO: Maybe merge with bvfbs_? Not sure if those could be packing, and they're created at a different size. - Draw::Framebuffer *renderCopy = GetTempFBO(TempFBO::COPY, framebuffer->renderWidth, framebuffer->renderHeight); - if (renderCopy) { - VirtualFramebuffer copyInfo = *framebuffer; - copyInfo.fbo = renderCopy; - - CopyFramebufferForColorTexture(©Info, framebuffer, flags); - draw_->BindFramebufferAsTexture(renderCopy, stage, Draw::FB_COLOR_BIT, 0); - } else { - draw_->BindFramebufferAsTexture(framebuffer->fbo, stage, Draw::FB_COLOR_BIT, 0); - } - return true; - } else { - draw_->BindFramebufferAsTexture(framebuffer->fbo, stage, Draw::FB_COLOR_BIT, 0); - return true; - } -} - void FramebufferManagerGLES::UpdateDownloadTempBuffer(VirtualFramebuffer *nvfb) { _assert_msg_(nvfb->fbo, "Expecting a valid nvfb in UpdateDownloadTempBuffer"); diff --git a/GPU/GLES/FramebufferManagerGLES.h b/GPU/GLES/FramebufferManagerGLES.h index fc2e5bcbad..56ad6aa307 100644 --- a/GPU/GLES/FramebufferManagerGLES.h +++ b/GPU/GLES/FramebufferManagerGLES.h @@ -52,9 +52,6 @@ public: void ReformatFramebufferFrom(VirtualFramebuffer *vfb, GEBufferFormat old) override; - // For use when texturing from a framebuffer. May create a duplicate if target. - bool BindFramebufferAsColorTexture(int stage, VirtualFramebuffer *framebuffer, int flags); - bool NotifyStencilUpload(u32 addr, int size, StencilUpload flags = StencilUpload::NEEDS_CLEAR) override; bool GetOutputFramebuffer(GPUDebugBuffer &buffer) override; diff --git a/GPU/Vulkan/FramebufferManagerVulkan.cpp b/GPU/Vulkan/FramebufferManagerVulkan.cpp index 4923da7087..a4e5873f67 100644 --- a/GPU/Vulkan/FramebufferManagerVulkan.cpp +++ b/GPU/Vulkan/FramebufferManagerVulkan.cpp @@ -268,48 +268,6 @@ void FramebufferManagerVulkan::ReformatFramebufferFrom(VirtualFramebuffer *vfb, } } -bool FramebufferManagerVulkan::BindFramebufferAsColorTexture(int stage, VirtualFramebuffer *framebuffer, int flags) { - if (!framebuffer->fbo || !useBufferedRendering_) { - draw_->BindTexture(0, nullptr); - gstate_c.skipDrawReason |= SKIPDRAW_BAD_FB_TEXTURE; - return false; - } - - // currentRenderVfb_ will always be set when this is called, except from the GE debugger. - // Let's just not bother with the copy in that case. - bool skipCopy = (flags & BINDFBCOLOR_MAY_COPY) == 0; - if (GPUStepping::IsStepping()) { - skipCopy = true; - } - // Currently rendering to this framebuffer. Need to make a copy. - if (!skipCopy && framebuffer == currentRenderVfb_) { - // TODO: Maybe merge with bvfbs_? Not sure if those could be packing, and they're created at a different size. - Draw::Framebuffer *renderCopy = GetTempFBO(TempFBO::COPY, framebuffer->renderWidth, framebuffer->renderHeight); - if (renderCopy) { - VirtualFramebuffer copyInfo = *framebuffer; - copyInfo.fbo = renderCopy; - CopyFramebufferForColorTexture(©Info, framebuffer, flags); - RebindFramebuffer("RebindFramebuffer - BindFramebufferAsColorTexture"); - draw_->BindFramebufferAsTexture(renderCopy, stage, Draw::FB_COLOR_BIT, 0); - } else { - draw_->BindFramebufferAsTexture(framebuffer->fbo, stage, Draw::FB_COLOR_BIT, 0); - } - return true; - } else if (framebuffer != currentRenderVfb_ || (flags & BINDFBCOLOR_FORCE_SELF) != 0) { - draw_->BindFramebufferAsTexture(framebuffer->fbo, stage, Draw::FB_COLOR_BIT, 0); - return true; - } else { - ERROR_LOG_REPORT_ONCE(vulkanSelfTexture, G3D, "Attempting to texture from target (src=%08x / target=%08x / flags=%d)", framebuffer->fb_address, currentRenderVfb_->fb_address, flags); - // To do this safely in Vulkan, we need to use input attachments. - // Actually if the texture region and render regions don't overlap, this is safe, but we need - // to transition to GENERAL image layout which will take some trickery. - // Badness on D3D11 to bind the currently rendered-to framebuffer as a texture. - draw_->BindTexture(0, nullptr); - gstate_c.skipDrawReason |= SKIPDRAW_BAD_FB_TEXTURE; - return false; - } -} - void FramebufferManagerVulkan::UpdateDownloadTempBuffer(VirtualFramebuffer *nvfb) { // Nothing to do here. } diff --git a/GPU/Vulkan/FramebufferManagerVulkan.h b/GPU/Vulkan/FramebufferManagerVulkan.h index 96e6a74569..aaa1d48297 100644 --- a/GPU/Vulkan/FramebufferManagerVulkan.h +++ b/GPU/Vulkan/FramebufferManagerVulkan.h @@ -57,8 +57,6 @@ public: bool NotifyStencilUpload(u32 addr, int size, StencilUpload flags = StencilUpload::NEEDS_CLEAR) override; - bool BindFramebufferAsColorTexture(int stage, VirtualFramebuffer *framebuffer, int flags); - // If within a render pass, this will just issue a regular clear. If beginning a new render pass, // do that. void NotifyClear(bool clearColor, bool clearAlpha, bool clearDepth, uint32_t color, float depth); From 106fc70a75e5e306d7c533534669677d6777c6ca Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Sat, 7 Nov 2020 11:25:05 +0100 Subject: [PATCH 212/275] Forgot a line in caa960ee8e --- GPU/Common/FragmentShaderGenerator.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/GPU/Common/FragmentShaderGenerator.cpp b/GPU/Common/FragmentShaderGenerator.cpp index 420b14c192..7ea4e990e0 100644 --- a/GPU/Common/FragmentShaderGenerator.cpp +++ b/GPU/Common/FragmentShaderGenerator.cpp @@ -324,7 +324,7 @@ bool GenerateFragmentShader(const FShaderID &id, char *buffer, const ShaderLangu if (shaderDepal) { WRITE(p, "uniform sampler2D pal;\n"); - WRITE(p, "uniform int u_depal_mask_shift_off_fmt;\n"); + WRITE(p, "uniform uint u_depal_mask_shift_off_fmt;\n"); *uniformMask |= DIRTY_DEPAL; } From 19b4febbbf98e4b0a7568c2f697b77e452203e0d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Mon, 2 Nov 2020 16:12:45 +0100 Subject: [PATCH 213/275] More reinterpret shader gen and test work. More work on reinterpret Buildsystem fixes --- CMakeLists.txt | 2 + Common/Common.vcxproj | 1 + Common/Common.vcxproj.filters | 5 +- Common/Data/Collections/Slice.h | 48 ++++++++++ Common/GPU/ShaderWriter.cpp | 129 +++++++++++++++++++++++++- Common/GPU/ShaderWriter.h | 53 ++++++++++- Core/Opcode.h | 2 +- GPU/Common/ColorReinterpret.cpp | 49 ---------- GPU/Common/ColorReinterpret.h | 6 -- GPU/Common/ReinterpretFramebuffer.cpp | 64 +++++++++++++ GPU/Common/ReinterpretFramebuffer.h | 8 ++ GPU/GPU.vcxproj | 2 + GPU/GPU.vcxproj.filters | 8 +- UWP/GPU_UWP/GPU_UWP.vcxproj | 2 + UWP/GPU_UWP/GPU_UWP.vcxproj.filters | 2 + android/jni/Android.mk | 1 + libretro/Makefile.common | 1 + unittest/TestShaderGenerators.cpp | 61 ++++++++++++ 18 files changed, 380 insertions(+), 64 deletions(-) create mode 100644 Common/Data/Collections/Slice.h delete mode 100644 GPU/Common/ColorReinterpret.cpp delete mode 100644 GPU/Common/ColorReinterpret.h create mode 100644 GPU/Common/ReinterpretFramebuffer.cpp create mode 100644 GPU/Common/ReinterpretFramebuffer.h diff --git a/CMakeLists.txt b/CMakeLists.txt index ce37815473..1497230247 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1354,6 +1354,8 @@ set(GPU_SOURCES GPU/Common/DrawEngineCommon.h GPU/Common/PresentationCommon.cpp GPU/Common/PresentationCommon.h + GPU/Common/ReinterpretFramebuffer.cpp + GPU/Common/ReinterpretFramebuffer.h GPU/Common/ShaderId.cpp GPU/Common/ShaderId.h GPU/Common/ShaderUniforms.cpp diff --git a/Common/Common.vcxproj b/Common/Common.vcxproj index f3ebb5328d..fe60080c88 100644 --- a/Common/Common.vcxproj +++ b/Common/Common.vcxproj @@ -386,6 +386,7 @@ + diff --git a/Common/Common.vcxproj.filters b/Common/Common.vcxproj.filters index 38d3896534..4f5d867492 100644 --- a/Common/Common.vcxproj.filters +++ b/Common/Common.vcxproj.filters @@ -381,6 +381,9 @@ GPU + + Data\Collections + @@ -850,4 +853,4 @@ Math\fast - \ No newline at end of file + diff --git a/Common/Data/Collections/Slice.h b/Common/Data/Collections/Slice.h new file mode 100644 index 0000000000..a58b902481 --- /dev/null +++ b/Common/Data/Collections/Slice.h @@ -0,0 +1,48 @@ +#pragma once + +#include + +// Like a const begin/end pair, just more convenient to use (and can only be used for linear array data). +// Inspired by Rust's slices and Google's StringPiece. +template +struct Slice { + // View some memory as a slice. + Slice(const T *data, size_t size) : data_(data), size_(size) {} + + // Intentionally non-explicit. + // View a const array as a slice. + template + Slice(const T(&data)[N]) : data_(data), size_(N) {} + + // Intentionally non-explicit. + // View a const array as a slice. + Slice(const std::vector &data) : data_(data.data()), size_(data.size()) {} + + const T &operator[](size_t index) const { + return data_[index]; + } + + size_t size() const { + return size_; + } + + // "Iterators" + const T *begin() const { + return data_; + } + const T *end() const { + return data_ + size_; + } + + static Slice empty() { + return Slice(nullptr, 0); + } + + bool is_empty() const { + return size_ == 0; + } + +private: + const T *data_; + size_t size_; +}; diff --git a/Common/GPU/ShaderWriter.cpp b/Common/GPU/ShaderWriter.cpp index cebb0d017a..ee29dbb83f 100644 --- a/Common/GPU/ShaderWriter.cpp +++ b/Common/GPU/ShaderWriter.cpp @@ -64,11 +64,12 @@ const char *hlsl_preamble_vs = "\n"; // Unsafe. But doesn't matter, we'll use big buffers for shader gen. -void ShaderWriter::F(const char *format, ...) { +ShaderWriter & ShaderWriter::F(const char *format, ...) { va_list args; va_start(args, format); p_ += vsprintf(p_, format, args); va_end(args); + return *this; } void ShaderWriter::Preamble(const char **gl_extensions, size_t num_gl_extensions) { @@ -110,6 +111,9 @@ void ShaderWriter::Preamble(const char **gl_extensions, size_t num_gl_extensions C("#define DISCARD discard\n"); if (lang_.gles) { C("precision lowp float;\n"); + if (lang_.glslES30) { + C("precision highp int;\n"); + } } break; case ShaderStage::Vertex: @@ -128,3 +132,126 @@ void ShaderWriter::Preamble(const char **gl_extensions, size_t num_gl_extensions break; } } + +void ShaderWriter::BeginVSMain(Slice inputs, Slice uniforms, Slice varyings) { + switch (lang_.shaderLanguage) { + case HLSL_D3D11: + case HLSL_D3D9: + break; + case GLSL_VULKAN: + default: + C("void main() {\n"); + break; + } +} + +void ShaderWriter::BeginFSMain(Slice uniforms, Slice varyings) { + switch (lang_.shaderLanguage) { + case HLSL_D3D11: + if (!uniforms.is_empty()) { + for (auto &uniform : uniforms) { + //F(" %s %s : %s;\n", uniform.type, uniform.name, uniform.index); + } + } + // Let's do the varyings as parameters to main, no struct. + C("vec4 main("); + for (auto &varying : varyings) { + F(" %s %s : %s, ", varying.type, varying.name, varying.semantic); + } + // Erase the last comma + Rewind(2); + + F(") : SV_Target0 {\n"); + break; + case HLSL_D3D9: + for (auto &uniform : uniforms) { + F(" %s %s : %s;\n", uniform.type, uniform.name, uniform.index); + } + // Let's do the varyings as parameters to main, no struct. + C("vec4 main("); + for (auto &varying : varyings) { + F(" %s %s : %s, ", varying.type, varying.name, varying.semantic); + } + // Erase the last comma + Rewind(2); + + F(") : COLOR {\n"); + break; + case GLSL_VULKAN: + for (auto &varying : varyings) { + F("layout(location = %d) in %s %s; // %s\n", varying.index, varying.type, varying.name, varying.semantic); + } + C("layout (location = 0, index = 0) out vec4 fragColor0;\n"); + C("\nvoid main() {\n"); + break; + default: + for (auto &varying : varyings) { + F("in %s %s; // %s\n", varying.type, varying.name, varying.semantic); + } + if (!strcmp(lang_.fragColor0, "fragColor0")) { + C("out vec4 fragColor0;\n"); + } + C("\nvoid main() {\n"); + break; + } +} + +void ShaderWriter::EndVSMain() { + C("}\n"); +} + +void ShaderWriter::EndFSMain(const char *vec4_color_variable) { + switch (lang_.shaderLanguage) { + case HLSL_D3D11: + case HLSL_D3D9: + F(" return %s;\n", vec4_color_variable); + break; + case GLSL_VULKAN: + default: // OpenGL + F(" %s = %s;\n", lang_.fragColor0, vec4_color_variable); + break; + } + C("}\n"); +} + +void ShaderWriter::DeclareTexture2D(const char *name, int binding) { + switch (lang_.shaderLanguage) { + case HLSL_D3D11: + F("Texture2D %s : register(t%d);\n", name, binding); + break; + case HLSL_D3D9: + break; + case GLSL_VULKAN: + F("layout(set = 0, binding = %d) uniform sampler2D %s;\n", binding, name); + break; + default: + F("uniform sampler2D %s;\n", name); + break; + } +} + +void ShaderWriter::DeclareSampler2D(const char *name, int binding) { + // We only use separate samplers in HLSL D3D11, where we have no choice. + switch (lang_.shaderLanguage) { + case HLSL_D3D11: + F("SamplerState %s : register(s%d);\n", name, binding); + break; + } +} + +ShaderWriter &ShaderWriter::SampleTexture2D(const char *texName, const char *samplerName, const char *uv) { + switch (lang_.shaderLanguage) { + case HLSL_D3D11: + F("%s.Sample(%s, %s)", texName, samplerName, uv); + break; + case HLSL_D3D9: + F("tex2D(%s, %s)", texName, uv); + break; + default: + // Note: we ignore the sampler. make sure you bound samplers to the textures correctly. + F("%s(%s, %s)", lang_.texture, texName, uv); + break; + } + return *this; +} + diff --git a/Common/GPU/ShaderWriter.h b/Common/GPU/ShaderWriter.h index d870f72fe4..2e51dcc730 100644 --- a/Common/GPU/ShaderWriter.h +++ b/Common/GPU/ShaderWriter.h @@ -4,11 +4,35 @@ #include "Common/Log.h" #include "Common/GPU/Shader.h" +#include "GPU/ge_constants.h" +#include "GPU/GPUCommon.h" +#include "Common/Data/Collections/Slice.h" // Helps generate a shader compatible with all backends. +// +// Can use the uniform buffer support in thin3d. +// // Using #defines and magic in this class, we partially define our own shader language that basically looks // like GLSL, but has a few little oddities like splat3. +struct InputDef { + const char *type; + const char *name; +}; + +struct UniformDef { + const char *type; + const char *name; + int index; +}; + +struct VaryingDef { + const char *type; + const char *name; + const char *semantic; + int index; +}; + class ShaderWriter { public: ShaderWriter(char *buffer, const ShaderLanguageDesc &lang, ShaderStage stage, const char **gl_extensions, size_t num_gl_extensions) : p_(buffer), lang_(lang), stage_(stage) { @@ -21,23 +45,42 @@ public: // Assumes the input is zero-terminated. // C : Copies a buffer directly to the stream. template - void C(const char(&text)[T]) { + ShaderWriter &C(const char(&text)[T]) { memcpy(p_, text, T); p_ += T - 1; + return *this; } // W: Writes a zero-terminated string to the stream. - void W(const char *text) { + ShaderWriter &W(const char *text) { size_t len = strlen(text); memcpy(p_, text, len + 1); p_ += len; + return *this; } // F: Formats into the buffer. - void F(const char *format, ...); + ShaderWriter &F(const char *format, ...); - // void BeginMain(); - // void EndMain(); + // Several of the shader languages ignore samplers, beware of that. + void DeclareSampler2D(const char *name, int binding); + void DeclareTexture2D(const char *name, int binding); + ShaderWriter &SampleTexture2D(const char *texName, const char *samplerName, const char *uv); + + // Simple shaders with no special tricks. + void BeginVSMain(Slice inputs, Slice uniforms, Slice varyings); + void BeginFSMain(Slice uniforms, Slice varyings); + + // For simple shaders that output a single color, we can deal with this generically. + void EndVSMain(); + void EndFSMain(const char *vec4_color_variable); + + + void Rewind(size_t offset) { + p_ -= offset; + } + + // Can probably remove this char *GetPos() { return p_; } diff --git a/Core/Opcode.h b/Core/Opcode.h index 6eb01c41fc..456d77dbf6 100644 --- a/Core/Opcode.h +++ b/Core/Opcode.h @@ -17,7 +17,7 @@ #pragma once -#include "CommonTypes.h" +#include "Common/CommonTypes.h" // Broken out of MemMap.h to avoid a bad include dependency. diff --git a/GPU/Common/ColorReinterpret.cpp b/GPU/Common/ColorReinterpret.cpp deleted file mode 100644 index 3699d2f8aa..0000000000 --- a/GPU/Common/ColorReinterpret.cpp +++ /dev/null @@ -1,49 +0,0 @@ -#include - -#include "GPU/Common/ColorReinterpret.h" -#include "GPU/Common/ShaderWriter.h" - -// TODO: We could have an option to preserve any extra color precision. But gonna start without it. -// Requires full size integer math. -bool GenerateReinterpretFragmentShader(char *buffer, GEBufferFormat from, GEBufferFormat to, const ShaderLanguageDesc &lang) { - if (!lang.bitwiseOps) { - return false; - } - ShaderWriter writer(buffer, lang, ShaderStage::Fragment); - - switch (from) { - case GE_FORMAT_4444: - writer.W(" uint color = uint(in.r * 15.99) | (uint(in.g * 15.99) << 4) | (uint(in.b * 15.99) << 8) | (uint(in.a * 15.99) << 12);\n"); - break; - case GE_FORMAT_5551: - writer.W(" uint color = uint(in.r * 31.99) | (uint(in.g * 31.99) << 5) | (uint(in.b * 31.99) << 10);\n"); - writer.W(" if (in.a > 128.0) color |= 0x8000;\n"); - break; - case GE_FORMAT_565: - writer.W(" uint color = uint(in.r * 31.99) | (uint(in.g * 63.99) << 5) | (uint(in.b * 31.99) << 11);\n"); - break; - default: _assert_(false); - } - - switch (to) { - case GE_FORMAT_4444: - writer.W(" vec4 output = vec4(float(color & 0xF), float((color >> 4) & 0xF), float((color >> 8) & 0xF), float((color >> 12) & 0xF));\n"); - writer.W(" output *= 1.0 / 15.0;\n"); - break; - case GE_FORMAT_5551: - writer.W(" vec4 output = vec4(float(color & 0x1F), float((color >> 5) & 0x1F), float((color >> 10) & 0x1F), 0.0);\n"); - writer.W(" output.rgb *= 1.0 / 31.0;\n"); - writer.W(" output.a = float(color >> 15);\n"); - break; - case GE_FORMAT_565: - writer.W(" vec4 output = vec4(float(color & 0x1F), float((color >> 5) & 0x3F), float((color >> 11) & 0x1F), 1.0);\n"); - writer.W(" output.rb *= 1.0 / 31.0;\n"); - writer.W(" output.g *= 1.0 / 63.0;\n"); - break; - default: _assert_(false); - } - - writer.W("}"); - - return true; -} diff --git a/GPU/Common/ColorReinterpret.h b/GPU/Common/ColorReinterpret.h deleted file mode 100644 index c1ff33226a..0000000000 --- a/GPU/Common/ColorReinterpret.h +++ /dev/null @@ -1,6 +0,0 @@ -#pragma once - -#include "Common/Log.h" -#include "GPU/ge_constants.h" -#include "GPU/GPUCommon.h" -#include "GPU/Common/ShaderWriter.h" diff --git a/GPU/Common/ReinterpretFramebuffer.cpp b/GPU/Common/ReinterpretFramebuffer.cpp new file mode 100644 index 0000000000..cf039c0aa6 --- /dev/null +++ b/GPU/Common/ReinterpretFramebuffer.cpp @@ -0,0 +1,64 @@ +#include + +#include "Common/GPU/ShaderWriter.h" +#include "GPU/Common/ReinterpretFramebuffer.h" + +// TODO: We could have an option to preserve any extra color precision. But gonna start without it. +// Requires full size integer math. +bool GenerateReinterpretFragmentShader(char *buffer, GEBufferFormat from, GEBufferFormat to, const ShaderLanguageDesc &lang) { + if (!lang.bitwiseOps) { + return false; + } + + ShaderWriter writer(buffer, lang, ShaderStage::Fragment, nullptr, 0); + + writer.DeclareSampler2D("samp", 0); + writer.DeclareTexture2D("tex", 0); + + static const VaryingDef varyings[1] = { + { "vec4", "v_texcoord", "TEXCOORD0" }, + }; + + writer.BeginFSMain(Slice::empty(), varyings); + + writer.C(" vec4 val = ").SampleTexture2D("tex", "samp", "v_texcoord.xy").C(";\n"); + + switch (from) { + case GE_FORMAT_4444: + writer.C(" uint color = uint(val.r * 15.99) | (uint(val.g * 15.99) << 4) | (uint(val.b * 15.99) << 8) | (uint(val.a * 15.99) << 12);\n"); + break; + case GE_FORMAT_5551: + writer.C(" uint color = uint(val.r * 31.99) | (uint(val.g * 31.99) << 5) | (uint(val.b * 31.99) << 10);\n"); + writer.C(" if (val.a > 128.0) color |= 0x8000U;\n"); + break; + case GE_FORMAT_565: + writer.C(" uint color = uint(val.r * 31.99) | (uint(val.g * 63.99) << 5) | (uint(val.b * 31.99) << 11);\n"); + break; + default: + _assert_(false); + break; + } + + switch (to) { + case GE_FORMAT_4444: + writer.C(" vec4 outColor = vec4(float(color & 0xFU), float((color >> 4) & 0xFU), float((color >> 8) & 0xFU), float((color >> 12) & 0xFU));\n"); + writer.C(" outColor *= 1.0 / 15.0;\n"); + break; + case GE_FORMAT_5551: + writer.C(" vec4 outColor = vec4(float(color & 0x1FU), float((color >> 5) & 0x1FU), float((color >> 10) & 0x1FU), 0.0);\n"); + writer.C(" outColor.rgb *= 1.0 / 31.0;\n"); + writer.C(" outColor.a = float(color >> 15);\n"); + break; + case GE_FORMAT_565: + writer.C(" vec4 outColor = vec4(float(color & 0x1FU), float((color >> 5) & 0x3FU), float((color >> 11) & 0x1FU), 1.0);\n"); + writer.C(" outColor.rb *= 1.0 / 31.0;\n"); + writer.C(" outColor.g *= 1.0 / 63.0;\n"); + break; + default: + _assert_(false); + break; + } + + writer.EndFSMain("outColor"); + return true; +} diff --git a/GPU/Common/ReinterpretFramebuffer.h b/GPU/Common/ReinterpretFramebuffer.h new file mode 100644 index 0000000000..f10fb9e3a3 --- /dev/null +++ b/GPU/Common/ReinterpretFramebuffer.h @@ -0,0 +1,8 @@ +#pragma once + +#include "Common/Log.h" +#include "GPU/ge_constants.h" +#include "GPU/GPUCommon.h" +#include "Common/GPU/ShaderWriter.h" + +bool GenerateReinterpretFragmentShader(char *buffer, GEBufferFormat from, GEBufferFormat to, const ShaderLanguageDesc &lang); diff --git a/GPU/GPU.vcxproj b/GPU/GPU.vcxproj index 675602d6d5..4f2550f635 100644 --- a/GPU/GPU.vcxproj +++ b/GPU/GPU.vcxproj @@ -338,6 +338,7 @@ + @@ -475,6 +476,7 @@ + diff --git a/GPU/GPU.vcxproj.filters b/GPU/GPU.vcxproj.filters index 509e962588..2c800c5e5c 100644 --- a/GPU/GPU.vcxproj.filters +++ b/GPU/GPU.vcxproj.filters @@ -270,6 +270,9 @@ Common + + Common + @@ -539,5 +542,8 @@ Common + + Common + - \ No newline at end of file + diff --git a/UWP/GPU_UWP/GPU_UWP.vcxproj b/UWP/GPU_UWP/GPU_UWP.vcxproj index d5b5d3167e..fcf535af3d 100644 --- a/UWP/GPU_UWP/GPU_UWP.vcxproj +++ b/UWP/GPU_UWP/GPU_UWP.vcxproj @@ -388,6 +388,7 @@ + @@ -445,6 +446,7 @@ + diff --git a/UWP/GPU_UWP/GPU_UWP.vcxproj.filters b/UWP/GPU_UWP/GPU_UWP.vcxproj.filters index 12f33ec3af..58617e8b91 100644 --- a/UWP/GPU_UWP/GPU_UWP.vcxproj.filters +++ b/UWP/GPU_UWP/GPU_UWP.vcxproj.filters @@ -57,6 +57,7 @@ + @@ -114,5 +115,6 @@ + \ No newline at end of file diff --git a/android/jni/Android.mk b/android/jni/Android.mk index 845f3ca441..f0dde080ea 100644 --- a/android/jni/Android.mk +++ b/android/jni/Android.mk @@ -316,6 +316,7 @@ EXEC_AND_LIB_FILES := \ $(SRC)/GPU/Common/ShaderId.cpp.arm \ $(SRC)/GPU/Common/GPUStateUtils.cpp.arm \ $(SRC)/GPU/Common/SoftwareTransformCommon.cpp.arm \ + $(SRC)/GPU/Common/ReinterpretFramebuffer.cpp \ $(SRC)/GPU/Common/VertexDecoderCommon.cpp.arm \ $(SRC)/GPU/Common/TextureCacheCommon.cpp.arm \ $(SRC)/GPU/Common/TextureScalerCommon.cpp.arm \ diff --git a/libretro/Makefile.common b/libretro/Makefile.common index 15620ed2b6..72c79b7129 100644 --- a/libretro/Makefile.common +++ b/libretro/Makefile.common @@ -234,6 +234,7 @@ SOURCES_CXX += \ $(GPUCOMMONDIR)/SplineCommon.cpp \ $(GPUCOMMONDIR)/FramebufferManagerCommon.cpp \ $(GPUCOMMONDIR)/PresentationCommon.cpp \ + $(GPUCOMMONDIR)/ReinterpretFramebuffer.cpp \ $(GPUCOMMONDIR)/ShaderId.cpp \ $(GPUCOMMONDIR)/ShaderCommon.cpp \ $(GPUCOMMONDIR)/ShaderUniforms.cpp \ diff --git a/unittest/TestShaderGenerators.cpp b/unittest/TestShaderGenerators.cpp index 2f67729573..35dcde1104 100644 --- a/unittest/TestShaderGenerators.cpp +++ b/unittest/TestShaderGenerators.cpp @@ -11,6 +11,7 @@ #include "GPU/Common/FragmentShaderGenerator.h" #include "GPU/Common/VertexShaderGenerator.h" +#include "GPU/Common/ReinterpretFramebuffer.h" #include "GPU/D3D11/D3D11Util.h" #include "GPU/D3D11/D3D11Loader.h" @@ -141,12 +142,72 @@ void PrintDiff(const char *a, const char *b) { } } +const char *ShaderLanguageToString(ShaderLanguage lang) { + switch (lang) { + case HLSL_D3D11: return "HLSL_D3D11"; + case HLSL_D3D9: return "HLSL_D3D9"; + case GLSL_VULKAN: return "GLSL_VULKAN"; + case GLSL_1xx: return "GLSL_1xx"; + case GLSL_3xx: return "GLSL_3xx"; + default: return "N/A"; + } +} + +bool TestReinterpretShaders() { + ShaderLanguage languages[] = { + ShaderLanguage::HLSL_D3D11, + ShaderLanguage::GLSL_VULKAN, + ShaderLanguage::GLSL_3xx, + }; + GEBufferFormat fmts[3] = { + GE_FORMAT_565, + GE_FORMAT_5551, + GE_FORMAT_4444, + }; + char *buffer = new char[65536]; + + // Generate all despite failures - it's only 6. + bool failed = false; + + for (int k = 0; k < ARRAY_SIZE(languages); k++) { + printf("=== %s ===\n\n", ShaderLanguageToString(languages[k])); + + ShaderLanguageDesc desc(languages[k]); + + for (int i = 0; i < 3; i++) { + for (int j = 0; j < 3; j++) { + if (i == j) + continue; // useless shader! + if (!GenerateReinterpretFragmentShader(buffer, fmts[i], fmts[j], desc)) { + printf("Failed!\n%s\n", buffer); + failed = true; + } else { + std::string errorMessage; + if (!TestCompileShader(buffer, languages[k], false, &errorMessage)) { + printf("Error compiling fragment shader %d:\n\n%s\n\n%s\n", (int)j, LineNumberString(buffer).c_str(), errorMessage.c_str()); + failed = true; + return false; + } else { + printf("===\n%s\n===\n", buffer); + } + } + } + } + + } + return !failed; +} + bool TestShaderGenerators() { LoadD3D11(); init_glslang(); LoadD3DCompilerDynamic(); + if (!TestReinterpretShaders()) { + return false; + } + ShaderLanguage languages[] = { ShaderLanguage::HLSL_D3D9, ShaderLanguage::HLSL_D3D11, From f2e315b9a61bf7176948099f6929a5b63b378175 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Tue, 3 Nov 2020 15:44:57 +0100 Subject: [PATCH 214/275] More shadergen work Buildfix --- Common/GPU/Shader.cpp | 7 +-- Common/GPU/Shader.h | 28 +++++++++ Common/GPU/ShaderWriter.cpp | 53 +++++++++++++++-- Common/GPU/ShaderWriter.h | 4 +- Common/GPU/thin3d.cpp | 4 +- Common/GPU/thin3d.h | 23 +------- GPU/Common/FramebufferManagerCommon.cpp | 54 +++++++++++++++++ GPU/Common/FramebufferManagerCommon.h | 10 +++- GPU/Common/PresentationCommon.cpp | 16 ++--- GPU/Common/PresentationCommon.h | 2 +- GPU/Common/ReinterpretFramebuffer.cpp | 26 +++++++-- GPU/Common/ReinterpretFramebuffer.h | 4 ++ GPU/D3D11/FramebufferManagerD3D11.cpp | 37 ------------ GPU/D3D11/FramebufferManagerD3D11.h | 1 - GPU/Directx9/FramebufferManagerDX9.cpp | 77 ------------------------- GPU/Directx9/FramebufferManagerDX9.h | 1 - GPU/GLES/FramebufferManagerGLES.cpp | 21 ------- GPU/GLES/FramebufferManagerGLES.h | 2 - GPU/Vulkan/FramebufferManagerVulkan.cpp | 26 --------- GPU/Vulkan/FramebufferManagerVulkan.h | 1 - GPU/ge_constants.h | 3 + unittest/TestShaderGenerators.cpp | 17 ++++++ 22 files changed, 203 insertions(+), 214 deletions(-) diff --git a/Common/GPU/Shader.cpp b/Common/GPU/Shader.cpp index f4bfe96b69..b199f0a227 100644 --- a/Common/GPU/Shader.cpp +++ b/Common/GPU/Shader.cpp @@ -31,13 +31,12 @@ void ShaderLanguageDesc::Init(ShaderLanguage lang) { fragColor0 = "fragColor0"; fragColor1 = "fragColor1"; texture = "texture"; - texelFetch = nullptr; - bitwiseOps = false; + texelFetch = "texelFetch"; + bitwiseOps = true; lastFragData = nullptr; - gles = false; + gles = true; forceMatrix4x4 = true; glslES30 = true; - bitwiseOps = true; texelFetch = "texelFetch"; break; case GLSL_VULKAN: diff --git a/Common/GPU/Shader.h b/Common/GPU/Shader.h index d574cd4738..69fa5c9d65 100644 --- a/Common/GPU/Shader.h +++ b/Common/GPU/Shader.h @@ -1,5 +1,9 @@ #pragma once +#include +#include +#include // for size_t + // GLSL_1xx and GLSL_3xx each cover a lot of sub variants. All the little quirks // that differ are covered in ShaderLanguageDesc. // Defined as a bitmask so stuff like GetSupportedShaderLanguages can return combinations. @@ -47,6 +51,30 @@ struct ShaderLanguageDesc { bool coefsFromBuffers = false; }; +enum class UniformType : int8_t { + FLOAT1, + FLOAT2, + FLOAT3, + FLOAT4, + MATRIX4X4, +}; + +// Describe uniforms intricately enough that we can support them on all backends. +// This will generate a uniform struct on the newer backends and individual uniforms on the older ones. +struct UniformDesc { + const char *name; // For GL + int16_t vertexReg; // For D3D + int16_t fragmentReg; // For D3D + UniformType type; + int16_t offset; + // TODO: Support array elements etc. +}; + +struct UniformBufferDesc { + size_t uniformBufferSize; + std::vector uniforms; +}; + // For passing error messages from shader compilation (and other critical issues) back to the host. // This can run on any thread - be aware! // TODO: See if we can find a less generic name for this. diff --git a/Common/GPU/ShaderWriter.cpp b/Common/GPU/ShaderWriter.cpp index ee29dbb83f..866b879e0d 100644 --- a/Common/GPU/ShaderWriter.cpp +++ b/Common/GPU/ShaderWriter.cpp @@ -120,6 +120,7 @@ void ShaderWriter::Preamble(const char **gl_extensions, size_t num_gl_extensions if (lang_.gles) { C("precision highp float;\n"); } + C("#define gl_VertexIndex gl_VertexID\n"); break; } if (!lang_.gles) { @@ -134,18 +135,47 @@ void ShaderWriter::Preamble(const char **gl_extensions, size_t num_gl_extensions } void ShaderWriter::BeginVSMain(Slice inputs, Slice uniforms, Slice varyings) { + _assert_(this->stage_ == ShaderStage::Vertex); switch (lang_.shaderLanguage) { case HLSL_D3D11: case HLSL_D3D9: + { + C("struct VS_OUTPUT {\n"); + C(" vec4 pos : POSITION;\n"); + for (auto &varying : varyings) { + F(" %s %s : %s;\n", varying.type, varying.name, varying.semantic); + } + C("};\n"); + + C("VS_OUTPUT main( "); // 2 spaces for the D3D9 rewind + if (lang_.shaderLanguage == HLSL_D3D11) { + C("uint gl_VertexIndex : SV_VertexID, "); + } + Rewind(2); // Get rid of the last comma. + C(") {\n"); + C(" vec4 gl_Position;\n"); + for (auto &varying : varyings) { + F(" %s %s;\n", varying.type, varying.name); + } break; + } case GLSL_VULKAN: - default: + for (auto &varying : varyings) { + F("layout(location = %d) out %s %s; // %s\n", varying.index, varying.type, varying.name, varying.semantic); + } + C("void main() {\n"); + break; + default: // OpenGL + for (auto &varying : varyings) { + F("%s %s %s; // %s (%d)\n", lang_.varying_vs, varying.type, varying.name, varying.semantic, varying.index); + } C("void main() {\n"); break; } } void ShaderWriter::BeginFSMain(Slice uniforms, Slice varyings) { + _assert_(this->stage_ == ShaderStage::Fragment); switch (lang_.shaderLanguage) { case HLSL_D3D11: if (!uniforms.is_empty()) { @@ -186,7 +216,7 @@ void ShaderWriter::BeginFSMain(Slice uniforms, Slice var break; default: for (auto &varying : varyings) { - F("in %s %s; // %s\n", varying.type, varying.name, varying.semantic); + F("%s %s %s; // %s\n", lang_.varying_fs, varying.type, varying.name, varying.semantic); } if (!strcmp(lang_.fragColor0, "fragColor0")) { C("out vec4 fragColor0;\n"); @@ -196,11 +226,27 @@ void ShaderWriter::BeginFSMain(Slice uniforms, Slice var } } -void ShaderWriter::EndVSMain() { +void ShaderWriter::EndVSMain(Slice varyings) { + _assert_(this->stage_ == ShaderStage::Vertex); + switch (lang_.shaderLanguage) { + case HLSL_D3D11: + case HLSL_D3D9: + C(" VS_OUTPUT vs_out;\n"); + C(" vs_out.pos = gl_Position;\n"); + for (auto &varying : varyings) { + F(" vs_out.%s = %s;\n", varying.name, varying.name); + } + C(" return vs_out;\n"); + break; + case GLSL_VULKAN: + default: // OpenGL + break; + } C("}\n"); } void ShaderWriter::EndFSMain(const char *vec4_color_variable) { + _assert_(this->stage_ == ShaderStage::Fragment); switch (lang_.shaderLanguage) { case HLSL_D3D11: case HLSL_D3D9: @@ -254,4 +300,3 @@ ShaderWriter &ShaderWriter::SampleTexture2D(const char *texName, const char *sam } return *this; } - diff --git a/Common/GPU/ShaderWriter.h b/Common/GPU/ShaderWriter.h index 2e51dcc730..cbb2b34aea 100644 --- a/Common/GPU/ShaderWriter.h +++ b/Common/GPU/ShaderWriter.h @@ -8,6 +8,8 @@ #include "GPU/GPUCommon.h" #include "Common/Data/Collections/Slice.h" +#include "Common/GPU/thin3d.h" + // Helps generate a shader compatible with all backends. // // Can use the uniform buffer support in thin3d. @@ -72,7 +74,7 @@ public: void BeginFSMain(Slice uniforms, Slice varyings); // For simple shaders that output a single color, we can deal with this generically. - void EndVSMain(); + void EndVSMain(Slice varyings); void EndFSMain(const char *vec4_color_variable); diff --git a/Common/GPU/thin3d.cpp b/Common/GPU/thin3d.cpp index 3b320fd842..ce09c0356c 100644 --- a/Common/GPU/thin3d.cpp +++ b/Common/GPU/thin3d.cpp @@ -396,7 +396,7 @@ DrawContext::~DrawContext() { DestroyPresets(); } -// TODO: SSE/NEON +// TODO: Use the functions we have in Common/ColorConv.cpp. // Could also make C fake-simd for 64-bit, two 8888 pixels fit in a register :) void ConvertFromRGBA8888(uint8_t *dst, const uint8_t *src, uint32_t dstStride, uint32_t srcStride, uint32_t width, uint32_t height, DataFormat format) { // Must skip stride in the cases below. Some games pack data into the cracks, like MotoGP. @@ -455,7 +455,7 @@ void ConvertFromRGBA8888(uint8_t *dst, const uint8_t *src, uint32_t dstStride, u } } -// TODO: SSE/NEON +// TODO: Use the functions we have in Common/ColorConv.cpp. // Could also make C fake-simd for 64-bit, two 8888 pixels fit in a register :) void ConvertFromBGRA8888(uint8_t *dst, const uint8_t *src, uint32_t dstStride, uint32_t srcStride, uint32_t width, uint32_t height, DataFormat format) { // Must skip stride in the cases below. Some games pack data into the cracks, like MotoGP. diff --git a/Common/GPU/thin3d.h b/Common/GPU/thin3d.h index 055cb93e1e..d29ac91842 100644 --- a/Common/GPU/thin3d.h +++ b/Common/GPU/thin3d.h @@ -385,28 +385,7 @@ struct InputLayoutDesc { class InputLayout : public RefCountedObject { }; -enum class UniformType : int8_t { - FLOAT1, - FLOAT2, - FLOAT3, - FLOAT4, - MATRIX4X4, -}; - -// For emulation of uniform buffers on D3D9/GL -struct UniformDesc { - const char *name; // For GL - int16_t vertexReg; // For D3D - int16_t fragmentReg; // For D3D - UniformType type; - int16_t offset; - // TODO: Support array elements etc. -}; - -struct UniformBufferDesc { - size_t uniformBufferSize; - std::vector uniforms; -}; +// Uniform types have moved to Shader.h. class ShaderModule : public RefCountedObject { public: diff --git a/GPU/Common/FramebufferManagerCommon.cpp b/GPU/Common/FramebufferManagerCommon.cpp index cbfb7a58a3..e50f387dc7 100644 --- a/GPU/Common/FramebufferManagerCommon.cpp +++ b/GPU/Common/FramebufferManagerCommon.cpp @@ -35,6 +35,7 @@ #include "GPU/Common/PostShader.h" #include "GPU/Common/PresentationCommon.h" #include "GPU/Common/TextureCacheCommon.h" +#include "GPU/Common/ReinterpretFramebuffer.h" #include "GPU/Debugger/Record.h" #include "GPU/Debugger/Stepping.h" #include "GPU/GPUInterface.h" @@ -516,6 +517,59 @@ void FramebufferManagerCommon::NotifyRenderFramebufferUpdated(VirtualFramebuffer } } +void FramebufferManagerCommon::ReformatFramebufferFrom(VirtualFramebuffer *vfb, GEBufferFormat oldFormat) { + if (!useBufferedRendering_ || !vfb->fbo) { + return; + } + GEBufferFormat newFormat = vfb->format; + + _assert_(newFormat != oldFormat); + + // We only reinterpret between 16 - bit formats, for now. + if (!IsGeBufferFormat16BitColor(oldFormat) || !IsGeBufferFormat16BitColor(newFormat)) { + // 16->32 and 32->16 will require some more specialized shaders. + return; + } + + if (!reinterpretVS_) { + char *buffer = new char[4000]; + const ShaderLanguageDesc &desc = draw_->GetShaderLanguageDesc(); + GenerateReinterpretVertexShader(buffer, desc); + reinterpretVS_ = draw_->CreateShaderModule(ShaderStage::Vertex, desc.shaderLanguage, (const uint8_t *)buffer, strlen(buffer), "reinterpret_vs"); + delete[] buffer; + } + + // See if we need to create a new pipeline. + if (!reinterpretFromTo_[(int)oldFormat][(int)newFormat]) { + std::vector shaders; + + using namespace Draw; + Draw::PipelineDesc desc{}; + // We use a "fullscreen triangle". + InputLayoutDesc inputDesc{}; // No inputs, we generate it in the shader. + InputLayout *inputLayout = draw_->CreateInputLayout(inputDesc); + DepthStencilState *depth = draw_->CreateDepthStencilState({ false, false, Comparison::LESS }); + BlendState *blendstateOff = draw_->CreateBlendState({ false, 0xF }); + RasterState *rasterNoCull = draw_->CreateRasterState({}); + + // No uniforms for these, only a single texture input. + PipelineDesc pipelineDesc{ Primitive::TRIANGLE_LIST, shaders, inputLayout, depth, blendstateOff, rasterNoCull, nullptr }; + Pipeline *pipeline = draw_->CreateGraphicsPipeline(pipelineDesc); + + inputLayout->Release(); + depth->Release(); + blendstateOff->Release(); + rasterNoCull->Release(); + } + + // Copy to a temp framebuffer. + Draw::Framebuffer *temp = GetTempFBO(TempFBO::COPY, vfb->renderWidth, vfb->renderHeight); + + shaderManager_->DirtyLastShader(); + textureCache_->ForgetLastTexture(); + gstate_c.Dirty(DIRTY_BLEND_STATE | DIRTY_DEPTHSTENCIL_STATE | DIRTY_RASTER_STATE | DIRTY_VIEWPORTSCISSOR_STATE | DIRTY_VERTEXSHADER_STATE); +} + void FramebufferManagerCommon::NotifyRenderFramebufferSwitched(VirtualFramebuffer *prevVfb, VirtualFramebuffer *vfb, bool isClearingDepth) { if (ShouldDownloadFramebuffer(vfb) && !vfb->memoryUpdated) { ReadFramebufferToMemory(vfb, 0, 0, vfb->width, vfb->height); diff --git a/GPU/Common/FramebufferManagerCommon.h b/GPU/Common/FramebufferManagerCommon.h index 26c7e02323..146a4afb11 100644 --- a/GPU/Common/FramebufferManagerCommon.h +++ b/GPU/Common/FramebufferManagerCommon.h @@ -189,7 +189,7 @@ class TextureCacheCommon; class FramebufferManagerCommon { public: - explicit FramebufferManagerCommon(Draw::DrawContext *draw); + FramebufferManagerCommon(Draw::DrawContext *draw); virtual ~FramebufferManagerCommon(); virtual void Init(); @@ -344,7 +344,7 @@ protected: void NotifyRenderFramebufferUpdated(VirtualFramebuffer *vfb, bool vfbFormatChanged); void NotifyRenderFramebufferSwitched(VirtualFramebuffer *prevVfb, VirtualFramebuffer *vfb, bool isClearingDepth); - virtual void ReformatFramebufferFrom(VirtualFramebuffer *vfb, GEBufferFormat old) = 0; + void ReformatFramebufferFrom(VirtualFramebuffer *vfb, GEBufferFormat old); void BlitFramebufferDepth(VirtualFramebuffer *src, VirtualFramebuffer *dst); void ResizeFramebufFBO(VirtualFramebuffer *vfb, int w, int h, bool force = false, bool skipCopy = false); @@ -428,4 +428,10 @@ protected: FBO_OLD_AGE = 5, FBO_OLD_USAGE_FLAG = 15, }; + + // Thin3D stuff for reinterpreting image data between the various 16-bit formats. + // Safe, not optimal - there might be input attachment tricks, etc, but we can't use them + // since we don't want N different implementations. + Draw::Pipeline *reinterpretFromTo_[3][3]; + Draw::ShaderModule *reinterpretVS_ = nullptr; }; diff --git a/GPU/Common/PresentationCommon.cpp b/GPU/Common/PresentationCommon.cpp index 58233a6d29..d60dd3447c 100644 --- a/GPU/Common/PresentationCommon.cpp +++ b/GPU/Common/PresentationCommon.cpp @@ -253,13 +253,13 @@ bool PresentationCommon::BuildPostShader(const ShaderInfo *shaderInfo, const Sha return false; } - Draw::UniformBufferDesc postShaderDesc{ sizeof(PostShaderUniforms), { - { "gl_HalfPixel", 0, -1, Draw::UniformType::FLOAT4, offsetof(PostShaderUniforms, gl_HalfPixel) }, - { "u_texelDelta", 1, 1, Draw::UniformType::FLOAT2, offsetof(PostShaderUniforms, texelDelta) }, - { "u_pixelDelta", 2, 2, Draw::UniformType::FLOAT2, offsetof(PostShaderUniforms, pixelDelta) }, - { "u_time", 3, 3, Draw::UniformType::FLOAT4, offsetof(PostShaderUniforms, time) }, - { "u_setting", 4, 4, Draw::UniformType::FLOAT4, offsetof(PostShaderUniforms, setting) }, - { "u_video", 5, 5, Draw::UniformType::FLOAT1, offsetof(PostShaderUniforms, video) }, + UniformBufferDesc postShaderDesc{ sizeof(PostShaderUniforms), { + { "gl_HalfPixel", 0, -1, UniformType::FLOAT4, offsetof(PostShaderUniforms, gl_HalfPixel) }, + { "u_texelDelta", 1, 1, UniformType::FLOAT2, offsetof(PostShaderUniforms, texelDelta) }, + { "u_pixelDelta", 2, 2, UniformType::FLOAT2, offsetof(PostShaderUniforms, pixelDelta) }, + { "u_time", 3, 3, UniformType::FLOAT4, offsetof(PostShaderUniforms, time) }, + { "u_setting", 4, 4, UniformType::FLOAT4, offsetof(PostShaderUniforms, setting) }, + { "u_video", 5, 5, UniformType::FLOAT1, offsetof(PostShaderUniforms, video) }, } }; Draw::Pipeline *pipeline = CreatePipeline({ vs, fs }, true, &postShaderDesc); if (!pipeline) @@ -366,7 +366,7 @@ void PresentationCommon::DeviceRestore(Draw::DrawContext *draw) { CreateDeviceObjects(); } -Draw::Pipeline *PresentationCommon::CreatePipeline(std::vector shaders, bool postShader, const Draw::UniformBufferDesc *uniformDesc) { +Draw::Pipeline *PresentationCommon::CreatePipeline(std::vector shaders, bool postShader, const UniformBufferDesc *uniformDesc) { using namespace Draw; Semantic pos = SEM_POSITION; diff --git a/GPU/Common/PresentationCommon.h b/GPU/Common/PresentationCommon.h index 959e516d5f..c3f56699f9 100644 --- a/GPU/Common/PresentationCommon.h +++ b/GPU/Common/PresentationCommon.h @@ -110,7 +110,7 @@ protected: void ShowPostShaderError(const std::string &errorString); Draw::ShaderModule *CompileShaderModule(ShaderStage stage, ShaderLanguage lang, const std::string &src, std::string *errorString); - Draw::Pipeline *CreatePipeline(std::vector shaders, bool postShader, const Draw::UniformBufferDesc *uniformDesc); + Draw::Pipeline *CreatePipeline(std::vector shaders, bool postShader, const UniformBufferDesc *uniformDesc); bool BuildPostShader(const ShaderInfo *shaderInfo, const ShaderInfo *next); bool AllocateFramebuffer(int w, int h); diff --git a/GPU/Common/ReinterpretFramebuffer.cpp b/GPU/Common/ReinterpretFramebuffer.cpp index cf039c0aa6..f915d99c79 100644 --- a/GPU/Common/ReinterpretFramebuffer.cpp +++ b/GPU/Common/ReinterpretFramebuffer.cpp @@ -1,8 +1,13 @@ #include +#include "Common/GPU/Shader.h" #include "Common/GPU/ShaderWriter.h" #include "GPU/Common/ReinterpretFramebuffer.h" +static const VaryingDef varyings[1] = { + { "vec2", "v_texcoord", "TEXCOORD0" }, +}; + // TODO: We could have an option to preserve any extra color precision. But gonna start without it. // Requires full size integer math. bool GenerateReinterpretFragmentShader(char *buffer, GEBufferFormat from, GEBufferFormat to, const ShaderLanguageDesc &lang) { @@ -15,10 +20,6 @@ bool GenerateReinterpretFragmentShader(char *buffer, GEBufferFormat from, GEBuff writer.DeclareSampler2D("samp", 0); writer.DeclareTexture2D("tex", 0); - static const VaryingDef varyings[1] = { - { "vec4", "v_texcoord", "TEXCOORD0" }, - }; - writer.BeginFSMain(Slice::empty(), varyings); writer.C(" vec4 val = ").SampleTexture2D("tex", "samp", "v_texcoord.xy").C(";\n"); @@ -62,3 +63,20 @@ bool GenerateReinterpretFragmentShader(char *buffer, GEBufferFormat from, GEBuff writer.EndFSMain("outColor"); return true; } + +bool GenerateReinterpretVertexShader(char *buffer, const ShaderLanguageDesc &lang) { + if (!lang.bitwiseOps) { + return false; + } + ShaderWriter writer(buffer, lang, ShaderStage::Vertex, nullptr, 0); + + writer.BeginVSMain(Slice::empty(), Slice::empty(), varyings); + + writer.C(" float x = -1.0 + float((gl_VertexIndex & 1) << 2);\n"); + writer.C(" float y = -1.0 + float((gl_VertexIndex & 2) << 1);\n"); + writer.C(" v_texcoord = (vec2(x, y) + vec2(1.0, 1.0)) * 0.5;\n"); + writer.C(" gl_Position = vec4(x, y, 0.0, 1.0);\n"); + + writer.EndVSMain(varyings); + return true; +} diff --git a/GPU/Common/ReinterpretFramebuffer.h b/GPU/Common/ReinterpretFramebuffer.h index f10fb9e3a3..14b8b042a9 100644 --- a/GPU/Common/ReinterpretFramebuffer.h +++ b/GPU/Common/ReinterpretFramebuffer.h @@ -6,3 +6,7 @@ #include "Common/GPU/ShaderWriter.h" bool GenerateReinterpretFragmentShader(char *buffer, GEBufferFormat from, GEBufferFormat to, const ShaderLanguageDesc &lang); + +// Just a single one. Can probably be shared with a lot of similar use cases. +// Generates the coordinates for a fullscreen triangle. +bool GenerateReinterpretVertexShader(char *buffer, const ShaderLanguageDesc &lang); diff --git a/GPU/D3D11/FramebufferManagerD3D11.cpp b/GPU/D3D11/FramebufferManagerD3D11.cpp index 2538f65edb..97e5615551 100644 --- a/GPU/D3D11/FramebufferManagerD3D11.cpp +++ b/GPU/D3D11/FramebufferManagerD3D11.cpp @@ -252,43 +252,6 @@ void FramebufferManagerD3D11::Bind2DShader() { context_->VSSetShader(quadVertexShader_, 0, 0); } -void FramebufferManagerD3D11::ReformatFramebufferFrom(VirtualFramebuffer *vfb, GEBufferFormat old) { - if (!useBufferedRendering_ || !vfb->fbo) { - return; - } - - // Technically, we should at this point re-interpret the bytes of the old format to the new. - // That might get tricky, and could cause unnecessary slowness in some games. - // For now, we just clear alpha/stencil from 565, which fixes shadow issues in Kingdom Hearts. - // (it uses 565 to write zeros to the buffer, then 4444 to actually render the shadow.) - // - // The best way to do this may ultimately be to create a new FBO (combine with any resize?) - // and blit with a shader to that, then replace the FBO on vfb. Stencil would still be complex - // to exactly reproduce in 4444 and 8888 formats. - if (old == GE_FORMAT_565) { - draw_->BindFramebufferAsRenderTarget(vfb->fbo, { Draw::RPAction::KEEP, Draw::RPAction::KEEP, Draw::RPAction::CLEAR }, "ReformatFramebuffer"); - - context_->OMSetDepthStencilState(stockD3D11.depthStencilDisabled, 0xFF); - context_->OMSetBlendState(stockD3D11.blendStateDisabledWithColorMask[D3D11_COLOR_WRITE_ENABLE_ALPHA], nullptr, 0xFFFFFFFF); - context_->RSSetState(stockD3D11.rasterStateNoCull); - context_->IASetInputLayout(quadInputLayout_); - context_->PSSetShader(quadPixelShader_, nullptr, 0); - context_->VSSetShader(quadVertexShader_, nullptr, 0); - context_->IASetVertexBuffers(0, 1, &fsQuadBuffer_, &quadStride_, &quadOffset_); - context_->PSSetSamplers(0, 1, &stockD3D11.samplerPoint2DClamp); - context_->PSSetShaderResources(0, 1, &nullTextureView_); - shaderManagerD3D11_->DirtyLastShader(); - D3D11_VIEWPORT vp{ 0.0f, 0.0f, (float)vfb->renderWidth, (float)vfb->renderHeight, 0.0f, 1.0f }; - context_->RSSetViewports(1, &vp); - context_->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP); - context_->Draw(4, 0); - - textureCache_->ForgetLastTexture(); - - gstate_c.Dirty(DIRTY_BLEND_STATE | DIRTY_DEPTHSTENCIL_STATE | DIRTY_RASTER_STATE | DIRTY_VIEWPORTSCISSOR_STATE | DIRTY_VERTEXSHADER_STATE); - } -} - static void CopyPixelDepthOnly(u32 *dstp, const u32 *srcp, size_t c) { size_t x = 0; diff --git a/GPU/D3D11/FramebufferManagerD3D11.h b/GPU/D3D11/FramebufferManagerD3D11.h index ec8f1b00e0..dc2bc15e94 100644 --- a/GPU/D3D11/FramebufferManagerD3D11.h +++ b/GPU/D3D11/FramebufferManagerD3D11.h @@ -42,7 +42,6 @@ public: void DrawActiveTexture(float x, float y, float w, float h, float destW, float destH, float u0, float v0, float u1, float v1, int uvRotation, int flags) override; void EndFrame(); - void ReformatFramebufferFrom(VirtualFramebuffer *vfb, GEBufferFormat old) override; virtual bool NotifyStencilUpload(u32 addr, int size, StencilUpload flags = StencilUpload::NEEDS_CLEAR) override; diff --git a/GPU/Directx9/FramebufferManagerDX9.cpp b/GPU/Directx9/FramebufferManagerDX9.cpp index 4f0aafb78d..24c8799dc5 100644 --- a/GPU/Directx9/FramebufferManagerDX9.cpp +++ b/GPU/Directx9/FramebufferManagerDX9.cpp @@ -228,83 +228,6 @@ static const D3DVERTEXELEMENT9 g_FramebufferVertexElements[] = { device_->SetVertexShader(pFramebufferVertexShader); } - void FramebufferManagerDX9::ReformatFramebufferFrom(VirtualFramebuffer *vfb, GEBufferFormat old) { - if (!useBufferedRendering_ || !vfb->fbo) { - return; - } - - // Technically, we should at this point re-interpret the bytes of the old format to the new. - // That might get tricky, and could cause unnecessary slowness in some games. - // For now, we just clear alpha/stencil from 565, which fixes shadow issues in Kingdom Hearts. - // (it uses 565 to write zeros to the buffer, then 4444 to actually render the shadow.) - // - // The best way to do this may ultimately be to create a new FBO (combine with any resize?) - // and blit with a shader to that, then replace the FBO on vfb. Stencil would still be complex - // to exactly reproduce in 4444 and 8888 formats. - - if (old == GE_FORMAT_565) { - draw_->BindFramebufferAsRenderTarget(vfb->fbo, { Draw::RPAction::KEEP, Draw::RPAction::KEEP, Draw::RPAction::CLEAR }, "ReformatFramebuffer"); - - dxstate.scissorTest.disable(); - dxstate.depthWrite.set(FALSE); - dxstate.colorMask.set(false, false, false, true); - dxstate.stencilFunc.set(D3DCMP_ALWAYS, 0, 0); - dxstate.stencilMask.set(0xFF); - gstate_c.Dirty(DIRTY_BLEND_STATE | DIRTY_DEPTHSTENCIL_STATE | DIRTY_RASTER_STATE | DIRTY_VIEWPORTSCISSOR_STATE | DIRTY_TEXTURE_PARAMS | DIRTY_VERTEXSHADER_STATE | DIRTY_FRAGMENTSHADER_STATE); - - float coord[20] = { - -1.0f,-1.0f,0, 0,0, - 1.0f,-1.0f,0, 0,0, - 1.0f,1.0f,0, 0,0, - -1.0f,1.0f,0, 0,0, - }; - - dxstate.cullMode.set(false, false); - device_->SetVertexDeclaration(pFramebufferVertexDecl); - device_->SetPixelShader(pFramebufferPixelShader); - device_->SetVertexShader(pFramebufferVertexShader); - shaderManagerDX9_->DirtyLastShader(); - device_->SetTexture(0, nullTex_); - - D3DVIEWPORT9 vp{ 0, 0, (DWORD)vfb->renderWidth, (DWORD)vfb->renderHeight, 0.0f, 1.0f }; - device_->SetViewport(&vp); - - // This should clear stencil and alpha without changing the other colors. - HRESULT hr = device_->DrawPrimitiveUP(D3DPT_TRIANGLEFAN, 2, coord, 5 * sizeof(float)); - if (FAILED(hr)) { - ERROR_LOG_REPORT(G3D, "ReformatFramebufferFrom() failed: %08x", hr); - } - dxstate.viewport.restore(); - - textureCache_->ForgetLastTexture(); - } - } - - static void CopyPixelDepthOnly(u32 *dstp, const u32 *srcp, size_t c) { - size_t x = 0; - -#ifdef _M_SSE - size_t sseSize = (c / 4) * 4; - const __m128i srcMask = _mm_set1_epi32(0x00FFFFFF); - const __m128i dstMask = _mm_set1_epi32(0xFF000000); - __m128i *dst = (__m128i *)dstp; - const __m128i *src = (const __m128i *)srcp; - - for (; x < sseSize; x += 4) { - const __m128i bits24 = _mm_and_si128(_mm_load_si128(src), srcMask); - const __m128i bits8 = _mm_and_si128(_mm_load_si128(dst), dstMask); - _mm_store_si128(dst, _mm_or_si128(bits24, bits8)); - dst++; - src++; - } -#endif - - // Copy the remaining pixels that didn't fit in SSE. - for (; x < c; ++x) { - memcpy(dstp + x, srcp + x, 3); - } - } - LPDIRECT3DSURFACE9 FramebufferManagerDX9::GetOffscreenSurface(LPDIRECT3DSURFACE9 similarSurface, VirtualFramebuffer *vfb) { D3DSURFACE_DESC desc = {}; HRESULT hr = similarSurface->GetDesc(&desc); diff --git a/GPU/Directx9/FramebufferManagerDX9.h b/GPU/Directx9/FramebufferManagerDX9.h index a35a154265..ac1dbaa484 100644 --- a/GPU/Directx9/FramebufferManagerDX9.h +++ b/GPU/Directx9/FramebufferManagerDX9.h @@ -47,7 +47,6 @@ public: void DestroyAllFBOs(); void EndFrame(); - void ReformatFramebufferFrom(VirtualFramebuffer *vfb, GEBufferFormat old) override; virtual bool NotifyStencilUpload(u32 addr, int size, StencilUpload flags = StencilUpload::NEEDS_CLEAR) override; diff --git a/GPU/GLES/FramebufferManagerGLES.cpp b/GPU/GLES/FramebufferManagerGLES.cpp index befbe06177..a659377d66 100644 --- a/GPU/GLES/FramebufferManagerGLES.cpp +++ b/GPU/GLES/FramebufferManagerGLES.cpp @@ -242,27 +242,6 @@ void FramebufferManagerGLES::DrawActiveTexture(float x, float y, float w, float } } -void FramebufferManagerGLES::ReformatFramebufferFrom(VirtualFramebuffer *vfb, GEBufferFormat old) { - if (!useBufferedRendering_ || !vfb->fbo) { - return; - } - - // Technically, we should at this point re-interpret the bytes of the old format to the new. - // That might get tricky, and could cause unnecessary slowness in some games. - // For now, we just clear alpha/stencil from 565, which fixes shadow issues in Kingdom Hearts. - // (it uses 565 to write zeros to the buffer, then 4444 to actually render the shadow.) - // - // The best way to do this may ultimately be to create a new FBO (combine with any resize?) - // and blit with a shader to that, then replace the FBO on vfb. Stencil would still be complex - // to exactly reproduce in 4444 and 8888 formats. - - if (old == GE_FORMAT_565) { - // Clear alpha and stencil. - draw_->BindFramebufferAsRenderTarget(vfb->fbo, { Draw::RPAction::KEEP, Draw::RPAction::KEEP, Draw::RPAction::CLEAR }, "ReformatFramebuffer"); - render_->Clear(0, 0.0f, 0, GL_COLOR_BUFFER_BIT, 0x8, 0, 0, 0, 0); - } -} - void FramebufferManagerGLES::UpdateDownloadTempBuffer(VirtualFramebuffer *nvfb) { _assert_msg_(nvfb->fbo, "Expecting a valid nvfb in UpdateDownloadTempBuffer"); diff --git a/GPU/GLES/FramebufferManagerGLES.h b/GPU/GLES/FramebufferManagerGLES.h index 56ad6aa307..72c91f4b9b 100644 --- a/GPU/GLES/FramebufferManagerGLES.h +++ b/GPU/GLES/FramebufferManagerGLES.h @@ -50,8 +50,6 @@ public: void DeviceLost() override; void DeviceRestore(Draw::DrawContext *draw) override; - void ReformatFramebufferFrom(VirtualFramebuffer *vfb, GEBufferFormat old) override; - bool NotifyStencilUpload(u32 addr, int size, StencilUpload flags = StencilUpload::NEEDS_CLEAR) override; bool GetOutputFramebuffer(GPUDebugBuffer &buffer) override; diff --git a/GPU/Vulkan/FramebufferManagerVulkan.cpp b/GPU/Vulkan/FramebufferManagerVulkan.cpp index a4e5873f67..c293c1b5b9 100644 --- a/GPU/Vulkan/FramebufferManagerVulkan.cpp +++ b/GPU/Vulkan/FramebufferManagerVulkan.cpp @@ -242,32 +242,6 @@ int FramebufferManagerVulkan::GetLineWidth() { } } -// This also binds vfb as the current render target. -void FramebufferManagerVulkan::ReformatFramebufferFrom(VirtualFramebuffer *vfb, GEBufferFormat old) { - if (!useBufferedRendering_ || !vfb->fbo) { - return; - } - - // Technically, we should at this point re-interpret the bytes of the old format to the new. - // That might get tricky, and could cause unnecessary slowness in some games. - // For now, we just clear alpha/stencil from 565, which fixes shadow issues in Kingdom Hearts. - // (it uses 565 to write zeros to the buffer, then 4444 to actually render the shadow.) - // - // The best way to do this may ultimately be to create a new FBO (combine with any resize?) - // and blit with a shader to that, then replace the FBO on vfb. Stencil would still be complex - // to exactly reproduce in 4444 and 8888 formats. - - if (old == GE_FORMAT_565) { - // We have to bind here instead of clear, since it can be that no framebuffer is bound. - // The backend can sometimes directly optimize it to a clear. - draw_->BindFramebufferAsRenderTarget(vfb->fbo, { Draw::RPAction::CLEAR, Draw::RPAction::KEEP, Draw::RPAction::CLEAR }, "ReformatFramebuffer"); - - // Need to dirty anything that has command buffer dynamic state, in case we started a new pass above. - // Should find a way to feed that information back, maybe... Or simply correct the issue in the rendermanager. - gstate_c.Dirty(DIRTY_DEPTHSTENCIL_STATE | DIRTY_VIEWPORTSCISSOR_STATE | DIRTY_BLEND_STATE); - } -} - void FramebufferManagerVulkan::UpdateDownloadTempBuffer(VirtualFramebuffer *nvfb) { // Nothing to do here. } diff --git a/GPU/Vulkan/FramebufferManagerVulkan.h b/GPU/Vulkan/FramebufferManagerVulkan.h index aaa1d48297..d8b20e3826 100644 --- a/GPU/Vulkan/FramebufferManagerVulkan.h +++ b/GPU/Vulkan/FramebufferManagerVulkan.h @@ -53,7 +53,6 @@ public: void DeviceRestore(Draw::DrawContext *draw) override; int GetLineWidth(); - void ReformatFramebufferFrom(VirtualFramebuffer *vfb, GEBufferFormat old) override; bool NotifyStencilUpload(u32 addr, int size, StencilUpload flags = StencilUpload::NEEDS_CLEAR) override; diff --git a/GPU/ge_constants.h b/GPU/ge_constants.h index 5facb4ad05..4f4c711548 100644 --- a/GPU/ge_constants.h +++ b/GPU/ge_constants.h @@ -287,6 +287,9 @@ enum GEBufferFormat }; const char *GeBufferFormatToString(GEBufferFormat fmt); +inline bool IsGeBufferFormat16BitColor(GEBufferFormat fmt) { + return (int)fmt < 3; +} #define GE_VTYPE_TRANSFORM (0<<23) #define GE_VTYPE_THROUGH (1<<23) diff --git a/unittest/TestShaderGenerators.cpp b/unittest/TestShaderGenerators.cpp index 35dcde1104..46fa217305 100644 --- a/unittest/TestShaderGenerators.cpp +++ b/unittest/TestShaderGenerators.cpp @@ -169,6 +169,23 @@ bool TestReinterpretShaders() { // Generate all despite failures - it's only 6. bool failed = false; + for (int k = 0; k < ARRAY_SIZE(languages); k++) { + ShaderLanguageDesc desc(languages[k]); + if (!GenerateReinterpretVertexShader(buffer, desc)) { + printf("Failed!\n%s\n", buffer); + failed = true; + } else { + std::string errorMessage; + if (!TestCompileShader(buffer, languages[k], true, &errorMessage)) { + printf("Error compiling fragment shader:\n\n%s\n\n%s\n", LineNumberString(buffer).c_str(), errorMessage.c_str()); + failed = true; + return false; + } else { + printf("===\n%s\n===\n", buffer); + } + } + } + for (int k = 0; k < ARRAY_SIZE(languages); k++) { printf("=== %s ===\n\n", ShaderLanguageToString(languages[k])); From 1ccc8c129c708935266311712253f0129780c967 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Fri, 6 Nov 2020 09:55:16 +0100 Subject: [PATCH 215/275] Reinterpret code runs, no idea if it works --- Common/GPU/D3D11/thin3d_d3d11.cpp | 2 +- Common/GPU/OpenGL/thin3d_gl.cpp | 29 ++++++++++---- GPU/Common/FramebufferManagerCommon.cpp | 51 ++++++++++++++++++++----- GPU/Common/FramebufferManagerCommon.h | 3 +- 4 files changed, 66 insertions(+), 19 deletions(-) diff --git a/Common/GPU/D3D11/thin3d_d3d11.cpp b/Common/GPU/D3D11/thin3d_d3d11.cpp index 21db0ab5cb..3605c1725d 100644 --- a/Common/GPU/D3D11/thin3d_d3d11.cpp +++ b/Common/GPU/D3D11/thin3d_d3d11.cpp @@ -680,7 +680,7 @@ public: if (dynamicUniforms) dynamicUniforms->Release(); } - bool RequiresBuffer() { + bool RequiresBuffer() override { return true; } diff --git a/Common/GPU/OpenGL/thin3d_gl.cpp b/Common/GPU/OpenGL/thin3d_gl.cpp index 4e9b5b4f92..e789c987df 100644 --- a/Common/GPU/OpenGL/thin3d_gl.cpp +++ b/Common/GPU/OpenGL/thin3d_gl.cpp @@ -307,7 +307,7 @@ public: bool LinkShaders(); bool RequiresBuffer() override { - return inputLayout->RequiresBuffer(); + return inputLayout && inputLayout->RequiresBuffer(); } GLuint prim = 0; @@ -1051,7 +1051,7 @@ Pipeline *OpenGLContext::CreateGraphicsPipeline(const PipelineDesc &desc) { ERROR_LOG(G3D, "Invalid primitive type"); return nullptr; } - if (!desc.depthStencil || !desc.blend || !desc.raster || !desc.inputLayout) { + if (!desc.depthStencil || !desc.blend || !desc.raster) { ERROR_LOG(G3D, "Incomplete prim desciption"); return nullptr; } @@ -1081,7 +1081,9 @@ Pipeline *OpenGLContext::CreateGraphicsPipeline(const PipelineDesc &desc) { pipeline->depthStencil->AddRef(); pipeline->blend->AddRef(); pipeline->raster->AddRef(); - pipeline->inputLayout->AddRef(); + if (pipeline->inputLayout) { + pipeline->inputLayout->AddRef(); + } return pipeline; } else { ERROR_LOG(G3D, "Failed to create pipeline - shaders failed to link"); @@ -1219,7 +1221,9 @@ void OpenGLContext::UpdateDynamicUniformBuffer(const void *ub, size_t size) { void OpenGLContext::Draw(int vertexCount, int offset) { _dbg_assert_msg_(curVBuffers_[0], "Can't call Draw without a vertex buffer"); ApplySamplers(); - renderManager_.BindVertexBuffer(curPipeline_->inputLayout->inputLayout_, curVBuffers_[0]->buffer_, curVBufferOffsets_[0]); + if (curPipeline_->inputLayout) { + renderManager_.BindVertexBuffer(curPipeline_->inputLayout->inputLayout_, curVBuffers_[0]->buffer_, curVBufferOffsets_[0]); + } renderManager_.Draw(curPipeline_->prim, offset, vertexCount); } @@ -1227,12 +1231,15 @@ void OpenGLContext::DrawIndexed(int vertexCount, int offset) { _dbg_assert_msg_(curVBuffers_[0], "Can't call DrawIndexed without a vertex buffer"); _dbg_assert_msg_(curIBuffer_, "Can't call DrawIndexed without an index buffer"); ApplySamplers(); - renderManager_.BindVertexBuffer(curPipeline_->inputLayout->inputLayout_, curVBuffers_[0]->buffer_, curVBufferOffsets_[0]); + if (curPipeline_->inputLayout) { + renderManager_.BindVertexBuffer(curPipeline_->inputLayout->inputLayout_, curVBuffers_[0]->buffer_, curVBufferOffsets_[0]); + } renderManager_.BindIndexBuffer(curIBuffer_->buffer_); renderManager_.DrawIndexed(curPipeline_->prim, vertexCount, GL_UNSIGNED_SHORT, (void *)((intptr_t)curIBufferOffset_ + offset * sizeof(uint32_t))); } void OpenGLContext::DrawUP(const void *vdata, int vertexCount) { + _assert_(curPipeline_->inputLayout); int stride = curPipeline_->inputLayout->stride; size_t dataSize = stride * vertexCount; @@ -1242,7 +1249,9 @@ void OpenGLContext::DrawUP(const void *vdata, int vertexCount) { size_t offset = frameData.push->Push(vdata, dataSize, &buf); ApplySamplers(); - renderManager_.BindVertexBuffer(curPipeline_->inputLayout->inputLayout_, buf, offset); + if (curPipeline_->inputLayout) { + renderManager_.BindVertexBuffer(curPipeline_->inputLayout->inputLayout_, buf, offset); + } renderManager_.Draw(curPipeline_->prim, 0, vertexCount); } @@ -1273,7 +1282,7 @@ OpenGLInputLayout::~OpenGLInputLayout() { void OpenGLInputLayout::Compile(const InputLayoutDesc &desc) { // TODO: This is only accurate if there's only one stream. But whatever, for now we // never use multiple streams anyway. - stride = (GLsizei)desc.bindings[0].stride; + stride = desc.bindings.empty() ? 0 : (GLsizei)desc.bindings[0].stride; std::vector entries; for (auto &attr : desc.attributes) { @@ -1310,7 +1319,11 @@ void OpenGLInputLayout::Compile(const InputLayoutDesc &desc) { entries.push_back(entry); } - inputLayout_ = render_->CreateInputLayout(entries); + if (!entries.empty()) { + inputLayout_ = render_->CreateInputLayout(entries); + } else { + inputLayout_ = nullptr; + } } Framebuffer *OpenGLContext::CreateFramebuffer(const FramebufferDesc &desc) { diff --git a/GPU/Common/FramebufferManagerCommon.cpp b/GPU/Common/FramebufferManagerCommon.cpp index e50f387dc7..a21585b138 100644 --- a/GPU/Common/FramebufferManagerCommon.cpp +++ b/GPU/Common/FramebufferManagerCommon.cpp @@ -533,40 +533,73 @@ void FramebufferManagerCommon::ReformatFramebufferFrom(VirtualFramebuffer *vfb, if (!reinterpretVS_) { char *buffer = new char[4000]; - const ShaderLanguageDesc &desc = draw_->GetShaderLanguageDesc(); - GenerateReinterpretVertexShader(buffer, desc); - reinterpretVS_ = draw_->CreateShaderModule(ShaderStage::Vertex, desc.shaderLanguage, (const uint8_t *)buffer, strlen(buffer), "reinterpret_vs"); + const ShaderLanguageDesc &shaderLanguageDesc = draw_->GetShaderLanguageDesc(); + GenerateReinterpretVertexShader(buffer, shaderLanguageDesc); + reinterpretVS_ = draw_->CreateShaderModule(ShaderStage::Vertex, shaderLanguageDesc.shaderLanguage, (const uint8_t *)buffer, strlen(buffer), "reinterpret_vs"); + _assert_(reinterpretVS_); delete[] buffer; } + if (!reinterpretSampler_) { + Draw::SamplerStateDesc samplerDesc{}; + samplerDesc.magFilter = Draw::TextureFilter::LINEAR; + samplerDesc.minFilter = Draw::TextureFilter::LINEAR; + reinterpretSampler_ = draw_->CreateSamplerState(samplerDesc); + } + // See if we need to create a new pipeline. - if (!reinterpretFromTo_[(int)oldFormat][(int)newFormat]) { + + Draw::Pipeline *pipeline = reinterpretFromTo_[(int)oldFormat][(int)newFormat]; + if (!pipeline) { + char *buffer = new char[4000]; + const ShaderLanguageDesc &shaderLanguageDesc = draw_->GetShaderLanguageDesc(); + GenerateReinterpretFragmentShader(buffer, oldFormat, newFormat, shaderLanguageDesc); + Draw::ShaderModule *reinterpretFS = draw_->CreateShaderModule(ShaderStage::Fragment, shaderLanguageDesc.shaderLanguage, (const uint8_t *)buffer, strlen(buffer), "reinterpret_fs"); + _assert_(reinterpretFS); + delete[] buffer; + std::vector shaders; + shaders.push_back(reinterpretVS_); + shaders.push_back(reinterpretFS); using namespace Draw; Draw::PipelineDesc desc{}; // We use a "fullscreen triangle". - InputLayoutDesc inputDesc{}; // No inputs, we generate it in the shader. - InputLayout *inputLayout = draw_->CreateInputLayout(inputDesc); + // TODO: clear the stencil buffer. Hard to actually initialize it with the new alpha, though possible - let's see if + // we need it. DepthStencilState *depth = draw_->CreateDepthStencilState({ false, false, Comparison::LESS }); BlendState *blendstateOff = draw_->CreateBlendState({ false, 0xF }); RasterState *rasterNoCull = draw_->CreateRasterState({}); // No uniforms for these, only a single texture input. - PipelineDesc pipelineDesc{ Primitive::TRIANGLE_LIST, shaders, inputLayout, depth, blendstateOff, rasterNoCull, nullptr }; - Pipeline *pipeline = draw_->CreateGraphicsPipeline(pipelineDesc); + PipelineDesc pipelineDesc{ Primitive::TRIANGLE_LIST, shaders, nullptr, depth, blendstateOff, rasterNoCull, nullptr }; + pipeline = draw_->CreateGraphicsPipeline(pipelineDesc); + _assert_(pipeline != nullptr); + reinterpretFromTo_[(int)oldFormat][(int)newFormat] = pipeline; - inputLayout->Release(); depth->Release(); blendstateOff->Release(); rasterNoCull->Release(); + reinterpretFS->Release(); } // Copy to a temp framebuffer. Draw::Framebuffer *temp = GetTempFBO(TempFBO::COPY, vfb->renderWidth, vfb->renderHeight); + draw_->CopyFramebufferImage(vfb->fbo, 0, 0, 0, 0, temp, 0, 0, 0, 0, vfb->renderWidth, vfb->renderHeight, 1, Draw::FBChannel::FB_COLOR_BIT, "reinterpret_prep"); + draw_->BindFramebufferAsRenderTarget(vfb->fbo, { Draw::RPAction::DONT_CARE, Draw::RPAction::DONT_CARE, Draw::RPAction::DONT_CARE }, "reinterpret"); + draw_->BindPipeline(pipeline); + draw_->BindFramebufferAsTexture(temp, 0, Draw::FBChannel::FB_COLOR_BIT, 0); + draw_->BindSamplerStates(0, 1, &reinterpretSampler_); + draw_->SetScissorRect(0, 0, vfb->renderWidth, vfb->renderHeight); + Draw::Viewport vp = Draw::Viewport{ 0.0f, 0.0f, (float)vfb->renderWidth, (float)vfb->renderHeight, 0.0f, 1.0f }; + draw_->SetViewports(1, &vp); + draw_->Draw(3, 0); + draw_->InvalidateCachedState(); + shaderManager_->DirtyLastShader(); textureCache_->ForgetLastTexture(); + gstate_c.Dirty(DIRTY_BLEND_STATE | DIRTY_DEPTHSTENCIL_STATE | DIRTY_RASTER_STATE | DIRTY_VIEWPORTSCISSOR_STATE | DIRTY_VERTEXSHADER_STATE); } diff --git a/GPU/Common/FramebufferManagerCommon.h b/GPU/Common/FramebufferManagerCommon.h index 146a4afb11..48f8d384fe 100644 --- a/GPU/Common/FramebufferManagerCommon.h +++ b/GPU/Common/FramebufferManagerCommon.h @@ -432,6 +432,7 @@ protected: // Thin3D stuff for reinterpreting image data between the various 16-bit formats. // Safe, not optimal - there might be input attachment tricks, etc, but we can't use them // since we don't want N different implementations. - Draw::Pipeline *reinterpretFromTo_[3][3]; + Draw::Pipeline *reinterpretFromTo_[3][3]{}; Draw::ShaderModule *reinterpretVS_ = nullptr; + Draw::SamplerState *reinterpretSampler_ = nullptr; }; From 981d0a2abe6baa7604933d1c97c9fa501caf415d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Fri, 6 Nov 2020 11:54:57 +0100 Subject: [PATCH 216/275] Reinterpret the data when binding a framebuffer with a different 16-bit format. Car reflections in Outrun are better (see #11358) but have some blue/yellow color garbage that will need a different fix. --- GPU/Common/FramebufferManagerCommon.cpp | 2 +- GPU/Common/FramebufferManagerCommon.h | 4 +++- GPU/Common/TextureCacheCommon.cpp | 26 +++++++++++++++++---- GPU/Common/TextureCacheCommon.h | 2 ++ GPU/ge_constants.h | 31 +++++++++++++++++++++---- 5 files changed, 53 insertions(+), 12 deletions(-) diff --git a/GPU/Common/FramebufferManagerCommon.cpp b/GPU/Common/FramebufferManagerCommon.cpp index a21585b138..56a3585124 100644 --- a/GPU/Common/FramebufferManagerCommon.cpp +++ b/GPU/Common/FramebufferManagerCommon.cpp @@ -584,7 +584,7 @@ void FramebufferManagerCommon::ReformatFramebufferFrom(VirtualFramebuffer *vfb, } // Copy to a temp framebuffer. - Draw::Framebuffer *temp = GetTempFBO(TempFBO::COPY, vfb->renderWidth, vfb->renderHeight); + Draw::Framebuffer *temp = GetTempFBO(TempFBO::REINTERPRET, vfb->renderWidth, vfb->renderHeight); draw_->CopyFramebufferImage(vfb->fbo, 0, 0, 0, 0, temp, 0, 0, 0, 0, vfb->renderWidth, vfb->renderHeight, 1, Draw::FBChannel::FB_COLOR_BIT, "reinterpret_prep"); draw_->BindFramebufferAsRenderTarget(vfb->fbo, { Draw::RPAction::DONT_CARE, Draw::RPAction::DONT_CARE, Draw::RPAction::DONT_CARE }, "reinterpret"); diff --git a/GPU/Common/FramebufferManagerCommon.h b/GPU/Common/FramebufferManagerCommon.h index 48f8d384fe..9f35afce11 100644 --- a/GPU/Common/FramebufferManagerCommon.h +++ b/GPU/Common/FramebufferManagerCommon.h @@ -158,6 +158,8 @@ enum class TempFBO { BLIT, // For copies of framebuffers (e.g. shader blending.) COPY, + // For another type of framebuffers that can happen together with COPY (see Outrun) + REINTERPRET, // Used to copy stencil data, means we need a stencil backing. STENCIL, }; @@ -320,6 +322,7 @@ public: const std::vector &Framebuffers() { return vfbs_; } + void ReformatFramebufferFrom(VirtualFramebuffer *vfb, GEBufferFormat old); protected: virtual void PackFramebufferSync_(VirtualFramebuffer *vfb, int x, int y, int w, int h); @@ -344,7 +347,6 @@ protected: void NotifyRenderFramebufferUpdated(VirtualFramebuffer *vfb, bool vfbFormatChanged); void NotifyRenderFramebufferSwitched(VirtualFramebuffer *prevVfb, VirtualFramebuffer *vfb, bool isClearingDepth); - void ReformatFramebufferFrom(VirtualFramebuffer *vfb, GEBufferFormat old); void BlitFramebufferDepth(VirtualFramebuffer *src, VirtualFramebuffer *dst); void ResizeFramebufFBO(VirtualFramebuffer *vfb, int w, int h, bool force = false, bool skipCopy = false); diff --git a/GPU/Common/TextureCacheCommon.cpp b/GPU/Common/TextureCacheCommon.cpp index 1c5c63cdce..31189408ae 100644 --- a/GPU/Common/TextureCacheCommon.cpp +++ b/GPU/Common/TextureCacheCommon.cpp @@ -486,9 +486,10 @@ TexCacheEntry *TextureCacheCommon::SetTexture() { DeleteTexture(entryIter); } + const AttachCandidate &candidate = candidates[index]; nextTexture_ = nullptr; nextNeedsRebuild_ = false; - SetTextureFramebuffer(candidates[index]); + SetTextureFramebuffer(candidate); return nullptr; } } @@ -849,11 +850,19 @@ FramebufferMatchInfo TextureCacheCommon::MatchFramebuffer( WARN_LOG_ONCE(diffStrides1, G3D, "Texturing from framebuffer with different strides %d != %d", entry.bufw, framebuffer->fb_stride); } // NOTE: This check is okay because the first texture formats are the same as the buffer formats. - if (entry.format != (GETextureFormat)framebuffer->format) { - WARN_LOG_ONCE(diffFormat1, G3D, "Texturing from framebuffer with different formats %s != %s", GeTextureFormatToString(entry.format), GeBufferFormatToString(framebuffer->format)); - return FramebufferMatchInfo{ FramebufferMatch::NO_MATCH }; + if (IsTextureFormatBufferCompatible(entry.format)) { + if (TextureFormatMatchesBufferFormat(entry.format, framebuffer->format)) { + return FramebufferMatchInfo{ FramebufferMatch::VALID }; + } else if (IsTextureFormat16Bit(entry.format) && IsBufferFormat16Bit(framebuffer->format)) { + WARN_LOG_ONCE(diffFormat1, G3D, "Texturing from framebuffer with reinterpretable format: %s != %s", GeTextureFormatToString(entry.format), GeBufferFormatToString(framebuffer->format)); + return FramebufferMatchInfo{ FramebufferMatch::VALID, 0, 0, true, TextureFormatToBufferFormat(entry.format) }; + } else { + WARN_LOG_ONCE(diffFormat2, G3D, "Texturing from framebuffer with incompatible formats %s != %s", GeTextureFormatToString(entry.format), GeBufferFormatToString(framebuffer->format)); + return FramebufferMatchInfo{ FramebufferMatch::NO_MATCH }; + } } else { - return FramebufferMatchInfo{ FramebufferMatch::VALID }; + // Format incompatible, ignoring without comment. (maybe some really gnarly hacks will end up here...) + return FramebufferMatchInfo{ FramebufferMatch::NO_MATCH }; } } else { // Apply to buffered mode only. @@ -944,6 +953,13 @@ void TextureCacheCommon::SetTextureFramebuffer(const AttachCandidate &candidate) VirtualFramebuffer *framebuffer = candidate.fb; FramebufferMatchInfo fbInfo = candidate.match; + if (candidate.match.reinterpret) { + // TODO: Kinda ugly, maybe switch direction of the call? + GEBufferFormat oldFormat = candidate.fb->format; + candidate.fb->format = candidate.match.reinterpretTo; + framebufferManager_->ReformatFramebufferFrom(candidate.fb, oldFormat); + } + _dbg_assert_msg_(framebuffer != nullptr, "Framebuffer must not be null."); framebuffer->usageFlags |= FB_USAGE_TEXTURE; diff --git a/GPU/Common/TextureCacheCommon.h b/GPU/Common/TextureCacheCommon.h index 1b0300724b..4ffa7f9448 100644 --- a/GPU/Common/TextureCacheCommon.h +++ b/GPU/Common/TextureCacheCommon.h @@ -212,6 +212,8 @@ struct FramebufferMatchInfo { FramebufferMatch match; u32 xOffset; u32 yOffset; + bool reinterpret; + GEBufferFormat reinterpretTo; }; struct AttachCandidate { diff --git a/GPU/ge_constants.h b/GPU/ge_constants.h index 4f4c711548..92c06c3f1d 100644 --- a/GPU/ge_constants.h +++ b/GPU/ge_constants.h @@ -419,12 +419,33 @@ enum GETextureFormat GE_TFMT_DXT5 = 10, }; -const char *GeTextureFormatToString(GETextureFormat fmt); -inline bool IsClutFormat(GETextureFormat fmt) { - return fmt == GE_TFMT_CLUT4 || fmt == GE_TFMT_CLUT8 || fmt == GE_TFMT_CLUT16 || fmt == GE_TFMT_CLUT32; +const char *GeTextureFormatToString(GETextureFormat tfmt); +inline bool IsClutFormat(GETextureFormat tfmt) { + return tfmt == GE_TFMT_CLUT4 || tfmt == GE_TFMT_CLUT8 || tfmt == GE_TFMT_CLUT16 || tfmt == GE_TFMT_CLUT32; } -inline bool IsDXTFormat(GETextureFormat fmt) { - return fmt == GE_TFMT_DXT1 || fmt == GE_TFMT_DXT3 || fmt == GE_TFMT_DXT5; +inline bool IsDXTFormat(GETextureFormat tfmt) { + return tfmt == GE_TFMT_DXT1 || tfmt == GE_TFMT_DXT3 || tfmt == GE_TFMT_DXT5; +} +inline bool IsTextureFormatBufferCompatible(GETextureFormat tfmt) { + return (int)tfmt < 4; +} +inline bool IsBufferFormat16Bit(GEBufferFormat bfmt) { + return (int)bfmt < 3; +} +inline bool IsTextureFormat16Bit(GETextureFormat tfmt) { + return (int)tfmt < 3; +} +inline bool TextureFormatMatchesBufferFormat(GETextureFormat fmt, GEBufferFormat bfmt) { + // First four matches perfectly. + if ((int)fmt < 4) { + return (int)fmt == (int)bfmt; + } else { + return false; + } +} +// only applicable if IsTextureFormatBufferCompatible(fmt) +inline GEBufferFormat TextureFormatToBufferFormat(GETextureFormat bfmt) { + return (GEBufferFormat)(int)bfmt; } enum GETexLevelMode { From 96c36d5c10faf7b432680079b77c71365c0ae9f7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Fri, 6 Nov 2020 20:08:57 +0100 Subject: [PATCH 217/275] More work on reinterpret. Get Vulkan running --- Common/GPU/D3D11/thin3d_d3d11.cpp | 31 ++++++++++++++++++------- Common/GPU/ShaderWriter.cpp | 5 ++-- Common/GPU/Vulkan/thin3d_vulkan.cpp | 12 +++++++--- GPU/Common/FramebufferManagerCommon.cpp | 24 ++++++++++++------- GPU/Common/ShaderId.h | 5 ++-- 5 files changed, 53 insertions(+), 24 deletions(-) diff --git a/Common/GPU/D3D11/thin3d_d3d11.cpp b/Common/GPU/D3D11/thin3d_d3d11.cpp index 3605c1725d..608baeb38b 100644 --- a/Common/GPU/D3D11/thin3d_d3d11.cpp +++ b/Common/GPU/D3D11/thin3d_d3d11.cpp @@ -664,6 +664,8 @@ InputLayout *D3D11DrawContext::CreateInputLayout(const InputLayoutDesc &desc) { return inputLayout; } +class D3D11ShaderModule; + class D3D11Pipeline : public Pipeline { public: ~D3D11Pipeline() { @@ -694,6 +696,8 @@ public: ID3D11GeometryShader *gs = nullptr; D3D11_PRIMITIVE_TOPOLOGY topology = D3D11_PRIMITIVE_TOPOLOGY_UNDEFINED; + std::vector shaderModules; + size_t dynamicUniformsSize = 0; ID3D11Buffer *dynamicUniforms = nullptr; }; @@ -966,7 +970,9 @@ Pipeline *D3D11DrawContext::CreateGraphicsPipeline(const PipelineDesc &desc) { dPipeline->raster = (D3D11RasterState *)desc.raster; dPipeline->blend->AddRef(); dPipeline->depth->AddRef(); - dPipeline->input->AddRef(); + if (dPipeline->input) { + dPipeline->input->AddRef(); + } dPipeline->raster->AddRef(); dPipeline->topology = primToD3D11[(int)desc.prim]; if (desc.uniformDesc) { @@ -983,6 +989,8 @@ Pipeline *D3D11DrawContext::CreateGraphicsPipeline(const PipelineDesc &desc) { std::vector shaders; D3D11ShaderModule *vshader = nullptr; for (auto iter : desc.shaders) { + iter->AddRef(); + D3D11ShaderModule *module = (D3D11ShaderModule *)iter; shaders.push_back(module); switch (module->GetStage()) { @@ -998,6 +1006,7 @@ Pipeline *D3D11DrawContext::CreateGraphicsPipeline(const PipelineDesc &desc) { break; } } + dPipeline->shaderModules = shaders; if (!vshader) { // No vertex shader - no graphics @@ -1006,11 +1015,15 @@ Pipeline *D3D11DrawContext::CreateGraphicsPipeline(const PipelineDesc &desc) { } // Can finally create the input layout - auto &inputDesc = dPipeline->input->desc; - const std::vector &elements = dPipeline->input->elements; - HRESULT hr = device_->CreateInputLayout(elements.data(), (UINT)elements.size(), vshader->byteCode_.data(), vshader->byteCode_.size(), &dPipeline->il); - if (!SUCCEEDED(hr)) { - Crash(); + if (dPipeline->input) { + auto &inputDesc = dPipeline->input->desc; + const std::vector &elements = dPipeline->input->elements; + HRESULT hr = device_->CreateInputLayout(elements.data(), (UINT)elements.size(), vshader->byteCode_.data(), vshader->byteCode_.size(), &dPipeline->il); + if (!SUCCEEDED(hr)) { + Crash(); + } + } else { + dPipeline->il = nullptr; } return dPipeline; } @@ -1081,8 +1094,10 @@ void D3D11DrawContext::ApplyCurrentState() { curTopology_ = curPipeline_->topology; } - int numVBs = (int)curPipeline_->input->strides.size(); - context_->IASetVertexBuffers(0, 1, nextVertexBuffers_, (UINT *)curPipeline_->input->strides.data(), (UINT *)nextVertexBufferOffsets_); + if (curPipeline_->input) { + int numVBs = (int)curPipeline_->input->strides.size(); + context_->IASetVertexBuffers(0, numVBs, nextVertexBuffers_, (UINT *)curPipeline_->input->strides.data(), (UINT *)nextVertexBufferOffsets_); + } if (dirtyIndexBuffer_) { context_->IASetIndexBuffer(nextIndexBuffer_, DXGI_FORMAT_R16_UINT, nextIndexBufferOffset_); dirtyIndexBuffer_ = false; diff --git a/Common/GPU/ShaderWriter.cpp b/Common/GPU/ShaderWriter.cpp index 866b879e0d..2e05c56f79 100644 --- a/Common/GPU/ShaderWriter.cpp +++ b/Common/GPU/ShaderWriter.cpp @@ -141,10 +141,10 @@ void ShaderWriter::BeginVSMain(Slice inputs, Slice uniform case HLSL_D3D9: { C("struct VS_OUTPUT {\n"); - C(" vec4 pos : POSITION;\n"); for (auto &varying : varyings) { F(" %s %s : %s;\n", varying.type, varying.name, varying.semantic); } + F(" vec4 pos : %s;\n", lang_.shaderLanguage == HLSL_D3D11 ? "SV_Position" : "POSITION"); C("};\n"); C("VS_OUTPUT main( "); // 2 spaces for the D3D9 rewind @@ -268,7 +268,8 @@ void ShaderWriter::DeclareTexture2D(const char *name, int binding) { case HLSL_D3D9: break; case GLSL_VULKAN: - F("layout(set = 0, binding = %d) uniform sampler2D %s;\n", binding, name); + // In the thin3d descriptor set layout, textures start at 1 in set 0. Hence the +1. + F("layout(set = 0, binding = %d) uniform sampler2D %s;\n", binding + 1, name); break; default: F("uniform sampler2D %s;\n", name); diff --git a/Common/GPU/Vulkan/thin3d_vulkan.cpp b/Common/GPU/Vulkan/thin3d_vulkan.cpp index e59f88d42c..4fc2890230 100644 --- a/Common/GPU/Vulkan/thin3d_vulkan.cpp +++ b/Common/GPU/Vulkan/thin3d_vulkan.cpp @@ -1030,8 +1030,12 @@ Pipeline *VKContext::CreateGraphicsPipeline(const PipelineDesc &desc) { VKPipeline *pipeline = new VKPipeline(vulkan_, desc.uniformDesc ? desc.uniformDesc->uniformBufferSize : 16 * sizeof(float), (PipelineFlags)pipelineFlags); - for (int i = 0; i < (int)input->bindings.size(); i++) { - pipeline->stride[i] = input->bindings[i].stride; + if (input) { + for (int i = 0; i < (int)input->bindings.size(); i++) { + pipeline->stride[i] = input->bindings[i].stride; + } + } else { + pipeline->stride[0] = 0; } std::vector stages; @@ -1076,6 +1080,8 @@ Pipeline *VKContext::CreateGraphicsPipeline(const PipelineDesc &desc) { VkPipelineRasterizationStateCreateInfo rs{ VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO }; raster->ToVulkan(&rs); + VkPipelineVertexInputStateCreateInfo emptyVisc{ VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO }; + VkGraphicsPipelineCreateInfo createInfo[2]{}; for (auto &info : createInfo) { info.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO; @@ -1088,7 +1094,7 @@ Pipeline *VKContext::CreateGraphicsPipeline(const PipelineDesc &desc) { info.pInputAssemblyState = &inputAssembly; info.pTessellationState = nullptr; info.pMultisampleState = &ms; - info.pVertexInputState = &input->visc; + info.pVertexInputState = input ? &input->visc : &emptyVisc; info.pRasterizationState = &rs; info.pViewportState = &vs; // Must set viewport and scissor counts even if we set the actual state dynamically. info.layout = pipelineLayout_; diff --git a/GPU/Common/FramebufferManagerCommon.cpp b/GPU/Common/FramebufferManagerCommon.cpp index 56a3585124..7ad9135e57 100644 --- a/GPU/Common/FramebufferManagerCommon.cpp +++ b/GPU/Common/FramebufferManagerCommon.cpp @@ -531,13 +531,15 @@ void FramebufferManagerCommon::ReformatFramebufferFrom(VirtualFramebuffer *vfb, return; } + char *vsCode = nullptr; + char *fsCode = nullptr; + if (!reinterpretVS_) { - char *buffer = new char[4000]; + vsCode = new char[4000]; const ShaderLanguageDesc &shaderLanguageDesc = draw_->GetShaderLanguageDesc(); - GenerateReinterpretVertexShader(buffer, shaderLanguageDesc); - reinterpretVS_ = draw_->CreateShaderModule(ShaderStage::Vertex, shaderLanguageDesc.shaderLanguage, (const uint8_t *)buffer, strlen(buffer), "reinterpret_vs"); + GenerateReinterpretVertexShader(vsCode, shaderLanguageDesc); + reinterpretVS_ = draw_->CreateShaderModule(ShaderStage::Vertex, shaderLanguageDesc.shaderLanguage, (const uint8_t *)vsCode, strlen(vsCode), "reinterpret_vs"); _assert_(reinterpretVS_); - delete[] buffer; } if (!reinterpretSampler_) { @@ -551,12 +553,11 @@ void FramebufferManagerCommon::ReformatFramebufferFrom(VirtualFramebuffer *vfb, Draw::Pipeline *pipeline = reinterpretFromTo_[(int)oldFormat][(int)newFormat]; if (!pipeline) { - char *buffer = new char[4000]; + fsCode = new char[4000]; const ShaderLanguageDesc &shaderLanguageDesc = draw_->GetShaderLanguageDesc(); - GenerateReinterpretFragmentShader(buffer, oldFormat, newFormat, shaderLanguageDesc); - Draw::ShaderModule *reinterpretFS = draw_->CreateShaderModule(ShaderStage::Fragment, shaderLanguageDesc.shaderLanguage, (const uint8_t *)buffer, strlen(buffer), "reinterpret_fs"); + GenerateReinterpretFragmentShader(fsCode, oldFormat, newFormat, shaderLanguageDesc); + Draw::ShaderModule *reinterpretFS = draw_->CreateShaderModule(ShaderStage::Fragment, shaderLanguageDesc.shaderLanguage, (const uint8_t *)fsCode, strlen(fsCode), "reinterpret_fs"); _assert_(reinterpretFS); - delete[] buffer; std::vector shaders; shaders.push_back(reinterpretVS_); @@ -597,10 +598,17 @@ void FramebufferManagerCommon::ReformatFramebufferFrom(VirtualFramebuffer *vfb, draw_->Draw(3, 0); draw_->InvalidateCachedState(); + // Unbind. + draw_->BindTexture(0, nullptr); + RebindFramebuffer("RebindFramebuffer - After reinterpret"); + shaderManager_->DirtyLastShader(); textureCache_->ForgetLastTexture(); gstate_c.Dirty(DIRTY_BLEND_STATE | DIRTY_DEPTHSTENCIL_STATE | DIRTY_RASTER_STATE | DIRTY_VIEWPORTSCISSOR_STATE | DIRTY_VERTEXSHADER_STATE); + + delete[] vsCode; + delete[] fsCode; } void FramebufferManagerCommon::NotifyRenderFramebufferSwitched(VirtualFramebuffer *prevVfb, VirtualFramebuffer *vfb, bool isClearingDepth) { diff --git a/GPU/Common/ShaderId.h b/GPU/Common/ShaderId.h index 1c8c5f93d4..f28dd588ba 100644 --- a/GPU/Common/ShaderId.h +++ b/GPU/Common/ShaderId.h @@ -82,9 +82,9 @@ enum FShaderBit : uint8_t { FS_BIT_DO_TEXTURE_PROJ = 22, FS_BIT_COLOR_DOUBLE = 23, FS_BIT_STENCIL_TO_ALPHA = 24, // 2 bits - FS_BIT_REPLACE_ALPHA_WITH_STENCIL_TYPE = 26, // 4 bits + FS_BIT_REPLACE_ALPHA_WITH_STENCIL_TYPE = 26, // 4 bits (ReplaceAlphaType) FS_BIT_REPLACE_LOGIC_OP_TYPE = 30, // 2 bits - FS_BIT_REPLACE_BLEND = 32, // 3 bits + FS_BIT_REPLACE_BLEND = 32, // 3 bits (ReplaceBlendType) FS_BIT_BLENDEQ = 35, // 3 bits FS_BIT_BLENDFUNC_A = 38, // 4 bits FS_BIT_BLENDFUNC_B = 42, // 4 bits @@ -92,7 +92,6 @@ enum FShaderBit : uint8_t { FS_BIT_BGRA_TEXTURE = 47, FS_BIT_TEST_DISCARD_TO_ZERO = 48, FS_BIT_NO_DEPTH_CANNOT_DISCARD_STENCIL = 49, - // 50+ are free. }; static inline FShaderBit operator +(FShaderBit bit, int i) { From 28f8578408f01c010377c4bf210ead11a449844a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Sat, 7 Nov 2020 11:20:22 +0100 Subject: [PATCH 218/275] Cleanup reinterpret shader resources in FramebufferManagerCommon::DeviceLost(). --- GPU/Common/FramebufferManagerCommon.cpp | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/GPU/Common/FramebufferManagerCommon.cpp b/GPU/Common/FramebufferManagerCommon.cpp index 7ad9135e57..822a9004d2 100644 --- a/GPU/Common/FramebufferManagerCommon.cpp +++ b/GPU/Common/FramebufferManagerCommon.cpp @@ -2244,6 +2244,16 @@ std::vector FramebufferManagerCommon::GetFramebufferList() { void FramebufferManagerCommon::DeviceLost() { DestroyAllFBOs(); + for (int i = 0; i < 3; i++) { + for (int j = 0; j < 3; j++) { + if (reinterpretFromTo_[i][j]) { + reinterpretFromTo_[i][j]->Release(); + reinterpretFromTo_[i][j] = nullptr; + } + } + } + reinterpretSampler_->Release(); + reinterpretVS_->Release(); presentation_->DeviceLost(); draw_ = nullptr; } From 4e16fcaf1a3594825b383d095773ad4c849e7153 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Sat, 7 Nov 2020 11:53:48 +0100 Subject: [PATCH 219/275] Fix reinterpret shader for D3D11 --- Common/GPU/Shader.cpp | 1 + Common/GPU/Shader.h | 1 + GPU/Common/ReinterpretFramebuffer.cpp | 1 + 3 files changed, 3 insertions(+) diff --git a/Common/GPU/Shader.cpp b/Common/GPU/Shader.cpp index b199f0a227..9eea402f67 100644 --- a/Common/GPU/Shader.cpp +++ b/Common/GPU/Shader.cpp @@ -74,6 +74,7 @@ void ShaderLanguageDesc::Init(ShaderLanguage lang) { forceMatrix4x4 = false; coefsFromBuffers = true; vsOutPrefix = "Out."; + viewportYSign = "-"; break; } } diff --git a/Common/GPU/Shader.h b/Common/GPU/Shader.h index 69fa5c9d65..07f678e0a5 100644 --- a/Common/GPU/Shader.h +++ b/Common/GPU/Shader.h @@ -45,6 +45,7 @@ struct ShaderLanguageDesc { const char *lastFragData = nullptr; const char *framebufferFetchExtension = nullptr; const char *vsOutPrefix = ""; + const char *viewportYSign = ""; bool glslES30 = false; bool bitwiseOps = false; bool forceMatrix4x4 = false; diff --git a/GPU/Common/ReinterpretFramebuffer.cpp b/GPU/Common/ReinterpretFramebuffer.cpp index f915d99c79..2fff2bb5f7 100644 --- a/GPU/Common/ReinterpretFramebuffer.cpp +++ b/GPU/Common/ReinterpretFramebuffer.cpp @@ -75,6 +75,7 @@ bool GenerateReinterpretVertexShader(char *buffer, const ShaderLanguageDesc &lan writer.C(" float x = -1.0 + float((gl_VertexIndex & 1) << 2);\n"); writer.C(" float y = -1.0 + float((gl_VertexIndex & 2) << 1);\n"); writer.C(" v_texcoord = (vec2(x, y) + vec2(1.0, 1.0)) * 0.5;\n"); + writer.F(" y *= %s1.0;\n", lang.viewportYSign); writer.C(" gl_Position = vec4(x, y, 0.0, 1.0);\n"); writer.EndVSMain(varyings); From 910524990183843c6be7d9b9de0c9278ae7e8173 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Sat, 7 Nov 2020 23:20:34 +0100 Subject: [PATCH 220/275] Add compat flag for reinterpret shader, also disable on platforms that can't support it yet --- Common/GPU/Shader.cpp | 2 +- Common/GPU/Shader.h | 2 +- Core/Compatibility.cpp | 1 + Core/Compatibility.h | 1 + GPU/Common/FramebufferManagerCommon.cpp | 28 ++++++++++++++++++++----- GPU/Common/FramebufferManagerCommon.h | 2 +- GPU/Common/TextureCacheCommon.cpp | 2 +- GPU/D3D11/TextureCacheD3D11.cpp | 5 ++--- assets/compat.ini | 8 +++++++ 9 files changed, 39 insertions(+), 12 deletions(-) diff --git a/Common/GPU/Shader.cpp b/Common/GPU/Shader.cpp index 9eea402f67..43943449cc 100644 --- a/Common/GPU/Shader.cpp +++ b/Common/GPU/Shader.cpp @@ -66,7 +66,7 @@ void ShaderLanguageDesc::Init(ShaderLanguage lang) { bitwiseOps = lang == HLSL_D3D11; framebufferFetchExtension = nullptr; gles = false; - glslES30 = true; + glslES30 = true; // Hm, D3D9 too? glslVersionNumber = 0; lastFragData = nullptr; texture = "texture"; diff --git a/Common/GPU/Shader.h b/Common/GPU/Shader.h index 07f678e0a5..8a863f3c7f 100644 --- a/Common/GPU/Shader.h +++ b/Common/GPU/Shader.h @@ -46,7 +46,7 @@ struct ShaderLanguageDesc { const char *framebufferFetchExtension = nullptr; const char *vsOutPrefix = ""; const char *viewportYSign = ""; - bool glslES30 = false; + bool glslES30 = false; // really glslES30Features. TODO: Clean this up. bool bitwiseOps = false; bool forceMatrix4x4 = false; bool coefsFromBuffers = false; diff --git a/Core/Compatibility.cpp b/Core/Compatibility.cpp index a965f1b062..10b2c42896 100644 --- a/Core/Compatibility.cpp +++ b/Core/Compatibility.cpp @@ -74,6 +74,7 @@ void Compatibility::CheckSettings(IniFile &iniFile, const std::string &gameID) { CheckSetting(iniFile, gameID, "ReportSmallMemstick", &flags_.ReportSmallMemstick); CheckSetting(iniFile, gameID, "MemstickFixedFree", &flags_.MemstickFixedFree); CheckSetting(iniFile, gameID, "DateLimited", &flags_.DateLimited); + CheckSetting(iniFile, gameID, "ReinterpretFramebuffers", &flags_.ReinterpretFramebuffers); } void Compatibility::CheckSetting(IniFile &iniFile, const std::string &gameID, const char *option, bool *flag) { diff --git a/Core/Compatibility.h b/Core/Compatibility.h index 1d5dfa6372..e390e28f42 100644 --- a/Core/Compatibility.h +++ b/Core/Compatibility.h @@ -72,6 +72,7 @@ struct CompatFlags { bool ReportSmallMemstick; bool MemstickFixedFree; bool DateLimited; + bool ReinterpretFramebuffers; }; class IniFile; diff --git a/GPU/Common/FramebufferManagerCommon.cpp b/GPU/Common/FramebufferManagerCommon.cpp index 822a9004d2..2a6445e6f1 100644 --- a/GPU/Common/FramebufferManagerCommon.cpp +++ b/GPU/Common/FramebufferManagerCommon.cpp @@ -503,7 +503,7 @@ void FramebufferManagerCommon::NotifyRenderFramebufferUpdated(VirtualFramebuffer if (vfbFormatChanged) { textureCache_->NotifyFramebuffer(vfb, NOTIFY_FB_UPDATED); if (vfb->drawnFormat != vfb->format) { - ReformatFramebufferFrom(vfb, vfb->drawnFormat); + ReinterpretFramebufferFrom(vfb, vfb->drawnFormat); } } @@ -517,10 +517,28 @@ void FramebufferManagerCommon::NotifyRenderFramebufferUpdated(VirtualFramebuffer } } -void FramebufferManagerCommon::ReformatFramebufferFrom(VirtualFramebuffer *vfb, GEBufferFormat oldFormat) { +void FramebufferManagerCommon::ReinterpretFramebufferFrom(VirtualFramebuffer *vfb, GEBufferFormat oldFormat) { if (!useBufferedRendering_ || !vfb->fbo) { return; } + + ShaderLanguage lang = draw_->GetShaderLanguageDesc().shaderLanguage; + + bool doReinterpret = PSP_CoreParameter().compat.flags().ReinterpretFramebuffers && + (lang == HLSL_D3D11 || lang == GLSL_VULKAN || lang == GLSL_3xx); + if (!doReinterpret) { + // Fake reinterpret - just clear the way we always did on Vulkan. Just clear color and stencil. + if (oldFormat == GE_FORMAT_565) { + // We have to bind here instead of clear, since it can be that no framebuffer is bound. + // The backend can sometimes directly optimize it to a clear. + draw_->BindFramebufferAsRenderTarget(vfb->fbo, { Draw::RPAction::CLEAR, Draw::RPAction::KEEP, Draw::RPAction::CLEAR }, "FakeReinterpret"); + // Need to dirty anything that has command buffer dynamic state, in case we started a new pass above. + // Should find a way to feed that information back, maybe... Or simply correct the issue in the rendermanager. + gstate_c.Dirty(DIRTY_DEPTHSTENCIL_STATE | DIRTY_VIEWPORTSCISSOR_STATE | DIRTY_BLEND_STATE); + } + return; + } + GEBufferFormat newFormat = vfb->format; _assert_(newFormat != oldFormat); @@ -595,12 +613,13 @@ void FramebufferManagerCommon::ReformatFramebufferFrom(VirtualFramebuffer *vfb, draw_->SetScissorRect(0, 0, vfb->renderWidth, vfb->renderHeight); Draw::Viewport vp = Draw::Viewport{ 0.0f, 0.0f, (float)vfb->renderWidth, (float)vfb->renderHeight, 0.0f, 1.0f }; draw_->SetViewports(1, &vp); + // No vertex buffer - generate vertices in shader. TODO: Switch to a vertex buffer for GLES2/D3D9 compat. draw_->Draw(3, 0); draw_->InvalidateCachedState(); // Unbind. draw_->BindTexture(0, nullptr); - RebindFramebuffer("RebindFramebuffer - After reinterpret"); + RebindFramebuffer("After reinterpret"); shaderManager_->DirtyLastShader(); textureCache_->ForgetLastTexture(); @@ -639,8 +658,7 @@ void FramebufferManagerCommon::NotifyRenderFramebufferSwitched(VirtualFramebuffe } } if (vfb->drawnFormat != vfb->format) { - // TODO: Might ultimately combine this with the resize step in DoSetRenderFrameBuffer(). - ReformatFramebufferFrom(vfb, vfb->drawnFormat); + ReinterpretFramebufferFrom(vfb, vfb->drawnFormat); } if (useBufferedRendering_) { diff --git a/GPU/Common/FramebufferManagerCommon.h b/GPU/Common/FramebufferManagerCommon.h index 9f35afce11..04422c7970 100644 --- a/GPU/Common/FramebufferManagerCommon.h +++ b/GPU/Common/FramebufferManagerCommon.h @@ -322,7 +322,7 @@ public: const std::vector &Framebuffers() { return vfbs_; } - void ReformatFramebufferFrom(VirtualFramebuffer *vfb, GEBufferFormat old); + void ReinterpretFramebufferFrom(VirtualFramebuffer *vfb, GEBufferFormat old); protected: virtual void PackFramebufferSync_(VirtualFramebuffer *vfb, int x, int y, int w, int h); diff --git a/GPU/Common/TextureCacheCommon.cpp b/GPU/Common/TextureCacheCommon.cpp index 31189408ae..dd67d94ab1 100644 --- a/GPU/Common/TextureCacheCommon.cpp +++ b/GPU/Common/TextureCacheCommon.cpp @@ -957,7 +957,7 @@ void TextureCacheCommon::SetTextureFramebuffer(const AttachCandidate &candidate) // TODO: Kinda ugly, maybe switch direction of the call? GEBufferFormat oldFormat = candidate.fb->format; candidate.fb->format = candidate.match.reinterpretTo; - framebufferManager_->ReformatFramebufferFrom(candidate.fb, oldFormat); + framebufferManager_->ReinterpretFramebufferFrom(candidate.fb, oldFormat); } _dbg_assert_msg_(framebuffer != nullptr, "Framebuffer must not be null."); diff --git a/GPU/D3D11/TextureCacheD3D11.cpp b/GPU/D3D11/TextureCacheD3D11.cpp index b315d27a83..044f5113c3 100644 --- a/GPU/D3D11/TextureCacheD3D11.cpp +++ b/GPU/D3D11/TextureCacheD3D11.cpp @@ -421,10 +421,9 @@ void TextureCacheD3D11::ApplyTextureFramebuffer(VirtualFramebuffer *framebuffer, TexCacheEntry::TexStatus alphaStatus = CheckAlpha(clutBuf_, GetClutDestFormatD3D11(clutFormat), clutTotalColors, clutTotalColors, 1); gstate_c.SetTextureFullAlpha(alphaStatus == TexCacheEntry::STATUS_ALPHA_FULL); } else { - framebufferManagerD3D11_->BindFramebufferAsColorTexture(0, framebuffer, BINDFBCOLOR_MAY_COPY_WITH_UV | BINDFBCOLOR_APPLY_TEX_OFFSET); - gstate_c.SetTextureFullAlpha(gstate.getTextureFormat() == GE_TFMT_5650); - framebufferManagerD3D11_->RebindFramebuffer("RebindFramebuffer - ApplyTextureFramebuffer"); // Probably not necessary. + framebufferManagerD3D11_->RebindFramebuffer("RebindFramebuffer - ApplyTextureFramebuffer"); + framebufferManagerD3D11_->BindFramebufferAsColorTexture(0, framebuffer, BINDFBCOLOR_MAY_COPY_WITH_UV | BINDFBCOLOR_APPLY_TEX_OFFSET); } SamplerCacheKey samplerKey = GetFramebufferSamplingParams(framebuffer->bufferWidth, framebuffer->bufferHeight); diff --git a/assets/compat.ini b/assets/compat.ini index 1bda7f4fac..6cd40f5bc3 100644 --- a/assets/compat.ini +++ b/assets/compat.ini @@ -794,3 +794,11 @@ ULUS10455 = true # Car Jack Streets - issue #12698 NPUZ00043 = true NPEZ00198 = true + +# This setting will go away in the near future, hopefully we can enable it +# for all games. +[ReinterpretFramebuffers] +# Outrun - issue #11358 +ULES00262 = true +ULUS10064 = true +ULKS46087 = true From d81522af11b9c91bf559e63595a5214cbac410db Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Sun, 8 Nov 2020 10:26:27 +0100 Subject: [PATCH 221/275] Address feedback. --- GPU/Common/ReinterpretFramebuffer.cpp | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/GPU/Common/ReinterpretFramebuffer.cpp b/GPU/Common/ReinterpretFramebuffer.cpp index 2fff2bb5f7..8c824a9b44 100644 --- a/GPU/Common/ReinterpretFramebuffer.cpp +++ b/GPU/Common/ReinterpretFramebuffer.cpp @@ -8,8 +8,9 @@ static const VaryingDef varyings[1] = { { "vec2", "v_texcoord", "TEXCOORD0" }, }; -// TODO: We could have an option to preserve any extra color precision. But gonna start without it. -// Requires full size integer math. +// TODO: We could possibly have an option to preserve any extra color precision? But gonna start without it. +// Requires full size integer math. It would be possible to make a floating point-only version with lots of +// modulo and stuff, might do it one day. bool GenerateReinterpretFragmentShader(char *buffer, GEBufferFormat from, GEBufferFormat to, const ShaderLanguageDesc &lang) { if (!lang.bitwiseOps) { return false; @@ -30,7 +31,7 @@ bool GenerateReinterpretFragmentShader(char *buffer, GEBufferFormat from, GEBuff break; case GE_FORMAT_5551: writer.C(" uint color = uint(val.r * 31.99) | (uint(val.g * 31.99) << 5) | (uint(val.b * 31.99) << 10);\n"); - writer.C(" if (val.a > 128.0) color |= 0x8000U;\n"); + writer.C(" if (val.a >= 0.5) color |= 0x8000U;\n"); break; case GE_FORMAT_565: writer.C(" uint color = uint(val.r * 31.99) | (uint(val.g * 63.99) << 5) | (uint(val.b * 31.99) << 11);\n"); From 2aa9ee97f4037bb50c684f6cdf38036099ef91f3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Sun, 8 Nov 2020 12:31:43 +0100 Subject: [PATCH 222/275] Simplify shader blend logic in FragmentShaderGenerator.cpp --- GPU/Common/FragmentShaderGenerator.cpp | 35 +++++++++++++------------- 1 file changed, 18 insertions(+), 17 deletions(-) diff --git a/GPU/Common/FragmentShaderGenerator.cpp b/GPU/Common/FragmentShaderGenerator.cpp index 7ea4e990e0..e38cba0b9f 100644 --- a/GPU/Common/FragmentShaderGenerator.cpp +++ b/GPU/Common/FragmentShaderGenerator.cpp @@ -104,6 +104,8 @@ bool GenerateFragmentShader(const FShaderID &id, char *buffer, const ShaderLangu bool earlyFragmentTests = ((!enableAlphaTest && !enableColorTest) || testForceToZero) && !gstate_c.Supports(GPU_ROUND_FRAGMENT_DEPTH_TO_16BIT); bool useAdrenoBugWorkaround = id.Bit(FS_BIT_NO_DEPTH_CANNOT_DISCARD_STENCIL); + bool readFramebufferTex = replaceBlend == REPLACE_BLEND_COPY_FBO && !gstate_c.Supports(GPU_SUPPORTS_ANY_FRAMEBUFFER_FETCH); + if (compat.shaderLanguage == ShaderLanguage::GLSL_VULKAN) { if (earlyFragmentTests) { WRITE(p, "layout (early_fragment_tests) in;\n"); @@ -116,10 +118,8 @@ bool GenerateFragmentShader(const FShaderID &id, char *buffer, const ShaderLangu WRITE(p, "layout (binding = 0) uniform sampler2D tex;\n"); } - if (!isModeClear && replaceBlend > REPLACE_BLEND_STANDARD) { - if (replaceBlend == REPLACE_BLEND_COPY_FBO) { - WRITE(p, "layout (binding = 1) uniform sampler2D fbotex;\n"); - } + if (readFramebufferTex) { + WRITE(p, "layout (binding = 1) uniform sampler2D fbotex;\n"); } if (shaderDepal) { @@ -151,11 +151,13 @@ bool GenerateFragmentShader(const FShaderID &id, char *buffer, const ShaderLangu if (compat.shaderLanguage == HLSL_D3D9) { if (doTexture) WRITE(p, "sampler tex : register(s0);\n"); - if (!isModeClear && replaceBlend > REPLACE_BLEND_STANDARD) { - if (replaceBlend == REPLACE_BLEND_COPY_FBO) { - WRITE(p, "vec2 u_fbotexSize : register(c%i);\n", CONST_PS_FBOTEXSIZE); - WRITE(p, "sampler fbotex : register(s1);\n"); - } + + if (readFramebufferTex) { + WRITE(p, "vec2 u_fbotexSize : register(c%i);\n", CONST_PS_FBOTEXSIZE); + WRITE(p, "sampler fbotex : register(s1);\n"); + } + + if (replaceBlend > REPLACE_BLEND_STANDARD) { if (replaceBlendFuncA >= GE_SRCBLEND_FIXA) { WRITE(p, "float3 u_blendFixA : register(c%i);\n", CONST_PS_BLENDFIXA); } @@ -244,11 +246,11 @@ bool GenerateFragmentShader(const FShaderID &id, char *buffer, const ShaderLangu } else if (compat.shaderLanguage == HLSL_D3D9) { if (doTexture) WRITE(p, "sampler tex : register(s0);\n"); - if (!isModeClear && replaceBlend > REPLACE_BLEND_STANDARD) { - if (replaceBlend == REPLACE_BLEND_COPY_FBO) { - WRITE(p, "vec2 u_fbotexSize : register(c%i);\n", CONST_PS_FBOTEXSIZE); - WRITE(p, "sampler fbotex : register(s1);\n"); - } + if (readFramebufferTex) { + WRITE(p, "vec2 u_fbotexSize : register(c%i);\n", CONST_PS_FBOTEXSIZE); + WRITE(p, "sampler fbotex : register(s1);\n"); + } + if (replaceBlend > REPLACE_BLEND_STANDARD) { if (replaceBlendFuncA >= GE_SRCBLEND_FIXA) { WRITE(p, "float3 u_blendFixA : register(c%i);\n", CONST_PS_BLENDFIXA); } @@ -276,7 +278,6 @@ bool GenerateFragmentShader(const FShaderID &id, char *buffer, const ShaderLangu if (enableFog) { WRITE(p, "float3 u_fogcolor : register(c%i);\n", CONST_PS_FOGCOLOR); } - } else if (ShaderLanguageIsOpenGL(compat.shaderLanguage)) { if (shaderDepal && gl_extensions.IsGLES) { WRITE(p, "precision highp int;\n"); @@ -287,7 +288,7 @@ bool GenerateFragmentShader(const FShaderID &id, char *buffer, const ShaderLangu if (!isModeClear && replaceBlend > REPLACE_BLEND_STANDARD) { *uniformMask |= DIRTY_SHADERBLEND; - if (!gstate_c.Supports(GPU_SUPPORTS_ANY_FRAMEBUFFER_FETCH) && replaceBlend == REPLACE_BLEND_COPY_FBO) { + if (readFramebufferTex) { if (!compat.texelFetch) { WRITE(p, "uniform vec2 u_fbotexSize;\n"); } @@ -869,7 +870,7 @@ bool GenerateFragmentShader(const FShaderID &id, char *buffer, const ShaderLangu } if (replaceBlend == REPLACE_BLEND_2X_ALPHA || replaceBlend == REPLACE_BLEND_PRE_SRC_2X_ALPHA) { - WRITE(p, " v.a = v.a * 2.0;\n"); + WRITE(p, " v.a *= 2.0;\n"); } } From 3d289594f95a6a2388a1bd6fef19916f9170a106 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Sun, 8 Nov 2020 12:49:06 +0100 Subject: [PATCH 223/275] ShaderBlend and FramebufferRead are separate concepts. Reflect that in naming. The former has forms that don't need to read the framebuffer. This exposes that some logic is wrong... --- GPU/Common/GPUStateUtils.cpp | 54 +++++++++++++++---------------- GPU/Common/GPUStateUtils.h | 6 ++-- GPU/Common/ShaderId.cpp | 2 +- GPU/D3D11/DrawEngineD3D11.h | 2 +- GPU/D3D11/StateMappingD3D11.cpp | 18 +++++------ GPU/Directx9/StateMappingDX9.cpp | 14 ++++---- GPU/GLES/StateMappingGLES.cpp | 13 ++++---- GPU/GPUState.h | 8 ++--- GPU/Vulkan/StateMappingVulkan.cpp | 12 +++---- 9 files changed, 65 insertions(+), 64 deletions(-) diff --git a/GPU/Common/GPUStateUtils.cpp b/GPU/Common/GPUStateUtils.cpp index 8ccf5b2764..a555faa90d 100644 --- a/GPU/Common/GPUStateUtils.cpp +++ b/GPU/Common/GPUStateUtils.cpp @@ -253,7 +253,7 @@ StencilValueType ReplaceAlphaWithStencilType() { return STENCIL_VALUE_KEEP; } -ReplaceBlendType ReplaceBlendWithShader(bool allowShaderBlend, GEBufferFormat bufferFormat) { +ReplaceBlendType ReplaceBlendWithShader(bool allowFramebufferRead, GEBufferFormat bufferFormat) { if (!gstate.isAlphaBlendEnabled() || gstate.isModeClear()) { return REPLACE_BLEND_NO; } @@ -262,14 +262,14 @@ ReplaceBlendType ReplaceBlendWithShader(bool allowShaderBlend, GEBufferFormat bu // Let's get the non-factor modes out of the way first. switch (eq) { case GE_BLENDMODE_ABSDIFF: - return !allowShaderBlend ? REPLACE_BLEND_STANDARD : REPLACE_BLEND_COPY_FBO; + return !allowFramebufferRead ? REPLACE_BLEND_STANDARD : REPLACE_BLEND_COPY_FBO; case GE_BLENDMODE_MIN: case GE_BLENDMODE_MAX: if (gstate_c.Supports(GPU_SUPPORTS_BLEND_MINMAX)) { return REPLACE_BLEND_STANDARD; } else { - return !allowShaderBlend ? REPLACE_BLEND_STANDARD : REPLACE_BLEND_COPY_FBO; + return !allowFramebufferRead ? REPLACE_BLEND_STANDARD : REPLACE_BLEND_COPY_FBO; } default: @@ -292,19 +292,19 @@ ReplaceBlendType ReplaceBlendWithShader(bool allowShaderBlend, GEBufferFormat bu return REPLACE_BLEND_2X_ALPHA; // Can't double, we need the source color to be correct. // Doubling only alpha would clamp the src alpha incorrectly. - return !allowShaderBlend ? REPLACE_BLEND_2X_ALPHA : REPLACE_BLEND_COPY_FBO; + return !allowFramebufferRead ? REPLACE_BLEND_2X_ALPHA : REPLACE_BLEND_COPY_FBO; case GE_DSTBLEND_DOUBLEDSTALPHA: case GE_DSTBLEND_DOUBLEINVDSTALPHA: if (bufferFormat == GE_FORMAT_565) return REPLACE_BLEND_2X_ALPHA; - return !allowShaderBlend ? REPLACE_BLEND_2X_ALPHA : REPLACE_BLEND_COPY_FBO; + return !allowFramebufferRead ? REPLACE_BLEND_2X_ALPHA : REPLACE_BLEND_COPY_FBO; case GE_DSTBLEND_DOUBLESRCALPHA: // We can't technically do this correctly (due to clamping) without reading the dst color. // Using a copy isn't accurate either, though, when there's overlap. if (gstate_c.Supports(GPU_SUPPORTS_ANY_FRAMEBUFFER_FETCH)) - return !allowShaderBlend ? REPLACE_BLEND_PRE_SRC_2X_ALPHA : REPLACE_BLEND_COPY_FBO; + return !allowFramebufferRead ? REPLACE_BLEND_PRE_SRC_2X_ALPHA : REPLACE_BLEND_COPY_FBO; return REPLACE_BLEND_PRE_SRC_2X_ALPHA; case GE_DSTBLEND_DOUBLEINVSRCALPHA: @@ -331,7 +331,7 @@ ReplaceBlendType ReplaceBlendWithShader(bool allowShaderBlend, GEBufferFormat bu return REPLACE_BLEND_STANDARD; } // Can't double, we need the source color to be correct. - return !allowShaderBlend ? REPLACE_BLEND_STANDARD : REPLACE_BLEND_COPY_FBO; + return !allowFramebufferRead ? REPLACE_BLEND_STANDARD : REPLACE_BLEND_COPY_FBO; case GE_DSTBLEND_DOUBLEDSTALPHA: case GE_DSTBLEND_DOUBLEINVDSTALPHA: @@ -340,7 +340,7 @@ ReplaceBlendType ReplaceBlendWithShader(bool allowShaderBlend, GEBufferFormat bu // Doubling will have no effect here. return REPLACE_BLEND_STANDARD; } - return !allowShaderBlend ? REPLACE_BLEND_2X_SRC : REPLACE_BLEND_COPY_FBO; + return !allowFramebufferRead ? REPLACE_BLEND_2X_SRC : REPLACE_BLEND_COPY_FBO; case GE_DSTBLEND_DOUBLESRCALPHA: case GE_DSTBLEND_DOUBLEINVSRCALPHA: @@ -349,7 +349,7 @@ ReplaceBlendType ReplaceBlendWithShader(bool allowShaderBlend, GEBufferFormat bu } // Double both src (for dst alpha) and alpha (for dst factor.) // But to be accurate (clamping), we need to read the dst color. - return !allowShaderBlend ? REPLACE_BLEND_PRE_SRC_2X_ALPHA : REPLACE_BLEND_COPY_FBO; + return !allowFramebufferRead ? REPLACE_BLEND_PRE_SRC_2X_ALPHA : REPLACE_BLEND_COPY_FBO; case GE_DSTBLEND_SRCALPHA: case GE_DSTBLEND_INVSRCALPHA: @@ -361,7 +361,7 @@ ReplaceBlendType ReplaceBlendWithShader(bool allowShaderBlend, GEBufferFormat bu return REPLACE_BLEND_STANDARD; } // We can't technically do this correctly (due to clamping) without reading the dst alpha. - return !allowShaderBlend ? REPLACE_BLEND_2X_SRC : REPLACE_BLEND_COPY_FBO; + return !allowFramebufferRead ? REPLACE_BLEND_2X_SRC : REPLACE_BLEND_COPY_FBO; } case GE_SRCBLEND_DOUBLEINVDSTALPHA: @@ -375,14 +375,14 @@ ReplaceBlendType ReplaceBlendWithShader(bool allowShaderBlend, GEBufferFormat bu if (bufferFormat == GE_FORMAT_565) { return REPLACE_BLEND_STANDARD; } - return !allowShaderBlend ? REPLACE_BLEND_STANDARD : REPLACE_BLEND_COPY_FBO; + return !allowFramebufferRead ? REPLACE_BLEND_STANDARD : REPLACE_BLEND_COPY_FBO; case GE_DSTBLEND_DOUBLESRCALPHA: case GE_DSTBLEND_DOUBLEINVSRCALPHA: if (bufferFormat == GE_FORMAT_565) { return REPLACE_BLEND_2X_ALPHA; } - return !allowShaderBlend ? REPLACE_BLEND_2X_ALPHA : REPLACE_BLEND_COPY_FBO; + return !allowFramebufferRead ? REPLACE_BLEND_2X_ALPHA : REPLACE_BLEND_COPY_FBO; case GE_DSTBLEND_SRCALPHA: case GE_DSTBLEND_INVSRCALPHA: @@ -393,7 +393,7 @@ ReplaceBlendType ReplaceBlendWithShader(bool allowShaderBlend, GEBufferFormat bu if (bufferFormat == GE_FORMAT_565) { return REPLACE_BLEND_STANDARD; } - return !allowShaderBlend ? REPLACE_BLEND_STANDARD : REPLACE_BLEND_COPY_FBO; + return !allowFramebufferRead ? REPLACE_BLEND_STANDARD : REPLACE_BLEND_COPY_FBO; } case GE_SRCBLEND_FIXA: @@ -401,7 +401,7 @@ ReplaceBlendType ReplaceBlendWithShader(bool allowShaderBlend, GEBufferFormat bu switch (funcB) { case GE_DSTBLEND_DOUBLESRCALPHA: // Can't safely double alpha, will clamp. - return !allowShaderBlend ? REPLACE_BLEND_2X_ALPHA : REPLACE_BLEND_COPY_FBO; + return !allowFramebufferRead ? REPLACE_BLEND_2X_ALPHA : REPLACE_BLEND_COPY_FBO; case GE_DSTBLEND_DOUBLEINVSRCALPHA: // Doubling alpha is safe for the inverse, will clamp to zero either way. @@ -412,7 +412,7 @@ ReplaceBlendType ReplaceBlendWithShader(bool allowShaderBlend, GEBufferFormat bu if (bufferFormat == GE_FORMAT_565) { return REPLACE_BLEND_STANDARD; } - return !allowShaderBlend ? REPLACE_BLEND_STANDARD : REPLACE_BLEND_COPY_FBO; + return !allowFramebufferRead ? REPLACE_BLEND_STANDARD : REPLACE_BLEND_COPY_FBO; case GE_DSTBLEND_FIXB: default: @@ -446,14 +446,14 @@ ReplaceBlendType ReplaceBlendWithShader(bool allowShaderBlend, GEBufferFormat bu if (funcA == GE_SRCBLEND_SRCALPHA || funcA == GE_SRCBLEND_INVSRCALPHA) { // Can't safely double alpha, will clamp. However, a copy may easily be worse due to overlap. if (gstate_c.Supports(GPU_SUPPORTS_ANY_FRAMEBUFFER_FETCH)) - return !allowShaderBlend ? REPLACE_BLEND_PRE_SRC_2X_ALPHA : REPLACE_BLEND_COPY_FBO; + return !allowFramebufferRead ? REPLACE_BLEND_PRE_SRC_2X_ALPHA : REPLACE_BLEND_COPY_FBO; return REPLACE_BLEND_PRE_SRC_2X_ALPHA; } else { // This means dst alpha/color is used in the src factor. // Unfortunately, copying here causes overlap problems in Silent Hill games (it seems?) // We will just hope that doubling alpha for the dst factor will not clamp too badly. if (gstate_c.Supports(GPU_SUPPORTS_ANY_FRAMEBUFFER_FETCH)) - return !allowShaderBlend ? REPLACE_BLEND_2X_ALPHA : REPLACE_BLEND_COPY_FBO; + return !allowFramebufferRead ? REPLACE_BLEND_2X_ALPHA : REPLACE_BLEND_COPY_FBO; return REPLACE_BLEND_2X_ALPHA; } @@ -470,7 +470,7 @@ ReplaceBlendType ReplaceBlendWithShader(bool allowShaderBlend, GEBufferFormat bu if (bufferFormat == GE_FORMAT_565) { return REPLACE_BLEND_STANDARD; } - return !allowShaderBlend ? REPLACE_BLEND_STANDARD : REPLACE_BLEND_COPY_FBO; + return !allowFramebufferRead ? REPLACE_BLEND_STANDARD : REPLACE_BLEND_COPY_FBO; default: return REPLACE_BLEND_STANDARD; @@ -958,7 +958,7 @@ void ApplyStencilReplaceAndLogicOp(ReplaceAlphaType replaceAlphaWithStencil, Gen // Called even if AlphaBlendEnable == false - it also deals with stencil-related blend state. -void ConvertBlendState(GenericBlendState &blendState, bool allowShaderBlend) { +void ConvertBlendState(GenericBlendState &blendState, bool allowFramebufferRead) { // Blending is a bit complex to emulate. This is due to several reasons: // // * Doubled blend modes (src, dst, inversed) aren't supported in OpenGL. @@ -969,25 +969,25 @@ void ConvertBlendState(GenericBlendState &blendState, bool allowShaderBlend) { // // If we can't apply blending, we make a copy of the framebuffer and do it manually. - blendState.applyShaderBlending = false; - blendState.dirtyShaderBlend = false; + blendState.applyFramebufferRead = false; + blendState.dirtyShaderBlendFixValues = false; blendState.useBlendColor = false; blendState.replaceAlphaWithStencil = REPLACE_ALPHA_NO; - ReplaceBlendType replaceBlend = ReplaceBlendWithShader(allowShaderBlend, gstate.FrameBufFormat()); + ReplaceBlendType replaceBlend = ReplaceBlendWithShader(allowFramebufferRead, gstate.FrameBufFormat()); ReplaceAlphaType replaceAlphaWithStencil = ReplaceAlphaWithStencil(replaceBlend); bool usePreSrc = false; switch (replaceBlend) { case REPLACE_BLEND_NO: - blendState.resetShaderBlending = true; + blendState.resetFramebufferRead = true; // We may still want to do something about stencil -> alpha. ApplyStencilReplaceAndLogicOp(replaceAlphaWithStencil, blendState); return; case REPLACE_BLEND_COPY_FBO: - blendState.applyShaderBlending = true; - blendState.resetShaderBlending = false; + blendState.applyFramebufferRead = true; + blendState.resetFramebufferRead = false; blendState.replaceAlphaWithStencil = replaceAlphaWithStencil; break; @@ -1003,7 +1003,7 @@ void ConvertBlendState(GenericBlendState &blendState, bool allowShaderBlend) { } blendState.enabled = true; - blendState.resetShaderBlending = true; + blendState.resetFramebufferRead = true; const GEBlendMode blendFuncEq = gstate.getBlendEq(); GEBlendSrcFactor blendFuncA = gstate.getBlendFuncA(); @@ -1071,7 +1071,7 @@ void ConvertBlendState(GenericBlendState &blendState, bool allowShaderBlend) { glBlendFuncA = BlendFactor::ONE; // Need to pull in the fixed color. TODO: If it hasn't changed, no need to dirty. if (blendFuncA == GE_SRCBLEND_FIXA) { - blendState.dirtyShaderBlend = true; + blendState.dirtyShaderBlendFixValues = true; } } diff --git a/GPU/Common/GPUStateUtils.h b/GPU/Common/GPUStateUtils.h index d58d38f6d4..a9c2a7f831 100644 --- a/GPU/Common/GPUStateUtils.h +++ b/GPU/Common/GPUStateUtils.h @@ -121,9 +121,9 @@ enum class BlendEq : uint8_t { struct GenericBlendState { bool enabled; - bool resetShaderBlending; - bool applyShaderBlending; - bool dirtyShaderBlend; + bool resetFramebufferRead; + bool applyFramebufferRead; + bool dirtyShaderBlendFixValues; ReplaceAlphaType replaceAlphaWithStencil; BlendFactor srcColor; diff --git a/GPU/Common/ShaderId.cpp b/GPU/Common/ShaderId.cpp index 37b01d0c1b..e7d48ac789 100644 --- a/GPU/Common/ShaderId.cpp +++ b/GPU/Common/ShaderId.cpp @@ -240,7 +240,7 @@ void ComputeFragmentShaderID(FShaderID *id_out, const Draw::Bugs &bugs) { bool doFlatShading = gstate.getShadeMode() == GE_SHADE_FLAT; bool useShaderDepal = gstate_c.useShaderDepal; - ReplaceBlendType replaceBlend = ReplaceBlendWithShader(gstate_c.allowShaderBlend, gstate.FrameBufFormat()); + ReplaceBlendType replaceBlend = ReplaceBlendWithShader(gstate_c.allowFramebufferRead, gstate.FrameBufFormat()); ReplaceAlphaType stencilToAlpha = ReplaceAlphaWithStencil(replaceBlend); // All texfuncs except replace are the same for RGB as for RGBA with full alpha. diff --git a/GPU/D3D11/DrawEngineD3D11.h b/GPU/D3D11/DrawEngineD3D11.h index 47302fe71e..cbca41427a 100644 --- a/GPU/D3D11/DrawEngineD3D11.h +++ b/GPU/D3D11/DrawEngineD3D11.h @@ -160,7 +160,7 @@ private: void ApplyDrawState(int prim); void ApplyDrawStateLate(bool applyStencilRef, uint8_t stencilRef); - void ResetShaderBlending(); + void ResetFramebufferRead(); ID3D11InputLayout *SetupDecFmtForDraw(D3D11VertexShader *vshader, const DecVtxFormat &decFmt, u32 pspFmt); diff --git a/GPU/D3D11/StateMappingD3D11.cpp b/GPU/D3D11/StateMappingD3D11.cpp index 8ef3d2c574..71e068830f 100644 --- a/GPU/D3D11/StateMappingD3D11.cpp +++ b/GPU/D3D11/StateMappingD3D11.cpp @@ -122,7 +122,7 @@ static const D3D11_LOGIC_OP logicOps[] = { D3D11_LOGIC_OP_SET, }; -void DrawEngineD3D11::ResetShaderBlending() { +void DrawEngineD3D11::ResetFramebufferRead() { if (fboTexBound_) { ID3D11ShaderResourceView *srv = nullptr; context_->PSSetShaderResources(0, 1, &srv); @@ -144,7 +144,7 @@ void DrawEngineD3D11::ApplyDrawState(int prim) { bool useBufferedRendering = framebufferManager_->UseBufferedRendering(); // Blend if (gstate_c.IsDirty(DIRTY_BLEND_STATE)) { - gstate_c.SetAllowShaderBlend(!g_Config.bDisableSlowFramebufEffects); + gstate_c.SetAllowFramebufferRead(!g_Config.bDisableSlowFramebufEffects); if (gstate.isModeClear()) { keys_.blend.value = 0; // full wipe keys_.blend.blendEnable = false; @@ -157,18 +157,18 @@ void DrawEngineD3D11::ApplyDrawState(int prim) { keys_.blend.value = 0; // Set blend - unless we need to do it in the shader. GenericBlendState blendState; - ConvertBlendState(blendState, gstate_c.allowShaderBlend); - if (blendState.applyShaderBlending) { + ConvertBlendState(blendState, gstate_c.allowFramebufferRead); + if (blendState.applyFramebufferRead) { if (ApplyShaderBlending()) { // We may still want to do something about stencil -> alpha. ApplyStencilReplaceAndLogicOp(blendState.replaceAlphaWithStencil, blendState); } else { // Until next time, force it off. - ResetShaderBlending(); - gstate_c.SetAllowShaderBlend(false); + ResetFramebufferRead(); + gstate_c.SetAllowFramebufferRead(false); } - } else if (blendState.resetShaderBlending) { - ResetShaderBlending(); + } else if (blendState.resetFramebufferRead) { + ResetFramebufferRead(); } if (blendState.enabled) { @@ -180,7 +180,7 @@ void DrawEngineD3D11::ApplyDrawState(int prim) { keys_.blend.srcAlpha = d3d11BlendFactorLookup[(size_t)blendState.srcAlpha]; keys_.blend.destColor = d3d11BlendFactorLookup[(size_t)blendState.dstColor]; keys_.blend.destAlpha = d3d11BlendFactorLookup[(size_t)blendState.dstAlpha]; - if (blendState.dirtyShaderBlend) { + if (blendState.dirtyShaderBlendFixValues) { gstate_c.Dirty(DIRTY_SHADERBLEND); } dynState_.useBlendColor = blendState.useBlendColor; diff --git a/GPU/Directx9/StateMappingDX9.cpp b/GPU/Directx9/StateMappingDX9.cpp index cbe47ead46..f9b385ed37 100644 --- a/GPU/Directx9/StateMappingDX9.cpp +++ b/GPU/Directx9/StateMappingDX9.cpp @@ -115,8 +115,8 @@ void DrawEngineDX9::ApplyDrawState(int prim) { if (gstate_c.IsDirty(DIRTY_BLEND_STATE)) { gstate_c.Clean(DIRTY_BLEND_STATE); - // Unfortunately, this isn't implemented yet. - gstate_c.SetAllowShaderBlend(false); + // Unfortunately, this isn't implemented on DX9 yet. + gstate_c.SetAllowFramebufferRead(false); if (gstate.isModeClear()) { dxstate.blend.disable(); @@ -127,18 +127,18 @@ void DrawEngineDX9::ApplyDrawState(int prim) { } else { // Set blend - unless we need to do it in the shader. GenericBlendState blendState; - ConvertBlendState(blendState, gstate_c.allowShaderBlend); + ConvertBlendState(blendState, gstate_c.allowFramebufferRead); - if (blendState.applyShaderBlending) { + if (blendState.applyFramebufferRead) { if (ApplyShaderBlending()) { // We may still want to do something about stencil -> alpha. ApplyStencilReplaceAndLogicOp(blendState.replaceAlphaWithStencil, blendState); } else { // Until next time, force it off. ResetShaderBlending(); - gstate_c.SetAllowShaderBlend(false); + gstate_c.SetAllowFramebufferRead(false); } - } else if (blendState.resetShaderBlending) { + } else if (blendState.resetFramebufferRead) { ResetShaderBlending(); } @@ -149,7 +149,7 @@ void DrawEngineDX9::ApplyDrawState(int prim) { dxstate.blendFunc.set( dxBlendFactorLookup[(size_t)blendState.srcColor], dxBlendFactorLookup[(size_t)blendState.dstColor], dxBlendFactorLookup[(size_t)blendState.srcAlpha], dxBlendFactorLookup[(size_t)blendState.dstAlpha]); - if (blendState.dirtyShaderBlend) { + if (blendState.dirtyShaderBlendFixValues) { gstate_c.Dirty(DIRTY_SHADERBLEND); } if (blendState.useBlendColor) { diff --git a/GPU/GLES/StateMappingGLES.cpp b/GPU/GLES/StateMappingGLES.cpp index 25d178a293..23cbe919c0 100644 --- a/GPU/GLES/StateMappingGLES.cpp +++ b/GPU/GLES/StateMappingGLES.cpp @@ -156,7 +156,7 @@ void DrawEngineGLES::ApplyDrawState(int prim) { if (gstate_c.IsDirty(DIRTY_BLEND_STATE)) { gstate_c.Clean(DIRTY_BLEND_STATE); - gstate_c.SetAllowShaderBlend(!g_Config.bDisableSlowFramebufEffects); + gstate_c.SetAllowFramebufferRead(!g_Config.bDisableSlowFramebufEffects); if (gstate.isModeClear()) { // Color Test @@ -167,9 +167,9 @@ void DrawEngineGLES::ApplyDrawState(int prim) { // Do the large chunks of state conversion. We might be able to hide these two behind a dirty-flag each, // to avoid recomputing heavy stuff unnecessarily every draw call. GenericBlendState blendState; - ConvertBlendState(blendState, gstate_c.allowShaderBlend); + ConvertBlendState(blendState, gstate_c.allowFramebufferRead); - if (blendState.applyShaderBlending) { + if (blendState.applyFramebufferRead) { if (ApplyShaderBlending()) { // We may still want to do something about stencil -> alpha. ApplyStencilReplaceAndLogicOp(blendState.replaceAlphaWithStencil, blendState); @@ -191,14 +191,15 @@ void DrawEngineGLES::ApplyDrawState(int prim) { } else { // Until next time, force it off. ResetShaderBlending(); - gstate_c.SetAllowShaderBlend(false); + gstate_c.SetAllowFramebufferRead(false); } - } else if (blendState.resetShaderBlending) { + } else if (blendState.resetFramebufferRead) { ResetShaderBlending(); } if (blendState.enabled) { - if (blendState.dirtyShaderBlend) { + if (blendState.dirtyShaderBlendFixValues) { + // Not quite sure how necessary this is. gstate_c.Dirty(DIRTY_SHADERBLEND); } if (blendState.useBlendColor) { diff --git a/GPU/GPUState.h b/GPU/GPUState.h index 0deaa9e8f0..25402a3b76 100644 --- a/GPU/GPUState.h +++ b/GPU/GPUState.h @@ -540,9 +540,9 @@ struct GPUStateCache { Dirty(DIRTY_TEXCLAMP); } } - void SetAllowShaderBlend(bool allow) { - if (allowShaderBlend != allow) { - allowShaderBlend = allow; + void SetAllowFramebufferRead(bool allow) { + if (allowFramebufferRead != allow) { + allowFramebufferRead = allow; Dirty(DIRTY_FRAGMENTSHADER_STATE); } } @@ -564,7 +564,7 @@ struct GPUStateCache { bool bgraTexture; bool needShaderTexClamp; - bool allowShaderBlend; + bool allowFramebufferRead; float morphWeights[8]; u32 deferredVertTypeDirty; diff --git a/GPU/Vulkan/StateMappingVulkan.cpp b/GPU/Vulkan/StateMappingVulkan.cpp index 1dee71861d..ed3259283d 100644 --- a/GPU/Vulkan/StateMappingVulkan.cpp +++ b/GPU/Vulkan/StateMappingVulkan.cpp @@ -135,7 +135,7 @@ void DrawEngineVulkan::ConvertStateToVulkanKey(FramebufferManagerVulkan &fbManag bool useBufferedRendering = framebufferManager_->UseBufferedRendering(); if (gstate_c.IsDirty(DIRTY_BLEND_STATE)) { - gstate_c.SetAllowShaderBlend(!g_Config.bDisableSlowFramebufEffects); + gstate_c.SetAllowFramebufferRead(!g_Config.bDisableSlowFramebufEffects); if (gstate.isModeClear()) { key.logicOpEnable = false; key.logicOp = VK_LOGIC_OP_CLEAR; @@ -163,20 +163,20 @@ void DrawEngineVulkan::ConvertStateToVulkanKey(FramebufferManagerVulkan &fbManag // Set blend - unless we need to do it in the shader. GenericBlendState blendState; - ConvertBlendState(blendState, gstate_c.allowShaderBlend); + ConvertBlendState(blendState, gstate_c.allowFramebufferRead); - if (blendState.applyShaderBlending) { + if (blendState.applyFramebufferRead) { if (ApplyShaderBlending()) { // We may still want to do something about stencil -> alpha. ApplyStencilReplaceAndLogicOp(blendState.replaceAlphaWithStencil, blendState); } else { // Until next time, force it off. ResetShaderBlending(); - gstate_c.SetAllowShaderBlend(false); + gstate_c.SetAllowFramebufferRead(false); // Make sure we recompute the fragment shader ID to one that doesn't try to use shader blending. gstate_c.Dirty(DIRTY_FRAGMENTSHADER_STATE); } - } else if (blendState.resetShaderBlending) { + } else if (blendState.resetFramebufferRead) { ResetShaderBlending(); } @@ -188,7 +188,7 @@ void DrawEngineVulkan::ConvertStateToVulkanKey(FramebufferManagerVulkan &fbManag key.srcAlpha = vkBlendFactorLookup[(size_t)blendState.srcAlpha]; key.destColor = vkBlendFactorLookup[(size_t)blendState.dstColor]; key.destAlpha = vkBlendFactorLookup[(size_t)blendState.dstAlpha]; - if (blendState.dirtyShaderBlend) { + if (blendState.dirtyShaderBlendFixValues) { gstate_c.Dirty(DIRTY_SHADERBLEND); } dynState.useBlendColor = blendState.useBlendColor; From 391b8155c54624eabdff16a484dbe8f54ff39d11 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Sun, 8 Nov 2020 13:14:23 +0100 Subject: [PATCH 224/275] More work on detangling the concepts and making things make more sense. --- GPU/Common/DrawEngineCommon.cpp | 5 +++-- GPU/Common/DrawEngineCommon.h | 4 ++-- GPU/D3D11/StateMappingD3D11.cpp | 7 ++++--- GPU/Directx9/DrawEngineDX9.h | 2 +- GPU/Directx9/StateMappingDX9.cpp | 27 +++++++-------------------- GPU/GLES/DrawEngineGLES.h | 2 +- GPU/GLES/StateMappingGLES.cpp | 26 +++++++------------------- GPU/Vulkan/DrawEngineVulkan.h | 2 +- GPU/Vulkan/StateMappingVulkan.cpp | 26 ++++++-------------------- 9 files changed, 32 insertions(+), 69 deletions(-) diff --git a/GPU/Common/DrawEngineCommon.cpp b/GPU/Common/DrawEngineCommon.cpp index bb554d1c38..1784813175 100644 --- a/GPU/Common/DrawEngineCommon.cpp +++ b/GPU/Common/DrawEngineCommon.cpp @@ -480,8 +480,9 @@ u32 DrawEngineCommon::NormalizeVertices(u8 *outPtr, u8 *bufPtr, const u8 *inPtr, return GE_VTYPE_TC_FLOAT | GE_VTYPE_COL_8888 | GE_VTYPE_NRM_FLOAT | GE_VTYPE_POS_FLOAT | (vertType & (GE_VTYPE_IDX_MASK | GE_VTYPE_THROUGH)); } -bool DrawEngineCommon::ApplyShaderBlending() { +bool DrawEngineCommon::ApplyFramebufferRead(bool *fboTexNeedsBind) { if (gstate_c.Supports(GPU_SUPPORTS_ANY_FRAMEBUFFER_FETCH)) { + *fboTexNeedsBind = false; return true; } @@ -502,7 +503,7 @@ bool DrawEngineCommon::ApplyShaderBlending() { return false; } - fboTexNeedBind_ = true; + *fboTexNeedsBind = true; gstate_c.Dirty(DIRTY_SHADERBLEND); return true; diff --git a/GPU/Common/DrawEngineCommon.h b/GPU/Common/DrawEngineCommon.h index f53b96f487..7a063a2d26 100644 --- a/GPU/Common/DrawEngineCommon.h +++ b/GPU/Common/DrawEngineCommon.h @@ -112,7 +112,7 @@ protected: // Vertex decoding void DecodeVertsStep(u8 *dest, int &i, int &decodedVerts); - bool ApplyShaderBlending(); + bool ApplyFramebufferRead(bool *fboTexNeedsBind); inline int IndexSize(u32 vtype) const { const u32 indexType = (vtype & GE_VTYPE_IDX_MASK); @@ -169,7 +169,7 @@ protected: GEPrimitiveType prevPrim_ = GE_PRIM_INVALID; // Shader blending state - bool fboTexNeedBind_ = false; + bool fboTexNeedsBind_ = false; bool fboTexBound_ = false; // Hardware tessellation diff --git a/GPU/D3D11/StateMappingD3D11.cpp b/GPU/D3D11/StateMappingD3D11.cpp index 71e068830f..1529ae9b54 100644 --- a/GPU/D3D11/StateMappingD3D11.cpp +++ b/GPU/D3D11/StateMappingD3D11.cpp @@ -159,13 +159,14 @@ void DrawEngineD3D11::ApplyDrawState(int prim) { GenericBlendState blendState; ConvertBlendState(blendState, gstate_c.allowFramebufferRead); if (blendState.applyFramebufferRead) { - if (ApplyShaderBlending()) { + if (ApplyFramebufferRead(&fboTexNeedsBind_)) { // We may still want to do something about stencil -> alpha. ApplyStencilReplaceAndLogicOp(blendState.replaceAlphaWithStencil, blendState); } else { // Until next time, force it off. ResetFramebufferRead(); gstate_c.SetAllowFramebufferRead(false); + gstate_c.Dirty(DIRTY_FRAGMENTSHADER_STATE); } } else if (blendState.resetFramebufferRead) { ResetFramebufferRead(); @@ -446,11 +447,11 @@ void DrawEngineD3D11::ApplyDrawState(int prim) { void DrawEngineD3D11::ApplyDrawStateLate(bool applyStencilRef, uint8_t stencilRef) { if (!gstate.isModeClear()) { - if (fboTexNeedBind_) { + if (fboTexNeedsBind_) { framebufferManager_->BindFramebufferAsColorTexture(1, framebufferManager_->GetCurrentRenderVFB(), BINDFBCOLOR_MAY_COPY); // No sampler required, we do a plain Load in the pixel shader. fboTexBound_ = true; - fboTexNeedBind_ = false; + fboTexNeedsBind_ = false; } textureCache_->ApplyTexture(); } diff --git a/GPU/Directx9/DrawEngineDX9.h b/GPU/Directx9/DrawEngineDX9.h index 789ebe6209..f0963beb91 100644 --- a/GPU/Directx9/DrawEngineDX9.h +++ b/GPU/Directx9/DrawEngineDX9.h @@ -150,7 +150,7 @@ private: void ApplyDrawState(int prim); void ApplyDrawStateLate(); - void ResetShaderBlending(); + void ResetFramebufferRead(); IDirect3DVertexDeclaration9 *SetupDecFmtForDraw(VSShader *vshader, const DecVtxFormat &decFmt, u32 pspFmt); diff --git a/GPU/Directx9/StateMappingDX9.cpp b/GPU/Directx9/StateMappingDX9.cpp index f9b385ed37..ee496b17b6 100644 --- a/GPU/Directx9/StateMappingDX9.cpp +++ b/GPU/Directx9/StateMappingDX9.cpp @@ -90,7 +90,7 @@ static const D3DSTENCILOP stencilOps[] = { D3DSTENCILOP_KEEP, // reserved }; -inline void DrawEngineDX9::ResetShaderBlending() { +inline void DrawEngineDX9::ResetFramebufferRead() { if (fboTexBound_) { device_->SetTexture(1, nullptr); fboTexBound_ = false; @@ -130,16 +130,17 @@ void DrawEngineDX9::ApplyDrawState(int prim) { ConvertBlendState(blendState, gstate_c.allowFramebufferRead); if (blendState.applyFramebufferRead) { - if (ApplyShaderBlending()) { + if (ApplyFramebufferRead(&fboTexNeedsBind_)) { // We may still want to do something about stencil -> alpha. ApplyStencilReplaceAndLogicOp(blendState.replaceAlphaWithStencil, blendState); } else { // Until next time, force it off. - ResetShaderBlending(); + ResetFramebufferRead(); gstate_c.SetAllowFramebufferRead(false); } + gstate_c.Dirty(DIRTY_FRAGMENTSHADER_STATE); } else if (blendState.resetFramebufferRead) { - ResetShaderBlending(); + ResetFramebufferRead(); } if (blendState.enabled) { @@ -166,20 +167,6 @@ void DrawEngineDX9::ApplyDrawState(int prim) { bool bmask = ((gstate.pmskc >> 16) & 0xFF) < 128; bool amask = (gstate.pmska & 0xFF) < 128; -#ifndef MOBILE_DEVICE - u8 abits = (gstate.pmska >> 0) & 0xFF; - u8 rbits = (gstate.pmskc >> 0) & 0xFF; - u8 gbits = (gstate.pmskc >> 8) & 0xFF; - u8 bbits = (gstate.pmskc >> 16) & 0xFF; - if ((rbits != 0 && rbits != 0xFF) || (gbits != 0 && gbits != 0xFF) || (bbits != 0 && bbits != 0xFF)) { - WARN_LOG_REPORT_ONCE(rgbmask, G3D, "Unsupported RGB mask: r=%02x g=%02x b=%02x", rbits, gbits, bbits); - } - if (abits != 0 && abits != 0xFF) { - // The stencil part of the mask is supported. - WARN_LOG_REPORT_ONCE(amask, G3D, "Unsupported alpha/stencil mask: %02x", abits); - } -#endif - // Let's not write to alpha if stencil isn't enabled. if (IsStencilTestOutputDisabled()) { amask = false; @@ -297,14 +284,14 @@ void DrawEngineDX9::ApplyDrawStateLate() { if (!gstate.isModeClear()) { textureCache_->ApplyTexture(); - if (fboTexNeedBind_) { + if (fboTexNeedsBind_) { // Note that this is positions, not UVs, that we need the copy from. framebufferManager_->BindFramebufferAsColorTexture(1, framebufferManager_->GetCurrentRenderVFB(), BINDFBCOLOR_MAY_COPY); // If we are rendering at a higher resolution, linear is probably best for the dest color. device_->SetSamplerState(1, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR); device_->SetSamplerState(1, D3DSAMP_MINFILTER, D3DTEXF_LINEAR); fboTexBound_ = true; - fboTexNeedBind_ = false; + fboTexNeedsBind_ = false; } // TODO: Test texture? diff --git a/GPU/GLES/DrawEngineGLES.h b/GPU/GLES/DrawEngineGLES.h index 8c962dd141..fd694f4d7e 100644 --- a/GPU/GLES/DrawEngineGLES.h +++ b/GPU/GLES/DrawEngineGLES.h @@ -193,7 +193,7 @@ private: void DoFlush(); void ApplyDrawState(int prim); void ApplyDrawStateLate(bool setStencil, int stencilValue); - void ResetShaderBlending(); + void ResetFramebufferRead(); GLRInputLayout *SetupDecFmtForDraw(LinkedShader *program, const DecVtxFormat &decFmt); diff --git a/GPU/GLES/StateMappingGLES.cpp b/GPU/GLES/StateMappingGLES.cpp index 23cbe919c0..2b6f0e39f8 100644 --- a/GPU/GLES/StateMappingGLES.cpp +++ b/GPU/GLES/StateMappingGLES.cpp @@ -121,7 +121,7 @@ static const GLushort logicOps[] = { }; #endif -inline void DrawEngineGLES::ResetShaderBlending() { +inline void DrawEngineGLES::ResetFramebufferRead() { if (fboTexBound_) { GLRenderManager *renderManager = (GLRenderManager *)draw_->GetNativeObject(Draw::NativeObject::RENDER_MANAGER); renderManager->BindTexture(TEX_SLOT_SHADERBLEND_SRC, nullptr); @@ -170,19 +170,19 @@ void DrawEngineGLES::ApplyDrawState(int prim) { ConvertBlendState(blendState, gstate_c.allowFramebufferRead); if (blendState.applyFramebufferRead) { - if (ApplyShaderBlending()) { + if (ApplyFramebufferRead(&fboTexNeedsBind_)) { // We may still want to do something about stencil -> alpha. ApplyStencilReplaceAndLogicOp(blendState.replaceAlphaWithStencil, blendState); // We copy the framebuffer here, as doing so will wipe any blend state if we do it later. - if (fboTexNeedBind_) { + if (fboTexNeedsBind_) { // Note that this is positions, not UVs, that we need the copy from. // TODO: If the device doesn't support blit, this will corrupt the currently applied texture. framebufferManager_->BindFramebufferAsColorTexture(1, framebufferManager_->GetCurrentRenderVFB(), BINDFBCOLOR_MAY_COPY); // If we are rendering at a higher resolution, linear is probably best for the dest color. renderManager->SetTextureSampler(1, GL_CLAMP_TO_EDGE, GL_CLAMP_TO_EDGE, GL_LINEAR, GL_LINEAR, 0.0f); fboTexBound_ = true; - fboTexNeedBind_ = false; + fboTexNeedsBind_ = false; framebufferManager_->RebindFramebuffer("RebindFramebuffer - ApplyDrawState"); // Must dirty blend state here so we re-copy next time. Example: Lunar's spell effects. @@ -190,11 +190,12 @@ void DrawEngineGLES::ApplyDrawState(int prim) { } } else { // Until next time, force it off. - ResetShaderBlending(); + ResetFramebufferRead(); gstate_c.SetAllowFramebufferRead(false); } + gstate_c.Dirty(DIRTY_FRAGMENTSHADER_STATE); } else if (blendState.resetFramebufferRead) { - ResetShaderBlending(); + ResetFramebufferRead(); } if (blendState.enabled) { @@ -220,19 +221,6 @@ void DrawEngineGLES::ApplyDrawState(int prim) { bool gmask = ((gstate.pmskc >> 8) & 0xFF) < 128; bool bmask = ((gstate.pmskc >> 16) & 0xFF) < 128; -#ifndef MOBILE_DEVICE - u8 abits = (gstate.pmska >> 0) & 0xFF; - u8 rbits = (gstate.pmskc >> 0) & 0xFF; - u8 gbits = (gstate.pmskc >> 8) & 0xFF; - u8 bbits = (gstate.pmskc >> 16) & 0xFF; - if ((rbits != 0 && rbits != 0xFF) || (gbits != 0 && gbits != 0xFF) || (bbits != 0 && bbits != 0xFF)) { - WARN_LOG_REPORT_ONCE(rgbmask, G3D, "Unsupported RGB mask: r=%02x g=%02x b=%02x", rbits, gbits, bbits); - } - if (abits != 0 && abits != 0xFF) { - // The stencil part of the mask is supported. - WARN_LOG_REPORT_ONCE(amask, G3D, "Unsupported alpha/stencil mask: %02x", abits); - } -#endif int mask = (int)rmask | ((int)gmask << 1) | ((int)bmask << 2) | ((int)amask << 3); if (blendState.enabled) { renderManager->SetBlendAndMask(mask, blendState.enabled, diff --git a/GPU/Vulkan/DrawEngineVulkan.h b/GPU/Vulkan/DrawEngineVulkan.h index 3f46a62186..0e36cbcc16 100644 --- a/GPU/Vulkan/DrawEngineVulkan.h +++ b/GPU/Vulkan/DrawEngineVulkan.h @@ -199,7 +199,7 @@ private: void ApplyDrawStateLate(VulkanRenderManager *renderManager, bool applyStencilRef, uint8_t stencilRef, bool useBlendConstant); void ConvertStateToVulkanKey(FramebufferManagerVulkan &fbManager, ShaderManagerVulkan *shaderManager, int prim, VulkanPipelineRasterStateKey &key, VulkanDynamicState &dynState); void BindShaderBlendTex(); - void ResetShaderBlending(); + void ResetFramebufferRead(); void InitDeviceObjects(); void DestroyDeviceObjects(); diff --git a/GPU/Vulkan/StateMappingVulkan.cpp b/GPU/Vulkan/StateMappingVulkan.cpp index ed3259283d..9fbb9b202b 100644 --- a/GPU/Vulkan/StateMappingVulkan.cpp +++ b/GPU/Vulkan/StateMappingVulkan.cpp @@ -122,7 +122,7 @@ static const VkLogicOp logicOps[] = { VK_LOGIC_OP_SET, }; -void DrawEngineVulkan::ResetShaderBlending() { +void DrawEngineVulkan::ResetFramebufferRead() { boundSecondary_ = VK_NULL_HANDLE; } @@ -166,18 +166,18 @@ void DrawEngineVulkan::ConvertStateToVulkanKey(FramebufferManagerVulkan &fbManag ConvertBlendState(blendState, gstate_c.allowFramebufferRead); if (blendState.applyFramebufferRead) { - if (ApplyShaderBlending()) { + if (ApplyFramebufferRead(&fboTexNeedsBind_)) { // We may still want to do something about stencil -> alpha. ApplyStencilReplaceAndLogicOp(blendState.replaceAlphaWithStencil, blendState); } else { // Until next time, force it off. - ResetShaderBlending(); + ResetFramebufferRead(); gstate_c.SetAllowFramebufferRead(false); // Make sure we recompute the fragment shader ID to one that doesn't try to use shader blending. gstate_c.Dirty(DIRTY_FRAGMENTSHADER_STATE); } } else if (blendState.resetFramebufferRead) { - ResetShaderBlending(); + ResetFramebufferRead(); } if (blendState.enabled) { @@ -213,20 +213,6 @@ void DrawEngineVulkan::ConvertStateToVulkanKey(FramebufferManagerVulkan &fbManag bool bmask = ((gstate.pmskc >> 16) & 0xFF) < 128; bool amask = (gstate.pmska & 0xFF) < 128; -#ifndef MOBILE_DEVICE - u8 abits = (gstate.pmska >> 0) & 0xFF; - u8 rbits = (gstate.pmskc >> 0) & 0xFF; - u8 gbits = (gstate.pmskc >> 8) & 0xFF; - u8 bbits = (gstate.pmskc >> 16) & 0xFF; - if ((rbits != 0 && rbits != 0xFF) || (gbits != 0 && gbits != 0xFF) || (bbits != 0 && bbits != 0xFF)) { - WARN_LOG_REPORT_ONCE(rgbmask, G3D, "Unsupported RGB mask: r=%02x g=%02x b=%02x", rbits, gbits, bbits); - } - if (abits != 0 && abits != 0xFF) { - // The stencil part of the mask is supported. - WARN_LOG_REPORT_ONCE(amask, G3D, "Unsupported alpha/stencil mask: %02x", abits); - } -#endif - // Let's not write to alpha if stencil isn't enabled. if (IsStencilTestOutputDisabled()) { amask = false; @@ -395,13 +381,13 @@ void DrawEngineVulkan::BindShaderBlendTex() { // TODO: Set the nearest/linear here (since we correctly know if alpha/color tests are needed)? if (!gstate.isModeClear()) { // TODO: Test texture? - if (fboTexNeedBind_) { + if (fboTexNeedsBind_) { // Note that this is positions, not UVs, that we need the copy from. framebufferManager_->BindFramebufferAsColorTexture(1, framebufferManager_->GetCurrentRenderVFB(), BINDFBCOLOR_MAY_COPY); // If we are rendering at a higher resolution, linear is probably best for the dest color. boundSecondary_ = (VkImageView)draw_->GetNativeObject(Draw::NativeObject::BOUND_TEXTURE1_IMAGEVIEW); fboTexBound_ = true; - fboTexNeedBind_ = false; + fboTexNeedsBind_ = false; } } From 793e89d2e30aea8fa1e61d1916c2a4c07812e1d4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Sun, 8 Nov 2020 14:34:04 +0100 Subject: [PATCH 225/275] Fix some comments, rename a function. --- GPU/Common/GPUStateUtils.cpp | 4 ++-- GPU/Common/GPUStateUtils.h | 2 +- GPU/Common/ShaderId.cpp | 2 ++ GPU/D3D11/StateMappingD3D11.cpp | 6 +++--- GPU/Directx9/StateMappingDX9.cpp | 4 ++-- GPU/GLES/StateMappingGLES.cpp | 4 ++-- GPU/Vulkan/StateMappingVulkan.cpp | 6 +++--- 7 files changed, 15 insertions(+), 13 deletions(-) diff --git a/GPU/Common/GPUStateUtils.cpp b/GPU/Common/GPUStateUtils.cpp index a555faa90d..7cf550ef85 100644 --- a/GPU/Common/GPUStateUtils.cpp +++ b/GPU/Common/GPUStateUtils.cpp @@ -906,7 +906,7 @@ static void ApplyLogicOp(BlendFactor &srcBlend, BlendFactor &dstBlend, BlendEq & } // Try to simulate some common logic ops. -void ApplyStencilReplaceAndLogicOp(ReplaceAlphaType replaceAlphaWithStencil, GenericBlendState &blendState) { +void ApplyStencilReplaceAndLogicOpIgnoreBlend(ReplaceAlphaType replaceAlphaWithStencil, GenericBlendState &blendState) { StencilValueType stencilType = STENCIL_VALUE_KEEP; if (replaceAlphaWithStencil == REPLACE_ALPHA_YES) { stencilType = ReplaceAlphaWithStencilType(); @@ -982,7 +982,7 @@ void ConvertBlendState(GenericBlendState &blendState, bool allowFramebufferRead) case REPLACE_BLEND_NO: blendState.resetFramebufferRead = true; // We may still want to do something about stencil -> alpha. - ApplyStencilReplaceAndLogicOp(replaceAlphaWithStencil, blendState); + ApplyStencilReplaceAndLogicOpIgnoreBlend(replaceAlphaWithStencil, blendState); return; case REPLACE_BLEND_COPY_FBO: diff --git a/GPU/Common/GPUStateUtils.h b/GPU/Common/GPUStateUtils.h index a9c2a7f831..9285702066 100644 --- a/GPU/Common/GPUStateUtils.h +++ b/GPU/Common/GPUStateUtils.h @@ -158,7 +158,7 @@ struct GenericBlendState { }; void ConvertBlendState(GenericBlendState &blendState, bool allowShaderBlend); -void ApplyStencilReplaceAndLogicOp(ReplaceAlphaType replaceAlphaWithStencil, GenericBlendState &blendState); +void ApplyStencilReplaceAndLogicOpIgnoreBlend(ReplaceAlphaType replaceAlphaWithStencil, GenericBlendState &blendState); struct GenericStencilFuncState { bool enabled; diff --git a/GPU/Common/ShaderId.cpp b/GPU/Common/ShaderId.cpp index e7d48ac789..f69e523900 100644 --- a/GPU/Common/ShaderId.cpp +++ b/GPU/Common/ShaderId.cpp @@ -240,6 +240,8 @@ void ComputeFragmentShaderID(FShaderID *id_out, const Draw::Bugs &bugs) { bool doFlatShading = gstate.getShadeMode() == GE_SHADE_FLAT; bool useShaderDepal = gstate_c.useShaderDepal; + // Note how we here recompute some of the work already done in state mapping. + // Not ideal! At least we share the code. ReplaceBlendType replaceBlend = ReplaceBlendWithShader(gstate_c.allowFramebufferRead, gstate.FrameBufFormat()); ReplaceAlphaType stencilToAlpha = ReplaceAlphaWithStencil(replaceBlend); diff --git a/GPU/D3D11/StateMappingD3D11.cpp b/GPU/D3D11/StateMappingD3D11.cpp index 1529ae9b54..f5908923c2 100644 --- a/GPU/D3D11/StateMappingD3D11.cpp +++ b/GPU/D3D11/StateMappingD3D11.cpp @@ -160,14 +160,14 @@ void DrawEngineD3D11::ApplyDrawState(int prim) { ConvertBlendState(blendState, gstate_c.allowFramebufferRead); if (blendState.applyFramebufferRead) { if (ApplyFramebufferRead(&fboTexNeedsBind_)) { - // We may still want to do something about stencil -> alpha. - ApplyStencilReplaceAndLogicOp(blendState.replaceAlphaWithStencil, blendState); + // We take over the responsiblity for blending, so recompute. + ApplyStencilReplaceAndLogicOpIgnoreBlend(blendState.replaceAlphaWithStencil, blendState); } else { // Until next time, force it off. ResetFramebufferRead(); gstate_c.SetAllowFramebufferRead(false); - gstate_c.Dirty(DIRTY_FRAGMENTSHADER_STATE); } + gstate_c.Dirty(DIRTY_FRAGMENTSHADER_STATE); } else if (blendState.resetFramebufferRead) { ResetFramebufferRead(); } diff --git a/GPU/Directx9/StateMappingDX9.cpp b/GPU/Directx9/StateMappingDX9.cpp index ee496b17b6..f1cc732a5f 100644 --- a/GPU/Directx9/StateMappingDX9.cpp +++ b/GPU/Directx9/StateMappingDX9.cpp @@ -131,8 +131,8 @@ void DrawEngineDX9::ApplyDrawState(int prim) { if (blendState.applyFramebufferRead) { if (ApplyFramebufferRead(&fboTexNeedsBind_)) { - // We may still want to do something about stencil -> alpha. - ApplyStencilReplaceAndLogicOp(blendState.replaceAlphaWithStencil, blendState); + // We take over the responsiblity for blending, so recompute. + ApplyStencilReplaceAndLogicOpIgnoreBlend(blendState.replaceAlphaWithStencil, blendState); } else { // Until next time, force it off. ResetFramebufferRead(); diff --git a/GPU/GLES/StateMappingGLES.cpp b/GPU/GLES/StateMappingGLES.cpp index 2b6f0e39f8..572b2103d2 100644 --- a/GPU/GLES/StateMappingGLES.cpp +++ b/GPU/GLES/StateMappingGLES.cpp @@ -171,8 +171,8 @@ void DrawEngineGLES::ApplyDrawState(int prim) { if (blendState.applyFramebufferRead) { if (ApplyFramebufferRead(&fboTexNeedsBind_)) { - // We may still want to do something about stencil -> alpha. - ApplyStencilReplaceAndLogicOp(blendState.replaceAlphaWithStencil, blendState); + // We take over the responsiblity for blending, so recompute. + ApplyStencilReplaceAndLogicOpIgnoreBlend(blendState.replaceAlphaWithStencil, blendState); // We copy the framebuffer here, as doing so will wipe any blend state if we do it later. if (fboTexNeedsBind_) { diff --git a/GPU/Vulkan/StateMappingVulkan.cpp b/GPU/Vulkan/StateMappingVulkan.cpp index 9fbb9b202b..9be12976e1 100644 --- a/GPU/Vulkan/StateMappingVulkan.cpp +++ b/GPU/Vulkan/StateMappingVulkan.cpp @@ -167,15 +167,15 @@ void DrawEngineVulkan::ConvertStateToVulkanKey(FramebufferManagerVulkan &fbManag if (blendState.applyFramebufferRead) { if (ApplyFramebufferRead(&fboTexNeedsBind_)) { - // We may still want to do something about stencil -> alpha. - ApplyStencilReplaceAndLogicOp(blendState.replaceAlphaWithStencil, blendState); + // We take over the responsiblity for blending, so recompute. + ApplyStencilReplaceAndLogicOpIgnoreBlend(blendState.replaceAlphaWithStencil, blendState); } else { // Until next time, force it off. ResetFramebufferRead(); gstate_c.SetAllowFramebufferRead(false); // Make sure we recompute the fragment shader ID to one that doesn't try to use shader blending. - gstate_c.Dirty(DIRTY_FRAGMENTSHADER_STATE); } + gstate_c.Dirty(DIRTY_FRAGMENTSHADER_STATE); } else if (blendState.resetFramebufferRead) { ResetFramebufferRead(); } From 3e06eaccfb18f4f2c04d67006018e067b188e85f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Sun, 8 Nov 2020 14:57:35 +0100 Subject: [PATCH 226/275] Fix some comments --- GPU/D3D11/StateMappingD3D11.cpp | 2 +- GPU/Directx9/StateMappingDX9.cpp | 2 +- GPU/GLES/StateMappingGLES.cpp | 2 +- GPU/Vulkan/StateMappingVulkan.cpp | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/GPU/D3D11/StateMappingD3D11.cpp b/GPU/D3D11/StateMappingD3D11.cpp index f5908923c2..6329495c8c 100644 --- a/GPU/D3D11/StateMappingD3D11.cpp +++ b/GPU/D3D11/StateMappingD3D11.cpp @@ -160,7 +160,7 @@ void DrawEngineD3D11::ApplyDrawState(int prim) { ConvertBlendState(blendState, gstate_c.allowFramebufferRead); if (blendState.applyFramebufferRead) { if (ApplyFramebufferRead(&fboTexNeedsBind_)) { - // We take over the responsiblity for blending, so recompute. + // The shader takes over the responsibility for blending, so recompute. ApplyStencilReplaceAndLogicOpIgnoreBlend(blendState.replaceAlphaWithStencil, blendState); } else { // Until next time, force it off. diff --git a/GPU/Directx9/StateMappingDX9.cpp b/GPU/Directx9/StateMappingDX9.cpp index f1cc732a5f..99f8860f28 100644 --- a/GPU/Directx9/StateMappingDX9.cpp +++ b/GPU/Directx9/StateMappingDX9.cpp @@ -131,7 +131,7 @@ void DrawEngineDX9::ApplyDrawState(int prim) { if (blendState.applyFramebufferRead) { if (ApplyFramebufferRead(&fboTexNeedsBind_)) { - // We take over the responsiblity for blending, so recompute. + // The shader takes over the responsibility for blending, so recompute. ApplyStencilReplaceAndLogicOpIgnoreBlend(blendState.replaceAlphaWithStencil, blendState); } else { // Until next time, force it off. diff --git a/GPU/GLES/StateMappingGLES.cpp b/GPU/GLES/StateMappingGLES.cpp index 572b2103d2..43f9629f7e 100644 --- a/GPU/GLES/StateMappingGLES.cpp +++ b/GPU/GLES/StateMappingGLES.cpp @@ -171,7 +171,7 @@ void DrawEngineGLES::ApplyDrawState(int prim) { if (blendState.applyFramebufferRead) { if (ApplyFramebufferRead(&fboTexNeedsBind_)) { - // We take over the responsiblity for blending, so recompute. + // The shader takes over the responsibility for blending, so recompute. ApplyStencilReplaceAndLogicOpIgnoreBlend(blendState.replaceAlphaWithStencil, blendState); // We copy the framebuffer here, as doing so will wipe any blend state if we do it later. diff --git a/GPU/Vulkan/StateMappingVulkan.cpp b/GPU/Vulkan/StateMappingVulkan.cpp index 9be12976e1..4d7c5fec13 100644 --- a/GPU/Vulkan/StateMappingVulkan.cpp +++ b/GPU/Vulkan/StateMappingVulkan.cpp @@ -167,7 +167,7 @@ void DrawEngineVulkan::ConvertStateToVulkanKey(FramebufferManagerVulkan &fbManag if (blendState.applyFramebufferRead) { if (ApplyFramebufferRead(&fboTexNeedsBind_)) { - // We take over the responsiblity for blending, so recompute. + // The shader takes over the responsibility for blending, so recompute. ApplyStencilReplaceAndLogicOpIgnoreBlend(blendState.replaceAlphaWithStencil, blendState); } else { // Until next time, force it off. From 7391abcfd6f524ada01ff36ddcdae2f6b808ac55 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Sun, 8 Nov 2020 14:57:43 +0100 Subject: [PATCH 227/275] Unrelated warning fixes --- ext/native/tools/atlastool.cpp | 14 +++++++------- ext/native/tools/atlastool/atlastool.vcxproj | 6 +++--- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/ext/native/tools/atlastool.cpp b/ext/native/tools/atlastool.cpp index 7403657ece..c2a9e1be1d 100644 --- a/ext/native/tools/atlastool.cpp +++ b/ext/native/tools/atlastool.cpp @@ -462,8 +462,8 @@ void RasterizeFonts(const FontReferenceList &fontRefs, vector &ranges } else { dist = -closest.find_closest(ctx, cty, 1); } - dist = dist / supersample * distmult + 127.5; - dist = floor(dist + 0.5); + dist = dist / supersample * distmult + 127.5f; + dist = floor(dist + 0.5f); if (dist < 0) dist = 0; if (dist > 255) dist = 255; @@ -564,7 +564,7 @@ struct FontDesc { } } - height = metrics_height / 64.0 / supersample; + height = metrics_height / 64.0f / supersample; } void OutputSelf(FILE *fil, float tw, float th, const vector &results) const { @@ -987,7 +987,7 @@ int main(int argc, char **argv) { fwrite(&header, 1, sizeof(header), meta); // For each image for (int i = 0; i < (int)images.size(); i++) { - AtlasImage atlas_image = images[i].ToAtlasImage(dest.width(), dest.height(), results); + AtlasImage atlas_image = images[i].ToAtlasImage((float)dest.width(), (float)dest.height(), results); fwrite(&atlas_image, 1, sizeof(atlas_image), meta); } // For each font @@ -998,7 +998,7 @@ int main(int argc, char **argv) { fwrite(&font_header, 1, sizeof(font_header), meta); auto ranges = font.GetRanges(); fwrite(ranges.data(), sizeof(AtlasCharRange), ranges.size(), meta); - auto chars = font.GetChars(dest.width(), dest.height(), results); + auto chars = font.GetChars((float)dest.width(), (float)dest.height(), results); fwrite(chars.data(), sizeof(AtlasChar), chars.size(), meta); } fclose(meta); @@ -1010,7 +1010,7 @@ int main(int argc, char **argv) { for (int i = 0; i < (int)fonts.size(); i++) { FontDesc &xfont = fonts[i]; xfont.ComputeHeight(results, distmult); - xfont.OutputSelf(cpp_file, dest.width(), dest.height(), results); + xfont.OutputSelf(cpp_file, (float)dest.width(), (float)dest.height(), results); } if (fonts.size()) { @@ -1024,7 +1024,7 @@ int main(int argc, char **argv) { if (images.size()) { fprintf(cpp_file, "const AtlasImage %s_images[%i] = {\n", atlas_name, (int)images.size()); for (int i = 0; i < (int)images.size(); i++) { - images[i].OutputSelf(cpp_file, dest.width(), dest.height(), results); + images[i].OutputSelf(cpp_file, (float)dest.width(), (float)dest.height(), results); } fprintf(cpp_file, "};\n"); } diff --git a/ext/native/tools/atlastool/atlastool.vcxproj b/ext/native/tools/atlastool/atlastool.vcxproj index afd5ad8b43..dbbfbfefee 100644 --- a/ext/native/tools/atlastool/atlastool.vcxproj +++ b/ext/native/tools/atlastool/atlastool.vcxproj @@ -70,7 +70,7 @@ Level3 Disabled true - _DEBUG;_CONSOLE;%(PreprocessorDefinitions) + _CRT_SECURE_NO_WARNINGS;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) true MultiThreadedDebug @@ -90,7 +90,7 @@ true true true - NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + _CRT_SECURE_NO_WARNINGS;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) true ../../../../;../../ext;../../;../../../../ext;../prebuilt MultiThreaded @@ -108,4 +108,4 @@ - + \ No newline at end of file From 942ce775cc698d0ba7f76e79976a142a4a4e2ea4 Mon Sep 17 00:00:00 2001 From: sum2012 Date: Sun, 8 Nov 2020 22:47:32 +0800 Subject: [PATCH 228/275] Fix AuCheckStreamDataNeeded function fix #13633 --- Core/HW/SimpleAudioDec.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Core/HW/SimpleAudioDec.cpp b/Core/HW/SimpleAudioDec.cpp index b6a51438c9..10159d7daa 100644 --- a/Core/HW/SimpleAudioDec.cpp +++ b/Core/HW/SimpleAudioDec.cpp @@ -394,7 +394,7 @@ u32 AuCtx::AuSetLoopNum(int loop) // return 1 to read more data stream, 0 don't read int AuCtx::AuCheckStreamDataNeeded() { // If we would ask for bytes, then some are needed. - if (AuStreamBytesNeeded() != 0) { + if (AuStreamBytesNeeded() > 0) { return 1; } return 0; From 6310af25fa02d7174910a822366d411c63b8568a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Sun, 8 Nov 2020 23:17:06 +0100 Subject: [PATCH 229/275] Get shader color write masking going on all backends. --- Common/GPU/OpenGL/GLQueueRunner.cpp | 26 +++++++ Common/GPU/OpenGL/GLQueueRunner.h | 1 + Common/GPU/OpenGL/GLRenderManager.h | 24 +++++++ Common/GPU/ShaderWriter.cpp | 1 + Common/GPU/Vulkan/thin3d_vulkan.cpp | 3 +- GPU/Common/FragmentShaderGenerator.cpp | 94 +++++++++++++++++++++----- GPU/Common/GPUStateUtils.cpp | 62 ++++++++++++++++- GPU/Common/GPUStateUtils.h | 21 +++++- GPU/Common/ShaderCommon.h | 7 +- GPU/Common/ShaderId.cpp | 3 + GPU/Common/ShaderId.h | 1 + GPU/Common/ShaderUniforms.cpp | 4 ++ GPU/Common/ShaderUniforms.h | 16 ++--- GPU/D3D11/StateMappingD3D11.cpp | 38 ++--------- GPU/Directx9/StateMappingDX9.cpp | 24 ++----- GPU/GLES/ShaderManagerGLES.cpp | 4 ++ GPU/GLES/ShaderManagerGLES.h | 1 + GPU/GLES/StateMappingGLES.cpp | 35 +++------- GPU/GPUCommon.cpp | 4 +- GPU/Vulkan/StateMappingVulkan.cpp | 37 ++++------ assets/compat.ini | 10 ++- unittest/TestShaderGenerators.cpp | 74 ++++++++++++-------- 22 files changed, 325 insertions(+), 165 deletions(-) diff --git a/Common/GPU/OpenGL/GLQueueRunner.cpp b/Common/GPU/OpenGL/GLQueueRunner.cpp index 597f92cac1..a41771a8bd 100644 --- a/Common/GPU/OpenGL/GLQueueRunner.cpp +++ b/Common/GPU/OpenGL/GLQueueRunner.cpp @@ -1001,6 +1001,32 @@ void GLQueueRunner::PerformRenderPass(const GLRStep &step, bool first, bool last CHECK_GL_ERROR_IF_DEBUG(); break; } + case GLRRenderCommand::UNIFORM4UI: + { + _dbg_assert_(curProgram); + int loc = c.uniform4.loc ? *c.uniform4.loc : -1; + if (c.uniform4.name) { + loc = curProgram->GetUniformLoc(c.uniform4.name); + } + if (loc >= 0) { + switch (c.uniform4.count) { + case 1: + glUniform1uiv(loc, 1, (GLuint *)&c.uniform4.v[0]); + break; + case 2: + glUniform2uiv(loc, 1, (GLuint *)c.uniform4.v); + break; + case 3: + glUniform3uiv(loc, 1, (GLuint *)c.uniform4.v); + break; + case 4: + glUniform4uiv(loc, 1, (GLuint *)c.uniform4.v); + break; + } + } + CHECK_GL_ERROR_IF_DEBUG(); + break; + } case GLRRenderCommand::UNIFORM4I: { _dbg_assert_(curProgram); diff --git a/Common/GPU/OpenGL/GLQueueRunner.h b/Common/GPU/OpenGL/GLQueueRunner.h index f47bfd7c40..07837421be 100644 --- a/Common/GPU/OpenGL/GLQueueRunner.h +++ b/Common/GPU/OpenGL/GLQueueRunner.h @@ -42,6 +42,7 @@ enum class GLRRenderCommand : uint8_t { BLENDCOLOR, LOGICOP, UNIFORM4I, + UNIFORM4UI, UNIFORM4F, UNIFORMMATRIX, TEXTURESAMPLER, diff --git a/Common/GPU/OpenGL/GLRenderManager.h b/Common/GPU/OpenGL/GLRenderManager.h index 3999332e69..eca7204de2 100644 --- a/Common/GPU/OpenGL/GLRenderManager.h +++ b/Common/GPU/OpenGL/GLRenderManager.h @@ -659,6 +659,30 @@ public: curRenderStep_->commands.push_back(data); } + void SetUniformUI(const GLint *loc, int count, const uint32_t *udata) { + _dbg_assert_(curRenderStep_ && curRenderStep_->stepType == GLRStepType::RENDER); +#ifdef _DEBUG + _dbg_assert_(curProgram_); +#endif + GLRRenderData data{ GLRRenderCommand::UNIFORM4UI }; + data.uniform4.loc = loc; + data.uniform4.count = count; + memcpy(data.uniform4.v, udata, sizeof(uint32_t) * count); + curRenderStep_->commands.push_back(data); + } + + void SetUniformUI1(const GLint *loc, uint32_t udata) { + _dbg_assert_(curRenderStep_ && curRenderStep_->stepType == GLRStepType::RENDER); +#ifdef _DEBUG + _dbg_assert_(curProgram_); +#endif + GLRRenderData data{ GLRRenderCommand::UNIFORM4UI }; + data.uniform4.loc = loc; + data.uniform4.count = 1; + memcpy(data.uniform4.v, &udata, sizeof(udata)); + curRenderStep_->commands.push_back(data); + } + void SetUniformF(const GLint *loc, int count, const float *udata) { _dbg_assert_(curRenderStep_ && curRenderStep_->stepType == GLRStepType::RENDER); #ifdef _DEBUG diff --git a/Common/GPU/ShaderWriter.cpp b/Common/GPU/ShaderWriter.cpp index 2e05c56f79..b793e48ae5 100644 --- a/Common/GPU/ShaderWriter.cpp +++ b/Common/GPU/ShaderWriter.cpp @@ -23,6 +23,7 @@ const char *hlsl_preamble_fs = "#define vec3 float3\n" "#define vec4 float4\n" "#define uvec3 uint3\n" +"#define uvec4 uint4\n" "#define ivec3 int3\n" "#define ivec4 int4\n" "#define mat4 float4x4\n" diff --git a/Common/GPU/Vulkan/thin3d_vulkan.cpp b/Common/GPU/Vulkan/thin3d_vulkan.cpp index 4fc2890230..b5ac0fb8c1 100644 --- a/Common/GPU/Vulkan/thin3d_vulkan.cpp +++ b/Common/GPU/Vulkan/thin3d_vulkan.cpp @@ -1543,7 +1543,8 @@ void VKContext::BindFramebufferAsRenderTarget(Framebuffer *fbo, const RenderPass void VKContext::BindFramebufferAsTexture(Framebuffer *fbo, int binding, FBChannel channelBit, int attachment) { VKFramebuffer *fb = (VKFramebuffer *)fbo; - // TODO: There are cases where this is okay, actually. + // TODO: There are cases where this is okay, actually. But requires layout transitions and stuff - + // we're not ready for this. _assert_(fb != curFramebuffer_); int aspect = 0; diff --git a/GPU/Common/FragmentShaderGenerator.cpp b/GPU/Common/FragmentShaderGenerator.cpp index e38cba0b9f..5e3f8623c1 100644 --- a/GPU/Common/FragmentShaderGenerator.cpp +++ b/GPU/Common/FragmentShaderGenerator.cpp @@ -80,6 +80,12 @@ bool GenerateFragmentShader(const FShaderID &id, char *buffer, const ShaderLangu bool doFlatShading = id.Bit(FS_BIT_FLATSHADE); bool shaderDepal = id.Bit(FS_BIT_SHADER_DEPAL); bool bgraTexture = id.Bit(FS_BIT_BGRA_TEXTURE); + bool colorWriteMask = id.Bit(FS_BIT_COLOR_WRITEMASK); + + if (colorWriteMask && !compat.bitwiseOps) { + *errorString = "Color Write Mask requires bitwise ops"; + return false; + } GEComparison alphaTestFunc = (GEComparison)id.Bits(FS_BIT_ALPHA_TEST_FUNC, 3); GEComparison colorTestFunc = (GEComparison)id.Bits(FS_BIT_COLOR_TEST_FUNC, 2); @@ -104,7 +110,13 @@ bool GenerateFragmentShader(const FShaderID &id, char *buffer, const ShaderLangu bool earlyFragmentTests = ((!enableAlphaTest && !enableColorTest) || testForceToZero) && !gstate_c.Supports(GPU_ROUND_FRAGMENT_DEPTH_TO_16BIT); bool useAdrenoBugWorkaround = id.Bit(FS_BIT_NO_DEPTH_CANNOT_DISCARD_STENCIL); - bool readFramebufferTex = replaceBlend == REPLACE_BLEND_COPY_FBO && !gstate_c.Supports(GPU_SUPPORTS_ANY_FRAMEBUFFER_FETCH); + bool readFramebuffer = replaceBlend == REPLACE_BLEND_COPY_FBO || colorWriteMask; + bool readFramebufferTex = readFramebuffer && !gstate_c.Supports(GPU_SUPPORTS_ANY_FRAMEBUFFER_FETCH); + + if (readFramebuffer && compat.shaderLanguage == HLSL_D3D9) { + *errorString = "Framebuffer read not yet supported in HLSL D3D9"; + return false; + } if (compat.shaderLanguage == ShaderLanguage::GLSL_VULKAN) { if (earlyFragmentTests) { @@ -188,11 +200,9 @@ bool GenerateFragmentShader(const FShaderID &id, char *buffer, const ShaderLangu } else { WRITE(p, "SamplerState samp : register(s0);\n"); WRITE(p, "Texture2D tex : register(t0);\n"); - if (!isModeClear && replaceBlend > REPLACE_BLEND_STANDARD) { - if (replaceBlend == REPLACE_BLEND_COPY_FBO) { - // No sampler required, we Load - WRITE(p, "Texture2D fboTex : register(t1);\n"); - } + if (readFramebufferTex) { + // No sampler required, we Load + WRITE(p, "Texture2D fboTex : register(t1);\n"); } WRITE(p, "cbuffer base : register(b0) {\n%s};\n", ub_baseStr); } @@ -207,7 +217,7 @@ bool GenerateFragmentShader(const FShaderID &id, char *buffer, const ShaderLangu } if (enableColorTest) { if (compat.shaderLanguage == HLSL_D3D11) { - WRITE(p, "uvec3 roundAndScaleTo255iv(float3 x) { return uvec3(floor(x * 255.0f + 0.5f)); }\n"); + WRITE(p, "uvec3 roundAndScaleTo255iv(float3 x) { return (floor(x * 255.0f + 0.5f)); }\n"); } else { WRITE(p, "vec3 roundAndScaleTo255v(float3 x) { return floor(x * 255.0f + 0.5f); }\n"); } @@ -225,7 +235,7 @@ bool GenerateFragmentShader(const FShaderID &id, char *buffer, const ShaderLangu if (enableFog) { WRITE(p, " float v_fogdepth: TEXCOORD1;\n"); } - if (compat.shaderLanguage == HLSL_D3D11 && ((replaceBlend == REPLACE_BLEND_COPY_FBO) || gstate_c.Supports(GPU_ROUND_FRAGMENT_DEPTH_TO_16BIT))) { + if (compat.shaderLanguage == HLSL_D3D11 && readFramebuffer) { WRITE(p, " vec4 pixelPos : SV_POSITION;\n"); } WRITE(p, "};\n"); @@ -286,14 +296,15 @@ bool GenerateFragmentShader(const FShaderID &id, char *buffer, const ShaderLangu if (doTexture) WRITE(p, "uniform sampler2D tex;\n"); + if (readFramebufferTex) { + if (!compat.texelFetch) { + WRITE(p, "uniform vec2 u_fbotexSize;\n"); + } + WRITE(p, "uniform sampler2D fbotex;\n"); + } + if (!isModeClear && replaceBlend > REPLACE_BLEND_STANDARD) { *uniformMask |= DIRTY_SHADERBLEND; - if (readFramebufferTex) { - if (!compat.texelFetch) { - WRITE(p, "uniform vec2 u_fbotexSize;\n"); - } - WRITE(p, "uniform sampler2D fbotex;\n"); - } if (replaceBlendFuncA >= GE_SRCBLEND_FIXA) { WRITE(p, "uniform vec3 u_blendFixA;\n"); } @@ -329,6 +340,11 @@ bool GenerateFragmentShader(const FShaderID &id, char *buffer, const ShaderLangu *uniformMask |= DIRTY_DEPAL; } + if (colorWriteMask) { + WRITE(p, "uniform uint u_colorWriteMask;\n"); + *uniformMask |= DIRTY_COLORWRITEMASK; + } + if (stencilToAlpha && replaceAlphaWithStencilType == STENCIL_VALUE_UNIFORM) { *uniformMask |= DIRTY_STENCILREPLACEVALUE; WRITE(p, "uniform float u_stencilReplaceValue;\n"); @@ -387,6 +403,20 @@ bool GenerateFragmentShader(const FShaderID &id, char *buffer, const ShaderLangu } + // Provide implementations of packUnorm4x8 and unpackUnorm4x8 if not available. + if (colorWriteMask && compat.shaderLanguage == HLSL_D3D11 || (compat.shaderLanguage == GLSL_3xx && compat.glslVersionNumber < 400)) { + WRITE(p, "uint packUnorm4x8(vec4 v) {\n"); + WRITE(p, " v = clamp(v, 0.0, 1.0);\n"); + WRITE(p, " uvec4 u = uvec4(255.0 * v);\n"); + WRITE(p, " return u.x | (u.y << 8) | (u.z << 16) | (u.w << 24);\n"); + WRITE(p, "}\n"); + + WRITE(p, "vec4 unpackUnorm4x8(uint x) {\n"); + WRITE(p, " uvec4 u = uvec4(x & 0xFFU, (x >> 8) & 0xFFU, (x >> 16) & 0xFFU, (x >> 24) & 0xFFU);\n"); + WRITE(p, " return vec4(u) * (1.0 / 255.0);\n"); + WRITE(p, "}\n"); + } + // PowerVR needs a custom modulo function. For some reason, this has far higher precision than the builtin one. if ((gl_extensions.bugs & BUG_PVR_SHADER_PRECISION_BAD) && needShaderTexClamp) { WRITE(p, "float mymod(float a, float b) { return a - b * floor(a / b); }\n"); @@ -416,6 +446,21 @@ bool GenerateFragmentShader(const FShaderID &id, char *buffer, const ShaderLangu if (isModeClear) { // Clear mode does not allow any fancy shading. WRITE(p, " vec4 v = v_color0;\n"); + + // Masking with clear mode is ok, I think? + if (readFramebuffer) { + if (compat.shaderLanguage == HLSL_D3D11) { + WRITE(p, " vec4 destColor = fboTex.Load(int3((int)In.pixelPos.x, (int)In.pixelPos.y, 0));\n"); + } else if (gstate_c.Supports(GPU_SUPPORTS_ANY_FRAMEBUFFER_FETCH)) { + // If we have NV_shader_framebuffer_fetch / EXT_shader_framebuffer_fetch, we skip the blit. + // We can just read the prev value more directly. + WRITE(p, " lowp vec4 destColor = %s;\n", compat.lastFragData); + } else if (!compat.texelFetch) { + WRITE(p, " lowp vec4 destColor = %s(fbotex, gl_FragCoord.xy * u_fbotexSize.xy);\n", compat.texture); + } else { + WRITE(p, " lowp vec4 destColor = %s(fbotex, ivec2(gl_FragCoord.x, gl_FragCoord.y), 0);\n", compat.texelFetch); + } + } } else { const char *secondary = ""; // Secondary color for specular on top of texture @@ -799,19 +844,22 @@ bool GenerateFragmentShader(const FShaderID &id, char *buffer, const ShaderLangu WRITE(p, " v.rgb = v.rgb * %s;\n", srcFactor); } - if (replaceBlend == REPLACE_BLEND_COPY_FBO && compat.shaderLanguage != HLSL_D3D9) { - // If we have NV_shader_framebuffer_fetch / EXT_shader_framebuffer_fetch, we skip the blit. - // We can just read the prev value more directly. + // Two things read from the old framebuffer - shader replacement blending and bit-level masking. + if (readFramebuffer) { if (compat.shaderLanguage == HLSL_D3D11) { WRITE(p, " vec4 destColor = fboTex.Load(int3((int)In.pixelPos.x, (int)In.pixelPos.y, 0));\n"); } else if (gstate_c.Supports(GPU_SUPPORTS_ANY_FRAMEBUFFER_FETCH)) { + // If we have NV_shader_framebuffer_fetch / EXT_shader_framebuffer_fetch, we skip the blit. + // We can just read the prev value more directly. WRITE(p, " lowp vec4 destColor = %s;\n", compat.lastFragData); } else if (!compat.texelFetch) { WRITE(p, " lowp vec4 destColor = %s(fbotex, gl_FragCoord.xy * u_fbotexSize.xy);\n", compat.texture); } else { WRITE(p, " lowp vec4 destColor = %s(fbotex, ivec2(gl_FragCoord.x, gl_FragCoord.y), 0);\n", compat.texelFetch); } + } + if (replaceBlend == REPLACE_BLEND_COPY_FBO) { const char *srcFactor = nullptr; const char *dstFactor = nullptr; @@ -927,6 +975,7 @@ bool GenerateFragmentShader(const FShaderID &id, char *buffer, const ShaderLangu return false; } + // TODO: This could support more ops using the shader blending mechanism. LogicOpReplaceType replaceLogicOpType = (LogicOpReplaceType)id.Bits(FS_BIT_REPLACE_LOGIC_OP_TYPE, 2); switch (replaceLogicOpType) { case LOGICOPTYPE_ONE: @@ -943,6 +992,17 @@ bool GenerateFragmentShader(const FShaderID &id, char *buffer, const ShaderLangu return false; } + // Final color computed - apply color write mask. + // TODO: Maybe optimize to only do math on the affected channels? + // Or .. meh. + if (colorWriteMask) { + WRITE(p, " highp uint v32 = packUnorm4x8(v);\n"); + WRITE(p, " highp uint d32 = packUnorm4x8(destColor);\n"); + // Note that the mask has been flipped to the PC way - 1 means write. + WRITE(p, " v32 = (v32 & u_colorWriteMask) | (d32 & ~u_colorWriteMask);\n"); + WRITE(p, " v = unpackUnorm4x8(v32);\n"); + } + if (gstate_c.Supports(GPU_ROUND_FRAGMENT_DEPTH_TO_16BIT)) { const double scale = DepthSliceFactor() * 65535.0; diff --git a/GPU/Common/GPUStateUtils.cpp b/GPU/Common/GPUStateUtils.cpp index 7cf550ef85..fc599c6f3e 100644 --- a/GPU/Common/GPUStateUtils.cpp +++ b/GPU/Common/GPUStateUtils.cpp @@ -956,8 +956,68 @@ void ApplyStencilReplaceAndLogicOpIgnoreBlend(ReplaceAlphaType replaceAlphaWithS } } -// Called even if AlphaBlendEnable == false - it also deals with stencil-related blend state. +bool IsColorWriteMaskComplex(bool allowFramebufferRead) { + // Restrict to Outrun temporarily (by uglily reusing the ReinterpretFramebuffers flag) + if (!allowFramebufferRead || !PSP_CoreParameter().compat.flags().ReinterpretFramebuffers) { + // Don't have a choice - we'll make do but it won't always be right. + return false; + } + uint32_t colorMask = (gstate.pmskc & 0xFFFFFF) | (gstate.pmska << 24); + + for (int i = 0; i < 4; i++) { + switch (colorMask & 0xFF) { + case 0x0: + case 0xFF: + break; + default: + return true; + } + colorMask >>= 8; + } + return false; +} + +// If we can we emulate the colorMask by simply toggling the full R G B A masks offered +// by modern hardware, we do that. This is 99.9% of the time. +// When that's not enough, we fall back on a technique similar to shader blending, +// we read from the framebuffer (or a copy of it). +void ConvertMaskState(GenericMaskState &maskState, bool allowFramebufferRead) { + // Invert to convert masks from the PSP's format where 1 is don't draw to PC where 1 is draw. + uint32_t colorMask = ~((gstate.pmskc & 0xFFFFFF) | (gstate.pmska << 24)); + + maskState.applyFramebufferRead = false; + for (int i = 0; i < 4; i++) { + int channelMask = colorMask & 0xFF; + switch (channelMask) { + case 0x0: + maskState.rgba[i] = false; + break; + case 0xFF: + maskState.rgba[i] = true; + break; + default: + if (allowFramebufferRead) { + maskState.applyFramebufferRead = true; + maskState.rgba[i] = true; + } else { + // Use the old heuristic. + maskState.rgba[i] = channelMask >= 128; + } + } + colorMask >>= 8; + } + + // Let's not write to alpha if stencil isn't enabled. + if (IsStencilTestOutputDisabled()) { + maskState.rgba[3] = false; + } else if (ReplaceAlphaWithStencilType() == STENCIL_VALUE_KEEP) { + // If the stencil type is set to KEEP, we shouldn't write to the stencil/alpha channel. + maskState.rgba[3] = false; + } +} + +// Called even if AlphaBlendEnable == false - it also deals with stencil-related blend state. void ConvertBlendState(GenericBlendState &blendState, bool allowFramebufferRead) { // Blending is a bit complex to emulate. This is due to several reasons: // diff --git a/GPU/Common/GPUStateUtils.h b/GPU/Common/GPUStateUtils.h index 9285702066..943754c968 100644 --- a/GPU/Common/GPUStateUtils.h +++ b/GPU/Common/GPUStateUtils.h @@ -1,5 +1,6 @@ #pragma once +#include #include "Common/CommonTypes.h" #include "GPU/ge_constants.h" @@ -25,12 +26,18 @@ enum ReplaceAlphaType { }; enum ReplaceBlendType { - REPLACE_BLEND_NO, + REPLACE_BLEND_NO, // Blend function handled directly with blend states. + REPLACE_BLEND_STANDARD, + + // SRC part of blend function handled in-shader. REPLACE_BLEND_PRE_SRC, REPLACE_BLEND_PRE_SRC_2X_ALPHA, REPLACE_BLEND_2X_ALPHA, REPLACE_BLEND_2X_SRC, + + // Full blend equation runs in shader. + // We might have to make a copy of the framebuffer target to read from. REPLACE_BLEND_COPY_FBO, }; @@ -47,6 +54,9 @@ bool IsAlphaTestAgainstZero(); bool NeedsTestDiscard(); bool IsStencilTestOutputDisabled(); +// If not, we have to emulate it in the shader, similar to blend replace. +bool IsColorMaskSimple(uint32_t colorMask); + StencilValueType ReplaceAlphaWithStencilType(); ReplaceAlphaType ReplaceAlphaWithStencil(ReplaceBlendType replaceBlend); ReplaceBlendType ReplaceBlendWithShader(bool allowShaderBlend, GEBufferFormat bufferFormat); @@ -160,6 +170,15 @@ struct GenericBlendState { void ConvertBlendState(GenericBlendState &blendState, bool allowShaderBlend); void ApplyStencilReplaceAndLogicOpIgnoreBlend(ReplaceAlphaType replaceAlphaWithStencil, GenericBlendState &blendState); +struct GenericMaskState { + bool applyFramebufferRead; + uint32_t uniformMask; // For each bit, opposite to the PSP. + bool rgba[4]; // true = draw, false = don't draw this channel +}; + +void ConvertMaskState(GenericMaskState &maskState, bool allowFramebufferRead); +bool IsColorWriteMaskComplex(bool allowFramebufferRead); + struct GenericStencilFuncState { bool enabled; GEComparison testFunc; diff --git a/GPU/Common/ShaderCommon.h b/GPU/Common/ShaderCommon.h index 4d5a41f077..86ffdaad33 100644 --- a/GPU/Common/ShaderCommon.h +++ b/GPU/Common/ShaderCommon.h @@ -41,7 +41,7 @@ enum DebugShaderStringType { }; // Shared between the backends. Not all are necessarily used by each backend, but this lets us share -// more code than before. +// more code than before. TODO: Can probably cut the number of these down without too much slowdown. enum : uint64_t { DIRTY_PROJMATRIX = 1ULL << 0, DIRTY_PROJTHROUGHMATRIX = 1ULL << 1, @@ -86,12 +86,13 @@ enum : uint64_t { DIRTY_CULLRANGE = 1ULL << 34, DIRTY_DEPAL = 1ULL << 35, + DIRTY_COLORWRITEMASK = 1ULL << 36, - // space for 5 more uniform dirty flags. Remember to update DIRTY_ALL_UNIFORMS. + // space for 4 more uniform dirty flags. Remember to update DIRTY_ALL_UNIFORMS. DIRTY_BONE_UNIFORMS = 0xFF000000ULL, - DIRTY_ALL_UNIFORMS = 0xFFFFFFFFFULL, + DIRTY_ALL_UNIFORMS = 0x1FFFFFFFFFULL, DIRTY_ALL_LIGHTS = DIRTY_LIGHT0 | DIRTY_LIGHT1 | DIRTY_LIGHT2 | DIRTY_LIGHT3, // Other dirty elements that aren't uniforms! diff --git a/GPU/Common/ShaderId.cpp b/GPU/Common/ShaderId.cpp index f69e523900..88ac081cd3 100644 --- a/GPU/Common/ShaderId.cpp +++ b/GPU/Common/ShaderId.cpp @@ -171,6 +171,7 @@ std::string FragmentShaderDesc(const FShaderID &id) { if (id.Bit(FS_BIT_FLATSHADE)) desc << "Flat "; if (id.Bit(FS_BIT_BGRA_TEXTURE)) desc << "BGRA "; if (id.Bit(FS_BIT_SHADER_DEPAL)) desc << "Depal "; + if (id.Bit(FS_BIT_COLOR_WRITEMASK)) desc << "WriteMask "; if (id.Bit(FS_BIT_SHADER_TEX_CLAMP)) { desc << "TClamp"; if (id.Bit(FS_BIT_CLAMP_S)) desc << "S"; @@ -239,6 +240,7 @@ void ComputeFragmentShaderID(FShaderID *id_out, const Draw::Bugs &bugs) { bool doTextureAlpha = gstate.isTextureAlphaUsed(); bool doFlatShading = gstate.getShadeMode() == GE_SHADE_FLAT; bool useShaderDepal = gstate_c.useShaderDepal; + bool colorWriteMask = IsColorWriteMaskComplex(gstate_c.allowFramebufferRead); // Note how we here recompute some of the work already done in state mapping. // Not ideal! At least we share the code. @@ -309,6 +311,7 @@ void ComputeFragmentShaderID(FShaderID *id_out, const Draw::Bugs &bugs) { id.SetBit(FS_BIT_FLATSHADE, doFlatShading); id.SetBit(FS_BIT_SHADER_DEPAL, useShaderDepal); + id.SetBit(FS_BIT_COLOR_WRITEMASK, colorWriteMask); if (g_Config.bVendorBugChecksEnabled) { if (bugs.Has(Draw::Bugs::NO_DEPTH_CANNOT_DISCARD_STENCIL)) { diff --git a/GPU/Common/ShaderId.h b/GPU/Common/ShaderId.h index f28dd588ba..5ae71487ad 100644 --- a/GPU/Common/ShaderId.h +++ b/GPU/Common/ShaderId.h @@ -92,6 +92,7 @@ enum FShaderBit : uint8_t { FS_BIT_BGRA_TEXTURE = 47, FS_BIT_TEST_DISCARD_TO_ZERO = 48, FS_BIT_NO_DEPTH_CANNOT_DISCARD_STENCIL = 49, + FS_BIT_COLOR_WRITEMASK = 50, }; static inline FShaderBit operator +(FShaderBit bit, int i) { diff --git a/GPU/Common/ShaderUniforms.cpp b/GPU/Common/ShaderUniforms.cpp index 46f6a93855..bf2b540db5 100644 --- a/GPU/Common/ShaderUniforms.cpp +++ b/GPU/Common/ShaderUniforms.cpp @@ -203,6 +203,10 @@ void BaseUpdateUniforms(UB_VS_FS_Base *ub, uint64_t dirtyUniforms, bool flipView Uint8x3ToFloat4_AlphaUint8(ub->matAmbient, gstate.materialambient, gstate.getMaterialAmbientA()); } + if (dirtyUniforms & DIRTY_COLORWRITEMASK) { + ub->colorWriteMask = ~((gstate.pmska << 24) | (gstate.pmskc & 0xFFFFFF)); + } + // Texturing if (dirtyUniforms & DIRTY_UVSCALEOFFSET) { const float invW = 1.0f / (float)gstate_c.curTextureWidth; diff --git a/GPU/Common/ShaderUniforms.h b/GPU/Common/ShaderUniforms.h index a2ecf4a71b..0959be328b 100644 --- a/GPU/Common/ShaderUniforms.h +++ b/GPU/Common/ShaderUniforms.h @@ -10,7 +10,7 @@ enum : uint64_t { DIRTY_BASE_UNIFORMS = DIRTY_WORLDMATRIX | DIRTY_PROJTHROUGHMATRIX | DIRTY_VIEWMATRIX | DIRTY_TEXMATRIX | DIRTY_ALPHACOLORREF | DIRTY_PROJMATRIX | DIRTY_FOGCOLOR | DIRTY_FOGCOEF | DIRTY_TEXENV | DIRTY_STENCILREPLACEVALUE | - DIRTY_ALPHACOLORMASK | DIRTY_SHADERBLEND | DIRTY_UVSCALEOFFSET | DIRTY_TEXCLAMP | DIRTY_DEPTHRANGE | DIRTY_MATAMBIENTALPHA | + DIRTY_ALPHACOLORMASK | DIRTY_SHADERBLEND | DIRTY_COLORWRITEMASK | DIRTY_UVSCALEOFFSET | DIRTY_TEXCLAMP | DIRTY_DEPTHRANGE | DIRTY_MATAMBIENTALPHA | DIRTY_BEZIERSPLINE | DIRTY_DEPAL, DIRTY_LIGHT_UNIFORMS = DIRTY_LIGHT0 | DIRTY_LIGHT1 | DIRTY_LIGHT2 | DIRTY_LIGHT3 | @@ -30,10 +30,10 @@ struct UB_VS_FS_Base { float depthRange[4]; float fogCoef[2]; float stencil; float pad0; float matAmbient[4]; - uint32_t spline_counts; uint32_t depal_mask_shift_off_fmt; // 4 params packed into one. - int pad2; int pad3; float cullRangeMin[4]; float cullRangeMax[4]; + uint32_t spline_counts; uint32_t depal_mask_shift_off_fmt; // 4 params packed into one. + uint32_t colorWriteMask; int pad3; // Fragment data float fogColor[4]; float texEnvColor[4]; @@ -56,17 +56,17 @@ R"( mat4 u_proj; vec2 u_fogcoef; float u_stencilReplaceValue; vec4 u_matambientalpha; - uint u_spline_counts; - uint u_depal_mask_shift_off_fmt; - int u_pad2; - int u_pad3; vec4 u_cullRangeMin; vec4 u_cullRangeMax; + uint u_spline_counts; + uint u_depal_mask_shift_off_fmt; + uint u_colorWriteMask; + int u_pad3; vec3 u_fogcolor; vec3 u_texenv; ivec4 u_alphacolorref; ivec4 u_alphacolormask; - vec3 u_blendFixA; + vec3 u_blendFixA; uint colorWriteMask; vec3 u_blendFixB; vec4 u_texclamp; vec2 u_texclampoff; diff --git a/GPU/D3D11/StateMappingD3D11.cpp b/GPU/D3D11/StateMappingD3D11.cpp index 6329495c8c..a6ca5025da 100644 --- a/GPU/D3D11/StateMappingD3D11.cpp +++ b/GPU/D3D11/StateMappingD3D11.cpp @@ -158,6 +158,10 @@ void DrawEngineD3D11::ApplyDrawState(int prim) { // Set blend - unless we need to do it in the shader. GenericBlendState blendState; ConvertBlendState(blendState, gstate_c.allowFramebufferRead); + + GenericMaskState maskState; + ConvertMaskState(maskState, gstate_c.allowFramebufferRead); + if (blendState.applyFramebufferRead) { if (ApplyFramebufferRead(&fboTexNeedsBind_)) { // The shader takes over the responsibility for blending, so recompute. @@ -170,6 +174,7 @@ void DrawEngineD3D11::ApplyDrawState(int prim) { gstate_c.Dirty(DIRTY_FRAGMENTSHADER_STATE); } else if (blendState.resetFramebufferRead) { ResetFramebufferRead(); + gstate_c.Dirty(DIRTY_FRAGMENTSHADER_STATE); } if (blendState.enabled) { @@ -204,38 +209,7 @@ void DrawEngineD3D11::ApplyDrawState(int prim) { } } - // PSP color/alpha mask is per bit but we can only support per byte. - // But let's do that, at least. And let's try a threshold. - bool rmask = (gstate.pmskc & 0xFF) < 128; - bool gmask = ((gstate.pmskc >> 8) & 0xFF) < 128; - bool bmask = ((gstate.pmskc >> 16) & 0xFF) < 128; - bool amask = (gstate.pmska & 0xFF) < 128; - -#ifndef MOBILE_DEVICE - u8 abits = (gstate.pmska >> 0) & 0xFF; - u8 rbits = (gstate.pmskc >> 0) & 0xFF; - u8 gbits = (gstate.pmskc >> 8) & 0xFF; - u8 bbits = (gstate.pmskc >> 16) & 0xFF; - if ((rbits != 0 && rbits != 0xFF) || (gbits != 0 && gbits != 0xFF) || (bbits != 0 && bbits != 0xFF)) { - WARN_LOG_REPORT_ONCE(rgbmask, G3D, "Unsupported RGB mask: r=%02x g=%02x b=%02x", rbits, gbits, bbits); - } - if (abits != 0 && abits != 0xFF) { - // The stencil part of the mask is supported. - WARN_LOG_REPORT_ONCE(amask, G3D, "Unsupported alpha/stencil mask: %02x", abits); - } -#endif - - // Let's not write to alpha if stencil isn't enabled. - if (IsStencilTestOutputDisabled()) { - amask = false; - } else { - // If the stencil type is set to KEEP, we shouldn't write to the stencil/alpha channel. - if (ReplaceAlphaWithStencilType() == STENCIL_VALUE_KEEP) { - amask = false; - } - } - - keys_.blend.colorWriteMask = (rmask ? 1 : 0) | (gmask ? 2 : 0) | (bmask ? 4 : 0) | (amask ? 8 : 0); + keys_.blend.colorWriteMask = (maskState.rgba[0] ? 1 : 0) | (maskState.rgba[1] ? 2 : 0) | (maskState.rgba[2] ? 4 : 0) | (maskState.rgba[3] ? 8 : 0); } if (!device1_) { diff --git a/GPU/Directx9/StateMappingDX9.cpp b/GPU/Directx9/StateMappingDX9.cpp index 99f8860f28..dfb5c5a754 100644 --- a/GPU/Directx9/StateMappingDX9.cpp +++ b/GPU/Directx9/StateMappingDX9.cpp @@ -129,7 +129,10 @@ void DrawEngineDX9::ApplyDrawState(int prim) { GenericBlendState blendState; ConvertBlendState(blendState, gstate_c.allowFramebufferRead); - if (blendState.applyFramebufferRead) { + GenericMaskState maskState; + ConvertMaskState(maskState, gstate_c.allowFramebufferRead); + + if (blendState.applyFramebufferRead || maskState.applyFramebufferRead) { if (ApplyFramebufferRead(&fboTexNeedsBind_)) { // The shader takes over the responsibility for blending, so recompute. ApplyStencilReplaceAndLogicOpIgnoreBlend(blendState.replaceAlphaWithStencil, blendState); @@ -160,24 +163,7 @@ void DrawEngineDX9::ApplyDrawState(int prim) { dxstate.blend.disable(); } - // PSP color/alpha mask is per bit but we can only support per byte. - // But let's do that, at least. And let's try a threshold. - bool rmask = (gstate.pmskc & 0xFF) < 128; - bool gmask = ((gstate.pmskc >> 8) & 0xFF) < 128; - bool bmask = ((gstate.pmskc >> 16) & 0xFF) < 128; - bool amask = (gstate.pmska & 0xFF) < 128; - - // Let's not write to alpha if stencil isn't enabled. - if (IsStencilTestOutputDisabled()) { - amask = false; - } else { - // If the stencil type is set to KEEP, we shouldn't write to the stencil/alpha channel. - if (ReplaceAlphaWithStencilType() == STENCIL_VALUE_KEEP) { - amask = false; - } - } - - dxstate.colorMask.set(rmask, gmask, bmask, amask); + dxstate.colorMask.set(maskState.rgba[0], maskState.rgba[1], maskState.rgba[2], maskState.rgba[3]); } } diff --git a/GPU/GLES/ShaderManagerGLES.cpp b/GPU/GLES/ShaderManagerGLES.cpp index a8d23c88ba..159f0261a7 100644 --- a/GPU/GLES/ShaderManagerGLES.cpp +++ b/GPU/GLES/ShaderManagerGLES.cpp @@ -102,6 +102,7 @@ LinkedShader::LinkedShader(GLRenderManager *render, VShaderID VSID, Shader *vs, queries.push_back({ &u_fogcoef, "u_fogcoef" }); queries.push_back({ &u_alphacolorref, "u_alphacolorref" }); queries.push_back({ &u_alphacolormask, "u_alphacolormask" }); + queries.push_back({ &u_colorWriteMask, "u_colorWriteMask" }); queries.push_back({ &u_stencilReplaceValue, "u_stencilReplaceValue" }); queries.push_back({ &u_testtex, "testtex" }); @@ -377,6 +378,9 @@ void LinkedShader::UpdateUniforms(u32 vertType, const ShaderID &vsid, bool useBu if (dirty & DIRTY_ALPHACOLORMASK) { SetColorUniform3iAlpha(render_, &u_alphacolormask, gstate.colortestmask, gstate.getAlphaTestMask()); } + if (dirty & DIRTY_COLORWRITEMASK) { + render_->SetUniformUI1(&u_colorWriteMask, ~((gstate.pmska << 24) | (gstate.pmskc & 0xFFFFFF))); + } if (dirty & DIRTY_FOGCOLOR) { SetColorUniform3(render_, &u_fogcolor, gstate.fogcolor); } diff --git a/GPU/GLES/ShaderManagerGLES.h b/GPU/GLES/ShaderManagerGLES.h index 71e5541631..f93c9a4d24 100644 --- a/GPU/GLES/ShaderManagerGLES.h +++ b/GPU/GLES/ShaderManagerGLES.h @@ -80,6 +80,7 @@ public: // Fragment processing inputs int u_alphacolorref; int u_alphacolormask; + int u_colorWriteMask; int u_testtex; int u_fogcolor; int u_fogcoef; diff --git a/GPU/GLES/StateMappingGLES.cpp b/GPU/GLES/StateMappingGLES.cpp index 43f9629f7e..cc89eda9b7 100644 --- a/GPU/GLES/StateMappingGLES.cpp +++ b/GPU/GLES/StateMappingGLES.cpp @@ -24,6 +24,7 @@ #include "Common/Profiler/Profiler.h" #include "Common/GPU/OpenGL/GLDebugLog.h" #include "Common/GPU/OpenGL/GLRenderManager.h" +#include "Common/Data/Convert/SmallDataConvert.h" #include "GPU/Math3D.h" #include "GPU/GPUState.h" @@ -140,18 +141,6 @@ void DrawEngineGLES::ApplyDrawState(int prim) { // Start profiling here to skip SetTexture which is already accounted for PROFILE_THIS_SCOPE("applydrawstate"); - // amask is needed for both stencil and blend state so we keep it outside for now - bool amask = (gstate.pmska & 0xFF) < 128; - // Let's not write to alpha if stencil isn't enabled. - if (IsStencilTestOutputDisabled()) { - amask = false; - } else { - // If the stencil type is set to KEEP, we shouldn't write to the stencil/alpha channel. - if (ReplaceAlphaWithStencilType() == STENCIL_VALUE_KEEP) { - amask = false; - } - } - bool useBufferedRendering = framebufferManager_->UseBufferedRendering(); if (gstate_c.IsDirty(DIRTY_BLEND_STATE)) { @@ -169,7 +158,10 @@ void DrawEngineGLES::ApplyDrawState(int prim) { GenericBlendState blendState; ConvertBlendState(blendState, gstate_c.allowFramebufferRead); - if (blendState.applyFramebufferRead) { + GenericMaskState maskState; + ConvertMaskState(maskState, gstate_c.allowFramebufferRead); + + if (blendState.applyFramebufferRead || maskState.applyFramebufferRead) { if (ApplyFramebufferRead(&fboTexNeedsBind_)) { // The shader takes over the responsibility for blending, so recompute. ApplyStencilReplaceAndLogicOpIgnoreBlend(blendState.replaceAlphaWithStencil, blendState); @@ -177,7 +169,6 @@ void DrawEngineGLES::ApplyDrawState(int prim) { // We copy the framebuffer here, as doing so will wipe any blend state if we do it later. if (fboTexNeedsBind_) { // Note that this is positions, not UVs, that we need the copy from. - // TODO: If the device doesn't support blit, this will corrupt the currently applied texture. framebufferManager_->BindFramebufferAsColorTexture(1, framebufferManager_->GetCurrentRenderVFB(), BINDFBCOLOR_MAY_COPY); // If we are rendering at a higher resolution, linear is probably best for the dest color. renderManager->SetTextureSampler(1, GL_CLAMP_TO_EDGE, GL_CLAMP_TO_EDGE, GL_LINEAR, GL_LINEAR, 0.0f); @@ -205,23 +196,13 @@ void DrawEngineGLES::ApplyDrawState(int prim) { } if (blendState.useBlendColor) { uint32_t color = blendState.blendColor; - const float col[4] = { - (float)((color & 0xFF) >> 0) * (1.0f / 255.0f), - (float)((color & 0xFF00) >> 8) * (1.0f / 255.0f), - (float)((color & 0xFF0000) >> 16) * (1.0f / 255.0f), - (float)((color & 0xFF000000) >> 24) * (1.0f / 255.0f), - }; + float col[4]; + Uint8x4ToFloat4(col, color); renderManager->SetBlendFactor(col); } } - // PSP color/alpha mask is per bit but we can only support per byte. - // But let's do that, at least. And let's try a threshold. - bool rmask = (gstate.pmskc & 0xFF) < 128; - bool gmask = ((gstate.pmskc >> 8) & 0xFF) < 128; - bool bmask = ((gstate.pmskc >> 16) & 0xFF) < 128; - - int mask = (int)rmask | ((int)gmask << 1) | ((int)bmask << 2) | ((int)amask << 3); + int mask = (int)maskState.rgba[0] | ((int)maskState.rgba[1] << 1) | ((int)maskState.rgba[2] << 2) | ((int)maskState.rgba[3] << 3); if (blendState.enabled) { renderManager->SetBlendAndMask(mask, blendState.enabled, glBlendFactorLookup[(size_t)blendState.srcColor], glBlendFactorLookup[(size_t)blendState.dstColor], diff --git a/GPU/GPUCommon.cpp b/GPU/GPUCommon.cpp index b32e26f785..a86f7b9963 100644 --- a/GPU/GPUCommon.cpp +++ b/GPU/GPUCommon.cpp @@ -120,8 +120,8 @@ const CommonCommandTableEntry commonCommandTable[] = { { GE_CMD_BLENDMODE, FLAG_FLUSHBEFOREONCHANGE, DIRTY_BLEND_STATE | DIRTY_FRAGMENTSHADER_STATE }, { GE_CMD_BLENDFIXEDA, FLAG_FLUSHBEFOREONCHANGE, DIRTY_BLEND_STATE | DIRTY_FRAGMENTSHADER_STATE }, { GE_CMD_BLENDFIXEDB, FLAG_FLUSHBEFOREONCHANGE, DIRTY_BLEND_STATE | DIRTY_FRAGMENTSHADER_STATE }, - { GE_CMD_MASKRGB, FLAG_FLUSHBEFOREONCHANGE, DIRTY_BLEND_STATE | DIRTY_FRAGMENTSHADER_STATE }, - { GE_CMD_MASKALPHA, FLAG_FLUSHBEFOREONCHANGE, DIRTY_BLEND_STATE | DIRTY_FRAGMENTSHADER_STATE | DIRTY_DEPTHSTENCIL_STATE }, + { GE_CMD_MASKRGB, FLAG_FLUSHBEFOREONCHANGE, DIRTY_BLEND_STATE | DIRTY_FRAGMENTSHADER_STATE | DIRTY_COLORWRITEMASK }, + { GE_CMD_MASKALPHA, FLAG_FLUSHBEFOREONCHANGE, DIRTY_BLEND_STATE | DIRTY_FRAGMENTSHADER_STATE | DIRTY_DEPTHSTENCIL_STATE | DIRTY_COLORWRITEMASK }, { GE_CMD_ZTEST, FLAG_FLUSHBEFOREONCHANGE, DIRTY_DEPTHSTENCIL_STATE }, { GE_CMD_ZTESTENABLE, FLAG_FLUSHBEFOREONCHANGE, DIRTY_DEPTHSTENCIL_STATE | DIRTY_FRAGMENTSHADER_STATE }, { GE_CMD_ZWRITEDISABLE, FLAG_FLUSHBEFOREONCHANGE, DIRTY_DEPTHSTENCIL_STATE | DIRTY_FRAGMENTSHADER_STATE }, diff --git a/GPU/Vulkan/StateMappingVulkan.cpp b/GPU/Vulkan/StateMappingVulkan.cpp index 4d7c5fec13..a636531e53 100644 --- a/GPU/Vulkan/StateMappingVulkan.cpp +++ b/GPU/Vulkan/StateMappingVulkan.cpp @@ -165,7 +165,10 @@ void DrawEngineVulkan::ConvertStateToVulkanKey(FramebufferManagerVulkan &fbManag GenericBlendState blendState; ConvertBlendState(blendState, gstate_c.allowFramebufferRead); - if (blendState.applyFramebufferRead) { + GenericMaskState maskState; + ConvertMaskState(maskState, gstate_c.allowFramebufferRead); + + if (blendState.applyFramebufferRead || maskState.applyFramebufferRead) { if (ApplyFramebufferRead(&fboTexNeedsBind_)) { // The shader takes over the responsibility for blending, so recompute. ApplyStencilReplaceAndLogicOpIgnoreBlend(blendState.replaceAlphaWithStencil, blendState); @@ -178,6 +181,7 @@ void DrawEngineVulkan::ConvertStateToVulkanKey(FramebufferManagerVulkan &fbManag gstate_c.Dirty(DIRTY_FRAGMENTSHADER_STATE); } else if (blendState.resetFramebufferRead) { ResetFramebufferRead(); + gstate_c.Dirty(DIRTY_FRAGMENTSHADER_STATE); } if (blendState.enabled) { @@ -206,24 +210,11 @@ void DrawEngineVulkan::ConvertStateToVulkanKey(FramebufferManagerVulkan &fbManag dynState.useBlendColor = false; } - // PSP color/alpha mask is per bit but we can only support per byte. - // But let's do that, at least. And let's try a threshold. - bool rmask = (gstate.pmskc & 0xFF) < 128; - bool gmask = ((gstate.pmskc >> 8) & 0xFF) < 128; - bool bmask = ((gstate.pmskc >> 16) & 0xFF) < 128; - bool amask = (gstate.pmska & 0xFF) < 128; - - // Let's not write to alpha if stencil isn't enabled. - if (IsStencilTestOutputDisabled()) { - amask = false; - } else { - // If the stencil type is set to KEEP, we shouldn't write to the stencil/alpha channel. - if (ReplaceAlphaWithStencilType() == STENCIL_VALUE_KEEP) { - amask = false; - } - } - - key.colorWriteMask = (rmask ? VK_COLOR_COMPONENT_R_BIT : 0) | (gmask ? VK_COLOR_COMPONENT_G_BIT : 0) | (bmask ? VK_COLOR_COMPONENT_B_BIT : 0) | (amask ? VK_COLOR_COMPONENT_A_BIT : 0); + key.colorWriteMask = + (maskState.rgba[0] ? VK_COLOR_COMPONENT_R_BIT : 0) | + (maskState.rgba[1] ? VK_COLOR_COMPONENT_G_BIT : 0) | + (maskState.rgba[2] ? VK_COLOR_COMPONENT_B_BIT : 0) | + (maskState.rgba[3] ? VK_COLOR_COMPONENT_A_BIT : 0); // Workaround proposed in #10421, for bug where the color write mask is not applied correctly on Adreno. if ((gstate.pmskc & 0x00FFFFFF) == 0x00FFFFFF && g_Config.bVendorBugChecksEnabled && draw_->GetBugs().Has(Draw::Bugs::COLORWRITEMASK_BROKEN_WITH_DEPTHTEST)) { @@ -377,20 +368,16 @@ void DrawEngineVulkan::ConvertStateToVulkanKey(FramebufferManagerVulkan &fbManag } void DrawEngineVulkan::BindShaderBlendTex() { - // At this point, we know if the vertices are full alpha or not. - // TODO: Set the nearest/linear here (since we correctly know if alpha/color tests are needed)? + // TODO: At this point, we know if the vertices are full alpha or not. + // Set the nearest/linear here (since we correctly know if alpha/color tests are needed)? if (!gstate.isModeClear()) { - // TODO: Test texture? if (fboTexNeedsBind_) { - // Note that this is positions, not UVs, that we need the copy from. framebufferManager_->BindFramebufferAsColorTexture(1, framebufferManager_->GetCurrentRenderVFB(), BINDFBCOLOR_MAY_COPY); - // If we are rendering at a higher resolution, linear is probably best for the dest color. boundSecondary_ = (VkImageView)draw_->GetNativeObject(Draw::NativeObject::BOUND_TEXTURE1_IMAGEVIEW); fboTexBound_ = true; fboTexNeedsBind_ = false; } } - } void DrawEngineVulkan::ApplyDrawStateLate(VulkanRenderManager *renderManager, bool applyStencilRef, uint8_t stencilRef, bool useBlendConstant) { diff --git a/assets/compat.ini b/assets/compat.ini index 6cd40f5bc3..2273beb0f3 100644 --- a/assets/compat.ini +++ b/assets/compat.ini @@ -796,9 +796,15 @@ NPUZ00043 = true NPEZ00198 = true # This setting will go away in the near future, hopefully we can enable it -# for all games. +# for all or most games. [ReinterpretFramebuffers] -# Outrun - issue #11358 +# Outrun 2006: Coast to Coast - issue #11358 ULES00262 = true ULUS10064 = true ULKS46087 = true + +# Colin McRae's DiRT 2? +# ULUS10471 = true +# ULJM05533 = true +# NPJH50006 = true + diff --git a/unittest/TestShaderGenerators.cpp b/unittest/TestShaderGenerators.cpp index 46fa217305..6336b97662 100644 --- a/unittest/TestShaderGenerators.cpp +++ b/unittest/TestShaderGenerators.cpp @@ -181,7 +181,7 @@ bool TestReinterpretShaders() { failed = true; return false; } else { - printf("===\n%s\n===\n", buffer); + //printf("===\n%s\n===\n", buffer); } } } @@ -215,25 +215,16 @@ bool TestReinterpretShaders() { return !failed; } +const ShaderLanguage languages[] = { + ShaderLanguage::HLSL_D3D9, + ShaderLanguage::HLSL_D3D11, + ShaderLanguage::GLSL_VULKAN, + ShaderLanguage::GLSL_1xx, + ShaderLanguage::GLSL_3xx, +}; +const int numLanguages = ARRAY_SIZE(languages); -bool TestShaderGenerators() { - LoadD3D11(); - init_glslang(); - LoadD3DCompilerDynamic(); - - if (!TestReinterpretShaders()) { - return false; - } - - ShaderLanguage languages[] = { - ShaderLanguage::HLSL_D3D9, - ShaderLanguage::HLSL_D3D11, - ShaderLanguage::GLSL_VULKAN, - ShaderLanguage::GLSL_1xx, - ShaderLanguage::GLSL_3xx, - }; - const int numLanguages = ARRAY_SIZE(languages); - +bool TestVertexShaders() { char *buffer[numLanguages]; for (int i = 0; i < numLanguages; i++) { @@ -290,8 +281,21 @@ bool TestShaderGenerators() { printf("%d/%d vertex shaders generated (it's normal that it's not all, there are invalid bit combos)\n", successes, count * numLanguages); - successes = 0; - count = 200; + for (int i = 0; i < numLanguages; i++) { + delete[] buffer[i]; + } + return true; +} + +bool TestFragmentShaders() { + char *buffer[numLanguages]; + + for (int i = 0; i < numLanguages; i++) { + buffer[i] = new char[65536]; + } + GMRng rng; + int successes = 0; + int count = 300; // Generate a bunch of random fragment shader IDs, try to generate shader source. // Then compile it and check that it's ok. @@ -337,15 +341,31 @@ bool TestShaderGenerators() { printf("%d/%d fragment shaders generated (it's normal that it's not all, there are invalid bit combos)\n", successes, count * numLanguages); - successes = 0; - count = 200; - - - _CrtCheckMemory(); - for (int i = 0; i < numLanguages; i++) { delete[] buffer[i]; } + return true; +} + +bool TestShaderGenerators() { + LoadD3D11(); + init_glslang(); + LoadD3DCompilerDynamic(); + + if (!TestReinterpretShaders()) { + return false; + } + + if (!TestFragmentShaders()) { + return false; + } + + if (!TestVertexShaders()) { + return false; + } + + _CrtCheckMemory(); + return true; } From 0c3ead1437e3b8da9ba267324d59a5731c376e45 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Mon, 9 Nov 2020 00:30:24 +0100 Subject: [PATCH 230/275] Temporarily disable GL frame-init error checks, see #13639 --- Common/GPU/OpenGL/GLQueueRunner.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Common/GPU/OpenGL/GLQueueRunner.cpp b/Common/GPU/OpenGL/GLQueueRunner.cpp index 597f92cac1..6801a4eeeb 100644 --- a/Common/GPU/OpenGL/GLQueueRunner.cpp +++ b/Common/GPU/OpenGL/GLQueueRunner.cpp @@ -385,7 +385,7 @@ void GLQueueRunner::RunInitSteps(const std::vector &steps, bool ski CHECK_GL_ERROR_IF_DEBUG(); // TODO: Use GL_KHR_no_error or a debug callback, where supported? - if (allocatedTextures) { + if (false && allocatedTextures) { // Users may use replacements or scaling, with high render resolutions, and run out of VRAM. // This detects that, rather than looking like PPSSPP is broken. // Calling glGetError() isn't great, but at the end of init, only after creating textures, shouldn't be too bad... From 50619af71d2c7abd1e04dfa2c27c015f1904d9cd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Mon, 9 Nov 2020 09:10:44 +0100 Subject: [PATCH 231/275] Fix HLSL shader gen issue --- Common/GPU/ShaderWriter.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Common/GPU/ShaderWriter.cpp b/Common/GPU/ShaderWriter.cpp index b793e48ae5..8494a905b5 100644 --- a/Common/GPU/ShaderWriter.cpp +++ b/Common/GPU/ShaderWriter.cpp @@ -30,6 +30,9 @@ const char *hlsl_preamble_fs = "#define mat3x4 float4x3\n" // note how the conventions are backwards "#define splat3(x) float3(x, x, x)\n" "#define mix lerp\n" +"#define lowp\n" +"#define mediump\n" +"#define highp\n" "#define mod(x, y) fmod(x, y)\n"; const char *hlsl_d3d11_preamble_fs = From 669c18a0880412c9ce94b2937305d6c50d05039b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Mon, 9 Nov 2020 11:13:44 +0100 Subject: [PATCH 232/275] Fix crashes on exit (Vulkan). Should help #13223 --- GPU/Common/FramebufferManagerCommon.cpp | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/GPU/Common/FramebufferManagerCommon.cpp b/GPU/Common/FramebufferManagerCommon.cpp index 2a6445e6f1..b96f96b42e 100644 --- a/GPU/Common/FramebufferManagerCommon.cpp +++ b/GPU/Common/FramebufferManagerCommon.cpp @@ -2270,8 +2270,12 @@ void FramebufferManagerCommon::DeviceLost() { } } } - reinterpretSampler_->Release(); - reinterpretVS_->Release(); + if (reinterpretSampler_) { + reinterpretSampler_->Release(); + } + if (reinterpretVS_) { + reinterpretVS_->Release(); + } presentation_->DeviceLost(); draw_ = nullptr; } From 766dbc5a9fd9db44f780dffa0a95d23aa276196a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Mon, 9 Nov 2020 09:00:06 +0100 Subject: [PATCH 233/275] Move ShaderTranslation.cpp/h to Common/GPU. --- CMakeLists.txt | 4 ++-- Common/Common.vcxproj | 2 ++ Common/Common.vcxproj.filters | 8 +++++++- {GPU/Common => Common/GPU}/ShaderTranslation.cpp | 2 +- {GPU/Common => Common/GPU}/ShaderTranslation.h | 0 GPU/Common/PresentationCommon.cpp | 2 +- GPU/D3D11/FramebufferManagerD3D11.cpp | 2 +- GPU/Directx9/FramebufferManagerDX9.cpp | 2 +- GPU/GPU.vcxproj | 2 -- GPU/GPU.vcxproj.filters | 8 +------- GPU/Software/SoftGpu.cpp | 2 +- UWP/CommonUWP/CommonUWP.vcxproj | 2 ++ UWP/CommonUWP/CommonUWP.vcxproj.filters | 6 ++++++ UWP/GPU_UWP/GPU_UWP.vcxproj | 2 -- UWP/GPU_UWP/GPU_UWP.vcxproj.filters | 2 -- android/jni/Android.mk | 2 +- libretro/Makefile.common | 2 +- 17 files changed, 27 insertions(+), 23 deletions(-) rename {GPU/Common => Common/GPU}/ShaderTranslation.cpp (99%) rename {GPU/Common => Common/GPU}/ShaderTranslation.h (100%) diff --git a/CMakeLists.txt b/CMakeLists.txt index 1497230247..516bc256ad 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -500,6 +500,8 @@ add_library(Common STATIC Common/GPU/Shader.h Common/GPU/ShaderWriter.cpp Common/GPU/ShaderWriter.h + Common/GPU/ShaderTranslation.h + Common/GPU/ShaderTranslation.cpp Common/GPU/OpenGL/GLCommon.h Common/GPU/OpenGL/GLDebugLog.cpp Common/GPU/OpenGL/GLDebugLog.h @@ -1362,8 +1364,6 @@ set(GPU_SOURCES GPU/Common/ShaderUniforms.h GPU/Common/ShaderCommon.cpp GPU/Common/ShaderCommon.h - GPU/Common/ShaderTranslation.cpp - GPU/Common/ShaderTranslation.h GPU/Common/SplineCommon.cpp GPU/Common/SplineCommon.h GPU/Common/StencilCommon.cpp diff --git a/Common/Common.vcxproj b/Common/Common.vcxproj index fe60080c88..b58a19d289 100644 --- a/Common/Common.vcxproj +++ b/Common/Common.vcxproj @@ -430,6 +430,7 @@ + @@ -753,6 +754,7 @@ + diff --git a/Common/Common.vcxproj.filters b/Common/Common.vcxproj.filters index 4f5d867492..3a7dbc7980 100644 --- a/Common/Common.vcxproj.filters +++ b/Common/Common.vcxproj.filters @@ -384,6 +384,9 @@ Data\Collections + + GPU + @@ -738,6 +741,9 @@ GPU + + GPU + @@ -853,4 +859,4 @@ Math\fast - + \ No newline at end of file diff --git a/GPU/Common/ShaderTranslation.cpp b/Common/GPU/ShaderTranslation.cpp similarity index 99% rename from GPU/Common/ShaderTranslation.cpp rename to Common/GPU/ShaderTranslation.cpp index 4307bfcf93..229f0e29e5 100644 --- a/GPU/Common/ShaderTranslation.cpp +++ b/Common/GPU/ShaderTranslation.cpp @@ -38,7 +38,7 @@ #include "Common/StringUtils.h" #include "Common/GPU/Shader.h" -#include "GPU/Common/ShaderTranslation.h" +#include "Common/GPU/ShaderTranslation.h" #include "ext/glslang/SPIRV/GlslangToSpv.h" #include "Common/GPU/thin3d.h" #include "Common/GPU/OpenGL/GLFeatures.h" diff --git a/GPU/Common/ShaderTranslation.h b/Common/GPU/ShaderTranslation.h similarity index 100% rename from GPU/Common/ShaderTranslation.h rename to Common/GPU/ShaderTranslation.h diff --git a/GPU/Common/PresentationCommon.cpp b/GPU/Common/PresentationCommon.cpp index d60dd3447c..01f698e5b7 100644 --- a/GPU/Common/PresentationCommon.cpp +++ b/GPU/Common/PresentationCommon.cpp @@ -33,7 +33,7 @@ #include "Core/HLE/sceDisplay.h" #include "GPU/Common/PostShader.h" #include "GPU/Common/PresentationCommon.h" -#include "GPU/Common/ShaderTranslation.h" +#include "Common/GPU/ShaderTranslation.h" struct Vertex { float x, y, z; diff --git a/GPU/D3D11/FramebufferManagerD3D11.cpp b/GPU/D3D11/FramebufferManagerD3D11.cpp index 97e5615551..71234a69c9 100644 --- a/GPU/D3D11/FramebufferManagerD3D11.cpp +++ b/GPU/D3D11/FramebufferManagerD3D11.cpp @@ -36,7 +36,7 @@ #include "GPU/Debugger/Stepping.h" #include "GPU/Common/FramebufferManagerCommon.h" #include "GPU/Common/PresentationCommon.h" -#include "GPU/Common/ShaderTranslation.h" +#include "Common/GPU/ShaderTranslation.h" #include "GPU/Common/TextureDecoder.h" #include "GPU/D3D11/FramebufferManagerD3D11.h" #include "GPU/D3D11/ShaderManagerD3D11.h" diff --git a/GPU/Directx9/FramebufferManagerDX9.cpp b/GPU/Directx9/FramebufferManagerDX9.cpp index 24c8799dc5..9d3b631e10 100644 --- a/GPU/Directx9/FramebufferManagerDX9.cpp +++ b/GPU/Directx9/FramebufferManagerDX9.cpp @@ -31,7 +31,7 @@ #include "Common/GPU/D3D9/D3D9StateCache.h" #include "GPU/Common/FramebufferManagerCommon.h" #include "GPU/Common/PresentationCommon.h" -#include "GPU/Common/ShaderTranslation.h" +#include "Common/GPU/ShaderTranslation.h" #include "GPU/Common/TextureDecoder.h" #include "GPU/Directx9/FramebufferManagerDX9.h" #include "GPU/Directx9/ShaderManagerDX9.h" diff --git a/GPU/GPU.vcxproj b/GPU/GPU.vcxproj index 4f2550f635..8f9e2404b6 100644 --- a/GPU/GPU.vcxproj +++ b/GPU/GPU.vcxproj @@ -350,7 +350,6 @@ - @@ -488,7 +487,6 @@ - diff --git a/GPU/GPU.vcxproj.filters b/GPU/GPU.vcxproj.filters index 2c800c5e5c..fff4ea4a51 100644 --- a/GPU/GPU.vcxproj.filters +++ b/GPU/GPU.vcxproj.filters @@ -222,9 +222,6 @@ D3D11 - - Common - Software @@ -485,9 +482,6 @@ D3D11 - - Common - Common @@ -546,4 +540,4 @@ Common - + \ No newline at end of file diff --git a/GPU/Software/SoftGpu.cpp b/GPU/Software/SoftGpu.cpp index 7016f0b001..7f3547c401 100644 --- a/GPU/Software/SoftGpu.cpp +++ b/GPU/Software/SoftGpu.cpp @@ -41,7 +41,7 @@ #include "GPU/Software/TransformUnit.h" #include "GPU/Common/DrawEngineCommon.h" #include "GPU/Common/PresentationCommon.h" -#include "GPU/Common/ShaderTranslation.h" +#include "Common/GPU/ShaderTranslation.h" #include "GPU/Common/SplineCommon.h" #include "GPU/Debugger/Debugger.h" #include "GPU/Debugger/Record.h" diff --git a/UWP/CommonUWP/CommonUWP.vcxproj b/UWP/CommonUWP/CommonUWP.vcxproj index 56f207c60f..bf2b16ea49 100644 --- a/UWP/CommonUWP/CommonUWP.vcxproj +++ b/UWP/CommonUWP/CommonUWP.vcxproj @@ -420,6 +420,7 @@ + @@ -539,6 +540,7 @@ + diff --git a/UWP/CommonUWP/CommonUWP.vcxproj.filters b/UWP/CommonUWP/CommonUWP.vcxproj.filters index 8c7551735d..c0fb4df3ec 100644 --- a/UWP/CommonUWP/CommonUWP.vcxproj.filters +++ b/UWP/CommonUWP/CommonUWP.vcxproj.filters @@ -369,6 +369,9 @@ GPU + + GPU + @@ -674,6 +677,9 @@ GPU + + GPU + diff --git a/UWP/GPU_UWP/GPU_UWP.vcxproj b/UWP/GPU_UWP/GPU_UWP.vcxproj index fcf535af3d..e241137cf6 100644 --- a/UWP/GPU_UWP/GPU_UWP.vcxproj +++ b/UWP/GPU_UWP/GPU_UWP.vcxproj @@ -391,7 +391,6 @@ - @@ -449,7 +448,6 @@ - diff --git a/UWP/GPU_UWP/GPU_UWP.vcxproj.filters b/UWP/GPU_UWP/GPU_UWP.vcxproj.filters index 58617e8b91..0c5f3538bb 100644 --- a/UWP/GPU_UWP/GPU_UWP.vcxproj.filters +++ b/UWP/GPU_UWP/GPU_UWP.vcxproj.filters @@ -11,7 +11,6 @@ - @@ -70,7 +69,6 @@ - diff --git a/android/jni/Android.mk b/android/jni/Android.mk index f0dde080ea..a6cdedb5bd 100644 --- a/android/jni/Android.mk +++ b/android/jni/Android.mk @@ -254,6 +254,7 @@ EXEC_AND_LIB_FILES := \ $(SRC)/Common/GPU/thin3d.cpp \ $(SRC)/Common/GPU/Shader.cpp \ $(SRC)/Common/GPU/ShaderWriter.cpp \ + $(SRC)/Common/GPU/ShaderTranslation.cpp \ $(SRC)/Common/Render/DrawBuffer.cpp \ $(SRC)/Common/Render/TextureAtlas.cpp \ $(SRC)/Common/Render/Text/draw_text.cpp \ @@ -321,7 +322,6 @@ EXEC_AND_LIB_FILES := \ $(SRC)/GPU/Common/TextureCacheCommon.cpp.arm \ $(SRC)/GPU/Common/TextureScalerCommon.cpp.arm \ $(SRC)/GPU/Common/ShaderCommon.cpp \ - $(SRC)/GPU/Common/ShaderTranslation.cpp \ $(SRC)/GPU/Common/StencilCommon.cpp \ $(SRC)/GPU/Common/SplineCommon.cpp.arm \ $(SRC)/GPU/Common/DrawEngineCommon.cpp.arm \ diff --git a/libretro/Makefile.common b/libretro/Makefile.common index 72c79b7129..2fb57db46e 100644 --- a/libretro/Makefile.common +++ b/libretro/Makefile.common @@ -168,6 +168,7 @@ SOURCES_CXX += \ $(COMMONDIR)/GPU/thin3d.cpp \ $(COMMONDIR)/GPU/Shader.cpp \ $(COMMONDIR)/GPU/ShaderWriter.cpp \ + $(COMMONDIR)/GPU/ShaderTranslation.cpp \ $(COMMONDIR)/GPU/OpenGL/thin3d_gl.cpp \ $(COMMONDIR)/GPU/OpenGL/GLDebugLog.cpp \ $(COMMONDIR)/GPU/OpenGL/GLSLProgram.cpp \ @@ -238,7 +239,6 @@ SOURCES_CXX += \ $(GPUCOMMONDIR)/ShaderId.cpp \ $(GPUCOMMONDIR)/ShaderCommon.cpp \ $(GPUCOMMONDIR)/ShaderUniforms.cpp \ - $(GPUCOMMONDIR)/ShaderTranslation.cpp \ $(GPUCOMMONDIR)/GPUDebugInterface.cpp \ $(GPUCOMMONDIR)/DepalettizeShaderCommon.cpp \ $(GPUCOMMONDIR)/TransformCommon.cpp \ From 864cc54aa43d40368483e58cb7e04a42c96f9ded Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Mon, 9 Nov 2020 09:02:59 +0100 Subject: [PATCH 234/275] Remove ForceGL2 flag. Add comments... hm. --- Common/GPU/OpenGL/GLFeatures.cpp | 9 --------- Common/GPU/OpenGL/GLFeatures.h | 1 - Common/GPU/OpenGL/thin3d_gl.cpp | 4 +++- 3 files changed, 3 insertions(+), 11 deletions(-) diff --git a/Common/GPU/OpenGL/GLFeatures.cpp b/Common/GPU/OpenGL/GLFeatures.cpp index df8632779c..9b7070e458 100644 --- a/Common/GPU/OpenGL/GLFeatures.cpp +++ b/Common/GPU/OpenGL/GLFeatures.cpp @@ -541,15 +541,6 @@ void CheckGLExtensions() { } } -#ifdef __APPLE__ - if (!gl_extensions.IsGLES && !gl_extensions.IsCoreContext) { - // Apple doesn't allow OpenGL 3.x+ in compatibility contexts. - // TODO: But are we still ever creating these on Apple? Would really - // like to kill this ForceGL2 flag. - gl_extensions.ForceGL2 = true; - } -#endif - ProcessGPUFeatures(); int error = glGetError(); diff --git a/Common/GPU/OpenGL/GLFeatures.h b/Common/GPU/OpenGL/GLFeatures.h index f4da0ce221..996285073d 100644 --- a/Common/GPU/OpenGL/GLFeatures.h +++ b/Common/GPU/OpenGL/GLFeatures.h @@ -38,7 +38,6 @@ struct GLExtensions { bool IsGLES; bool IsCoreContext; bool GLES3; // true if the full OpenGL ES 3.0 is supported - bool ForceGL2; // OES bool OES_depth24; diff --git a/Common/GPU/OpenGL/thin3d_gl.cpp b/Common/GPU/OpenGL/thin3d_gl.cpp index e789c987df..b0da1da636 100644 --- a/Common/GPU/OpenGL/thin3d_gl.cpp +++ b/Common/GPU/OpenGL/thin3d_gl.cpp @@ -632,7 +632,7 @@ OpenGLContext::OpenGLContext() { } } } else { - if (!gl_extensions.ForceGL2 || gl_extensions.IsCoreContext) { + if (gl_extensions.IsCoreContext) { if (gl_extensions.VersionGEThan(3, 3, 0)) { shaderLanguageDesc_.shaderLanguage = ShaderLanguage::GLSL_3xx; shaderLanguageDesc_.glslVersionNumber = 330; @@ -645,12 +645,14 @@ OpenGLContext::OpenGLContext() { shaderLanguageDesc_.varying_fs = "in"; shaderLanguageDesc_.attribute = "in"; } else if (gl_extensions.VersionGEThan(3, 0, 0)) { + // Hm, I think this is wrong. This should be outside "if (gl_extensions.IsCoreContext)". shaderLanguageDesc_.shaderLanguage = ShaderLanguage::GLSL_1xx; shaderLanguageDesc_.glslVersionNumber = 130; shaderLanguageDesc_.fragColor0 = "fragColor0"; shaderLanguageDesc_.bitwiseOps = true; shaderLanguageDesc_.texelFetch = "texelFetch"; } else { + // This too... shaderLanguageDesc_.shaderLanguage = ShaderLanguage::GLSL_1xx; shaderLanguageDesc_.glslVersionNumber = 110; if (gl_extensions.EXT_gpu_shader4) { From e77a9d73682c00ca30c000a78084501bb9f7c206 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Mon, 9 Nov 2020 09:07:52 +0100 Subject: [PATCH 235/275] Reorganize the end of the fragment shader generator. Thanks unknown. --- Common/GPU/Shader.cpp | 8 ++++++-- GPU/Common/FragmentShaderGenerator.cpp | 25 ++++++++++--------------- unittest/TestShaderGenerators.cpp | 7 ++----- 3 files changed, 18 insertions(+), 22 deletions(-) diff --git a/Common/GPU/Shader.cpp b/Common/GPU/Shader.cpp index 43943449cc..077ad92c21 100644 --- a/Common/GPU/Shader.cpp +++ b/Common/GPU/Shader.cpp @@ -58,8 +58,12 @@ void ShaderLanguageDesc::Init(ShaderLanguage lang) { break; case HLSL_D3D9: case HLSL_D3D11: - fragColor0 = "outfragment.target"; - fragColor1 = "outfragment.target1"; + if (lang == HLSL_D3D11) { + fragColor0 = "outfragment.target"; + fragColor1 = "outfragment.target1"; + } else { + fragColor0 = "target"; + } varying_fs = "in"; varying_vs = "out"; attribute = "in"; diff --git a/GPU/Common/FragmentShaderGenerator.cpp b/GPU/Common/FragmentShaderGenerator.cpp index 5e3f8623c1..1cbd02c1b9 100644 --- a/GPU/Common/FragmentShaderGenerator.cpp +++ b/GPU/Common/FragmentShaderGenerator.cpp @@ -427,6 +427,7 @@ bool GenerateFragmentShader(const FShaderID &id, char *buffer, const ShaderLangu WRITE(p, " PS_OUT outfragment;\n"); } else if (compat.shaderLanguage == HLSL_D3D9) { WRITE(p, "vec4 main( PS_IN In ) : COLOR {\n"); + WRITE(p, " vec4 target;\n"); } else { WRITE(p, "void main() {\n"); } @@ -959,15 +960,16 @@ bool GenerateFragmentShader(const FShaderID &id, char *buffer, const ShaderLangu switch (stencilToAlpha) { case REPLACE_ALPHA_DUALSOURCE: - // Handled at the end. + WRITE(p, " %s = vec4(v.rgb, %s);\n", compat.fragColor0, replacedAlpha); + WRITE(p, " %s = vec4(0.0, 0.0, 0.0, v.a);\n", compat.fragColor1); break; case REPLACE_ALPHA_YES: - WRITE(p, " v.a = %s;\n", replacedAlpha); + WRITE(p, " %s = vec4(v.rgb, %s);\n", compat.fragColor0, replacedAlpha); break; case REPLACE_ALPHA_NO: - // Nothing to do. + WRITE(p, " %s = v;\n", compat.fragColor0); break; default: @@ -979,10 +981,10 @@ bool GenerateFragmentShader(const FShaderID &id, char *buffer, const ShaderLangu LogicOpReplaceType replaceLogicOpType = (LogicOpReplaceType)id.Bits(FS_BIT_REPLACE_LOGIC_OP_TYPE, 2); switch (replaceLogicOpType) { case LOGICOPTYPE_ONE: - WRITE(p, " v.rgb = splat3(1.0);\n"); + WRITE(p, " %s.rgb = splat3(1.0);\n", compat.fragColor0); break; case LOGICOPTYPE_INVERT: - WRITE(p, " v.rgb = splat3(1.0) - v.rgb;\n"); + WRITE(p, " %s.rgb = splat3(1.0) - %s.rgb;\n", compat.fragColor0, compat.fragColor0); break; case LOGICOPTYPE_NORMAL: break; @@ -996,11 +998,11 @@ bool GenerateFragmentShader(const FShaderID &id, char *buffer, const ShaderLangu // TODO: Maybe optimize to only do math on the affected channels? // Or .. meh. if (colorWriteMask) { - WRITE(p, " highp uint v32 = packUnorm4x8(v);\n"); + WRITE(p, " highp uint v32 = packUnorm4x8(%s);\n", compat.fragColor0); WRITE(p, " highp uint d32 = packUnorm4x8(destColor);\n"); // Note that the mask has been flipped to the PC way - 1 means write. WRITE(p, " v32 = (v32 & u_colorWriteMask) | (d32 & ~u_colorWriteMask);\n"); - WRITE(p, " v = unpackUnorm4x8(v32);\n"); + WRITE(p, " %s = unpackUnorm4x8(v32);\n", compat.fragColor0); } if (gstate_c.Supports(GPU_ROUND_FRAGMENT_DEPTH_TO_16BIT)) { @@ -1025,17 +1027,10 @@ bool GenerateFragmentShader(const FShaderID &id, char *buffer, const ShaderLangu WRITE(p, " gl_FragDepth = gl_FragCoord.z;\n"); } - if (stencilToAlpha == REPLACE_ALPHA_DUALSOURCE) { - WRITE(p, " %s = vec4(v.rgb, %s);\n", compat.fragColor0, replacedAlpha); - WRITE(p, " %s = vec4(0.0, 0.0, 0.0, v.a);\n", compat.fragColor1); - } else if (compat.shaderLanguage != HLSL_D3D9) { - WRITE(p, " %s = v;\n", compat.fragColor0); - } - if (compat.shaderLanguage == HLSL_D3D11) { WRITE(p, " return outfragment;\n"); } else if (compat.shaderLanguage == HLSL_D3D9) { - WRITE(p, " return v;\n"); + WRITE(p, " return target;\n"); } WRITE(p, "}\n"); diff --git a/unittest/TestShaderGenerators.cpp b/unittest/TestShaderGenerators.cpp index 6336b97662..88fa67f439 100644 --- a/unittest/TestShaderGenerators.cpp +++ b/unittest/TestShaderGenerators.cpp @@ -352,11 +352,11 @@ bool TestShaderGenerators() { init_glslang(); LoadD3DCompilerDynamic(); - if (!TestReinterpretShaders()) { + if (!TestFragmentShaders()) { return false; } - if (!TestFragmentShaders()) { + if (!TestReinterpretShaders()) { return false; } @@ -364,8 +364,5 @@ bool TestShaderGenerators() { return false; } - _CrtCheckMemory(); - - return true; } From 2384b7a17deb8020333bbb14e49e7c06f1324d90 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Mon, 9 Nov 2020 13:31:39 +0100 Subject: [PATCH 236/275] Remove support for NV_shader_framebuffer_fetch extension, very old and rare. Minor refactor. --- Common/GPU/OpenGL/GLFeatures.cpp | 1 - Common/GPU/OpenGL/GLFeatures.h | 1 - Common/GPU/OpenGL/thin3d_gl.cpp | 6 +--- GPU/Common/FragmentShaderGenerator.cpp | 45 +++++++++----------------- GPU/GLES/GPU_GLES.cpp | 2 +- 5 files changed, 17 insertions(+), 38 deletions(-) diff --git a/Common/GPU/OpenGL/GLFeatures.cpp b/Common/GPU/OpenGL/GLFeatures.cpp index df8632779c..c210049f0c 100644 --- a/Common/GPU/OpenGL/GLFeatures.cpp +++ b/Common/GPU/OpenGL/GLFeatures.cpp @@ -367,7 +367,6 @@ void CheckGLExtensions() { gl_extensions.EXT_blend_minmax = g_set_gl_extensions.count("GL_EXT_blend_minmax") != 0; gl_extensions.EXT_unpack_subimage = g_set_gl_extensions.count("GL_EXT_unpack_subimage") != 0; gl_extensions.EXT_shader_framebuffer_fetch = g_set_gl_extensions.count("GL_EXT_shader_framebuffer_fetch") != 0; - gl_extensions.NV_shader_framebuffer_fetch = g_set_gl_extensions.count("GL_NV_shader_framebuffer_fetch") != 0; gl_extensions.ARM_shader_framebuffer_fetch = g_set_gl_extensions.count("GL_ARM_shader_framebuffer_fetch") != 0; gl_extensions.OES_texture_float = g_set_gl_extensions.count("GL_OES_texture_float") != 0; gl_extensions.EXT_buffer_storage = g_set_gl_extensions.count("GL_EXT_buffer_storage") != 0; diff --git a/Common/GPU/OpenGL/GLFeatures.h b/Common/GPU/OpenGL/GLFeatures.h index f4da0ce221..db1502f06c 100644 --- a/Common/GPU/OpenGL/GLFeatures.h +++ b/Common/GPU/OpenGL/GLFeatures.h @@ -85,7 +85,6 @@ struct GLExtensions { bool EXT_clip_cull_distance; // NV - bool NV_shader_framebuffer_fetch; bool NV_copy_image; bool NV_framebuffer_blit; bool NV_pixel_buffer_object; // GL_NV_pixel_buffer_object diff --git a/Common/GPU/OpenGL/thin3d_gl.cpp b/Common/GPU/OpenGL/thin3d_gl.cpp index e789c987df..241b824aec 100644 --- a/Common/GPU/OpenGL/thin3d_gl.cpp +++ b/Common/GPU/OpenGL/thin3d_gl.cpp @@ -662,14 +662,10 @@ OpenGLContext::OpenGLContext() { } if (gl_extensions.IsGLES && gl_extensions.GLES3) { - caps_.framebufferFetchSupported = (gl_extensions.EXT_shader_framebuffer_fetch || gl_extensions.NV_shader_framebuffer_fetch || gl_extensions.ARM_shader_framebuffer_fetch); + caps_.framebufferFetchSupported = (gl_extensions.EXT_shader_framebuffer_fetch || gl_extensions.ARM_shader_framebuffer_fetch); if (gl_extensions.EXT_shader_framebuffer_fetch) { shaderLanguageDesc_.framebufferFetchExtension = "#extension GL_EXT_shader_framebuffer_fetch : require"; shaderLanguageDesc_.lastFragData = "gl_LastFragData[0]"; - } else if (gl_extensions.NV_shader_framebuffer_fetch) { - // GL_NV_shader_framebuffer_fetch is available on mobile platform and ES 2.0 only but not on desktop. - shaderLanguageDesc_.framebufferFetchExtension = "#extension GL_NV_shader_framebuffer_fetch : require"; - shaderLanguageDesc_.lastFragData = "gl_LastFragData[0]"; } else if (gl_extensions.ARM_shader_framebuffer_fetch) { shaderLanguageDesc_.framebufferFetchExtension = "#extension GL_ARM_shader_framebuffer_fetch : require"; shaderLanguageDesc_.lastFragData = "gl_LastFragColorARM"; diff --git a/GPU/Common/FragmentShaderGenerator.cpp b/GPU/Common/FragmentShaderGenerator.cpp index 5e3f8623c1..5616235251 100644 --- a/GPU/Common/FragmentShaderGenerator.cpp +++ b/GPU/Common/FragmentShaderGenerator.cpp @@ -443,24 +443,24 @@ bool GenerateFragmentShader(const FShaderID &id, char *buffer, const ShaderLangu } } + // Two things read from the old framebuffer - shader replacement blending and bit-level masking. + if (readFramebuffer) { + if (compat.shaderLanguage == HLSL_D3D11) { + WRITE(p, " vec4 destColor = fboTex.Load(int3((int)In.pixelPos.x, (int)In.pixelPos.y, 0));\n"); + } else if (gstate_c.Supports(GPU_SUPPORTS_ANY_FRAMEBUFFER_FETCH)) { + // If we have EXT_shader_framebuffer_fetch / ARM_shader_framebuffer_fetch, we skip the blit. + // We can just read the prev value more directly. + WRITE(p, " lowp vec4 destColor = %s;\n", compat.lastFragData); + } else if (!compat.texelFetch) { + WRITE(p, " lowp vec4 destColor = %s(fbotex, gl_FragCoord.xy * u_fbotexSize.xy);\n", compat.texture); + } else { + WRITE(p, " lowp vec4 destColor = %s(fbotex, ivec2(gl_FragCoord.x, gl_FragCoord.y), 0);\n", compat.texelFetch); + } + } + if (isModeClear) { // Clear mode does not allow any fancy shading. WRITE(p, " vec4 v = v_color0;\n"); - - // Masking with clear mode is ok, I think? - if (readFramebuffer) { - if (compat.shaderLanguage == HLSL_D3D11) { - WRITE(p, " vec4 destColor = fboTex.Load(int3((int)In.pixelPos.x, (int)In.pixelPos.y, 0));\n"); - } else if (gstate_c.Supports(GPU_SUPPORTS_ANY_FRAMEBUFFER_FETCH)) { - // If we have NV_shader_framebuffer_fetch / EXT_shader_framebuffer_fetch, we skip the blit. - // We can just read the prev value more directly. - WRITE(p, " lowp vec4 destColor = %s;\n", compat.lastFragData); - } else if (!compat.texelFetch) { - WRITE(p, " lowp vec4 destColor = %s(fbotex, gl_FragCoord.xy * u_fbotexSize.xy);\n", compat.texture); - } else { - WRITE(p, " lowp vec4 destColor = %s(fbotex, ivec2(gl_FragCoord.x, gl_FragCoord.y), 0);\n", compat.texelFetch); - } - } } else { const char *secondary = ""; // Secondary color for specular on top of texture @@ -844,21 +844,6 @@ bool GenerateFragmentShader(const FShaderID &id, char *buffer, const ShaderLangu WRITE(p, " v.rgb = v.rgb * %s;\n", srcFactor); } - // Two things read from the old framebuffer - shader replacement blending and bit-level masking. - if (readFramebuffer) { - if (compat.shaderLanguage == HLSL_D3D11) { - WRITE(p, " vec4 destColor = fboTex.Load(int3((int)In.pixelPos.x, (int)In.pixelPos.y, 0));\n"); - } else if (gstate_c.Supports(GPU_SUPPORTS_ANY_FRAMEBUFFER_FETCH)) { - // If we have NV_shader_framebuffer_fetch / EXT_shader_framebuffer_fetch, we skip the blit. - // We can just read the prev value more directly. - WRITE(p, " lowp vec4 destColor = %s;\n", compat.lastFragData); - } else if (!compat.texelFetch) { - WRITE(p, " lowp vec4 destColor = %s(fbotex, gl_FragCoord.xy * u_fbotexSize.xy);\n", compat.texture); - } else { - WRITE(p, " lowp vec4 destColor = %s(fbotex, ivec2(gl_FragCoord.x, gl_FragCoord.y), 0);\n", compat.texelFetch); - } - } - if (replaceBlend == REPLACE_BLEND_COPY_FBO) { const char *srcFactor = nullptr; const char *dstFactor = nullptr; diff --git a/GPU/GLES/GPU_GLES.cpp b/GPU/GLES/GPU_GLES.cpp index ea55a990ed..192c7f832b 100644 --- a/GPU/GLES/GPU_GLES.cpp +++ b/GPU/GLES/GPU_GLES.cpp @@ -175,7 +175,7 @@ void GPU_GLES::CheckGPUFeatures() { } } - if (gl_extensions.EXT_shader_framebuffer_fetch || gl_extensions.NV_shader_framebuffer_fetch || gl_extensions.ARM_shader_framebuffer_fetch) { + if (gl_extensions.EXT_shader_framebuffer_fetch || gl_extensions.ARM_shader_framebuffer_fetch) { // This has caused problems in the past. Let's only enable on GLES3. if (features & GPU_SUPPORTS_GLSL_ES_300) { features |= GPU_SUPPORTS_ANY_FRAMEBUFFER_FETCH; From 69108ab2e9d2ee15aec24271d36c878426e660cb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Mon, 9 Nov 2020 13:32:49 +0100 Subject: [PATCH 237/275] On GLES3, GL_EXT_shader_framebuffer_fetch works a little differently. --- Common/GPU/OpenGL/thin3d_gl.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Common/GPU/OpenGL/thin3d_gl.cpp b/Common/GPU/OpenGL/thin3d_gl.cpp index 241b824aec..4bd74e6183 100644 --- a/Common/GPU/OpenGL/thin3d_gl.cpp +++ b/Common/GPU/OpenGL/thin3d_gl.cpp @@ -661,11 +661,11 @@ OpenGLContext::OpenGLContext() { } } - if (gl_extensions.IsGLES && gl_extensions.GLES3) { + if (gl_extensions.IsGLES) { caps_.framebufferFetchSupported = (gl_extensions.EXT_shader_framebuffer_fetch || gl_extensions.ARM_shader_framebuffer_fetch); if (gl_extensions.EXT_shader_framebuffer_fetch) { shaderLanguageDesc_.framebufferFetchExtension = "#extension GL_EXT_shader_framebuffer_fetch : require"; - shaderLanguageDesc_.lastFragData = "gl_LastFragData[0]"; + shaderLanguageDesc_.lastFragData = gl_extensions.GLES3 ? "fragColor0" : "gl_LastFragData[0]"; } else if (gl_extensions.ARM_shader_framebuffer_fetch) { shaderLanguageDesc_.framebufferFetchExtension = "#extension GL_ARM_shader_framebuffer_fetch : require"; shaderLanguageDesc_.lastFragData = "gl_LastFragColorARM"; From 1f494cf234c4d17a40d949764c864ca459204a53 Mon Sep 17 00:00:00 2001 From: sum2012 Date: Mon, 9 Nov 2020 20:57:40 +0800 Subject: [PATCH 238/275] Mpeg:Revert part of https://github.com/hrydgard/ppsspp/commit/fa59be7e5db1526d07de75f6d7c14b94e98809e6 Fix #13595 --- Core/HLE/sceMpeg.cpp | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/Core/HLE/sceMpeg.cpp b/Core/HLE/sceMpeg.cpp index 6a10183fab..67d7222cba 100644 --- a/Core/HLE/sceMpeg.cpp +++ b/Core/HLE/sceMpeg.cpp @@ -1953,10 +1953,7 @@ static u32 sceMpegAvcCsc(u32 mpeg, u32 sourceAddr, u32 rangeAddr, int frameWidth int y = Memory::Read_U32(rangeAddr + 4); int width = Memory::Read_U32(rangeAddr + 8); int height = Memory::Read_U32(rangeAddr + 12); - if (((x | y | width | height) & 0xF) != 0) { - WARN_LOG(ME, "sceMpegAvcCsc(%08x, %08x, %08x, %i, %08x) returning ERROR_MPEG_INVALID_VALUE", mpeg, sourceAddr, rangeAddr, frameWidth, destAddr); - return ERROR_MPEG_INVALID_VALUE; - } + if (x < 0 || y < 0 || width < 0 || height < 0) { WARN_LOG(ME, "sceMpegAvcCsc(%08x, %08x, %08x, %i, %08x) returning ERROR_INVALID_VALUE", mpeg, sourceAddr, rangeAddr, frameWidth, destAddr); return SCE_KERNEL_ERROR_INVALID_VALUE; From ba139975e0a1bc6323bba98fc6915877197cd7a3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Mon, 9 Nov 2020 15:39:46 +0100 Subject: [PATCH 239/275] Linker fix - need to move init_resources along. --- Common/GPU/Shader.cpp | 100 +++++++++++++++++++++++++++++++++++ GPU/Common/ShaderCommon.cpp | 101 ------------------------------------ GPU/Common/ShaderCommon.h | 6 +-- 3 files changed, 103 insertions(+), 104 deletions(-) diff --git a/Common/GPU/Shader.cpp b/Common/GPU/Shader.cpp index 077ad92c21..35fd9fa035 100644 --- a/Common/GPU/Shader.cpp +++ b/Common/GPU/Shader.cpp @@ -1,5 +1,11 @@ #include "Common/GPU/Shader.h" +#ifdef USE_CRT_DBG +#undef new +#endif + +#include "ext/glslang/SPIRV/GlslangToSpv.h" + ShaderLanguageDesc::ShaderLanguageDesc(ShaderLanguage lang) { Init(lang); } @@ -83,3 +89,97 @@ void ShaderLanguageDesc::Init(ShaderLanguage lang) { } } +void init_resources(TBuiltInResource &Resources) { + Resources.maxLights = 32; + Resources.maxClipPlanes = 6; + Resources.maxTextureUnits = 32; + Resources.maxTextureCoords = 32; + Resources.maxVertexAttribs = 64; + Resources.maxVertexUniformComponents = 4096; + Resources.maxVaryingFloats = 64; + Resources.maxVertexTextureImageUnits = 32; + Resources.maxCombinedTextureImageUnits = 80; + Resources.maxTextureImageUnits = 32; + Resources.maxFragmentUniformComponents = 4096; + Resources.maxDrawBuffers = 32; + Resources.maxVertexUniformVectors = 128; + Resources.maxVaryingVectors = 8; + Resources.maxFragmentUniformVectors = 16; + Resources.maxVertexOutputVectors = 16; + Resources.maxFragmentInputVectors = 15; + Resources.minProgramTexelOffset = -8; + Resources.maxProgramTexelOffset = 7; + Resources.maxClipDistances = 8; + Resources.maxComputeWorkGroupCountX = 65535; + Resources.maxComputeWorkGroupCountY = 65535; + Resources.maxComputeWorkGroupCountZ = 65535; + Resources.maxComputeWorkGroupSizeX = 1024; + Resources.maxComputeWorkGroupSizeY = 1024; + Resources.maxComputeWorkGroupSizeZ = 64; + Resources.maxComputeUniformComponents = 1024; + Resources.maxComputeTextureImageUnits = 16; + Resources.maxComputeImageUniforms = 8; + Resources.maxComputeAtomicCounters = 8; + Resources.maxComputeAtomicCounterBuffers = 1; + Resources.maxVaryingComponents = 60; + Resources.maxVertexOutputComponents = 64; + Resources.maxGeometryInputComponents = 64; + Resources.maxGeometryOutputComponents = 128; + Resources.maxFragmentInputComponents = 128; + Resources.maxImageUnits = 8; + Resources.maxCombinedImageUnitsAndFragmentOutputs = 8; + Resources.maxCombinedShaderOutputResources = 8; + Resources.maxImageSamples = 0; + Resources.maxVertexImageUniforms = 0; + Resources.maxTessControlImageUniforms = 0; + Resources.maxTessEvaluationImageUniforms = 0; + Resources.maxGeometryImageUniforms = 0; + Resources.maxFragmentImageUniforms = 8; + Resources.maxCombinedImageUniforms = 8; + Resources.maxGeometryTextureImageUnits = 16; + Resources.maxGeometryOutputVertices = 256; + Resources.maxGeometryTotalOutputComponents = 1024; + Resources.maxGeometryUniformComponents = 1024; + Resources.maxGeometryVaryingComponents = 64; + Resources.maxTessControlInputComponents = 128; + Resources.maxTessControlOutputComponents = 128; + Resources.maxTessControlTextureImageUnits = 16; + Resources.maxTessControlUniformComponents = 1024; + Resources.maxTessControlTotalOutputComponents = 4096; + Resources.maxTessEvaluationInputComponents = 128; + Resources.maxTessEvaluationOutputComponents = 128; + Resources.maxTessEvaluationTextureImageUnits = 16; + Resources.maxTessEvaluationUniformComponents = 1024; + Resources.maxTessPatchComponents = 120; + Resources.maxPatchVertices = 32; + Resources.maxTessGenLevel = 64; + Resources.maxViewports = 16; + Resources.maxVertexAtomicCounters = 0; + Resources.maxTessControlAtomicCounters = 0; + Resources.maxTessEvaluationAtomicCounters = 0; + Resources.maxGeometryAtomicCounters = 0; + Resources.maxFragmentAtomicCounters = 8; + Resources.maxCombinedAtomicCounters = 8; + Resources.maxAtomicCounterBindings = 1; + Resources.maxVertexAtomicCounterBuffers = 0; + Resources.maxTessControlAtomicCounterBuffers = 0; + Resources.maxTessEvaluationAtomicCounterBuffers = 0; + Resources.maxGeometryAtomicCounterBuffers = 0; + Resources.maxFragmentAtomicCounterBuffers = 1; + Resources.maxCombinedAtomicCounterBuffers = 1; + Resources.maxAtomicCounterBufferSize = 16384; + Resources.maxTransformFeedbackBuffers = 4; + Resources.maxTransformFeedbackInterleavedComponents = 64; + Resources.maxCullDistances = 8; + Resources.maxCombinedClipAndCullDistances = 8; + Resources.maxSamples = 4; + Resources.limits.nonInductiveForLoops = 1; + Resources.limits.whileLoops = 1; + Resources.limits.doWhileLoops = 1; + Resources.limits.generalUniformIndexing = 1; + Resources.limits.generalAttributeMatrixVectorIndexing = 1; + Resources.limits.generalVaryingIndexing = 1; + Resources.limits.generalSamplerIndexing = 1; + Resources.limits.generalVariableIndexing = 1; + Resources.limits.generalConstantMatrixVectorIndexing = 1; +} diff --git a/GPU/Common/ShaderCommon.cpp b/GPU/Common/ShaderCommon.cpp index 360e7f9d8b..ea8bf916f2 100644 --- a/GPU/Common/ShaderCommon.cpp +++ b/GPU/Common/ShaderCommon.cpp @@ -1,103 +1,2 @@ -#ifdef USE_CRT_DBG -#undef new -#endif - -#include "ext/glslang/SPIRV/GlslangToSpv.h" - #include "Common/GPU/Shader.h" #include "GPU/Common/ShaderCommon.h" - -void init_resources(TBuiltInResource &Resources) { - Resources.maxLights = 32; - Resources.maxClipPlanes = 6; - Resources.maxTextureUnits = 32; - Resources.maxTextureCoords = 32; - Resources.maxVertexAttribs = 64; - Resources.maxVertexUniformComponents = 4096; - Resources.maxVaryingFloats = 64; - Resources.maxVertexTextureImageUnits = 32; - Resources.maxCombinedTextureImageUnits = 80; - Resources.maxTextureImageUnits = 32; - Resources.maxFragmentUniformComponents = 4096; - Resources.maxDrawBuffers = 32; - Resources.maxVertexUniformVectors = 128; - Resources.maxVaryingVectors = 8; - Resources.maxFragmentUniformVectors = 16; - Resources.maxVertexOutputVectors = 16; - Resources.maxFragmentInputVectors = 15; - Resources.minProgramTexelOffset = -8; - Resources.maxProgramTexelOffset = 7; - Resources.maxClipDistances = 8; - Resources.maxComputeWorkGroupCountX = 65535; - Resources.maxComputeWorkGroupCountY = 65535; - Resources.maxComputeWorkGroupCountZ = 65535; - Resources.maxComputeWorkGroupSizeX = 1024; - Resources.maxComputeWorkGroupSizeY = 1024; - Resources.maxComputeWorkGroupSizeZ = 64; - Resources.maxComputeUniformComponents = 1024; - Resources.maxComputeTextureImageUnits = 16; - Resources.maxComputeImageUniforms = 8; - Resources.maxComputeAtomicCounters = 8; - Resources.maxComputeAtomicCounterBuffers = 1; - Resources.maxVaryingComponents = 60; - Resources.maxVertexOutputComponents = 64; - Resources.maxGeometryInputComponents = 64; - Resources.maxGeometryOutputComponents = 128; - Resources.maxFragmentInputComponents = 128; - Resources.maxImageUnits = 8; - Resources.maxCombinedImageUnitsAndFragmentOutputs = 8; - Resources.maxCombinedShaderOutputResources = 8; - Resources.maxImageSamples = 0; - Resources.maxVertexImageUniforms = 0; - Resources.maxTessControlImageUniforms = 0; - Resources.maxTessEvaluationImageUniforms = 0; - Resources.maxGeometryImageUniforms = 0; - Resources.maxFragmentImageUniforms = 8; - Resources.maxCombinedImageUniforms = 8; - Resources.maxGeometryTextureImageUnits = 16; - Resources.maxGeometryOutputVertices = 256; - Resources.maxGeometryTotalOutputComponents = 1024; - Resources.maxGeometryUniformComponents = 1024; - Resources.maxGeometryVaryingComponents = 64; - Resources.maxTessControlInputComponents = 128; - Resources.maxTessControlOutputComponents = 128; - Resources.maxTessControlTextureImageUnits = 16; - Resources.maxTessControlUniformComponents = 1024; - Resources.maxTessControlTotalOutputComponents = 4096; - Resources.maxTessEvaluationInputComponents = 128; - Resources.maxTessEvaluationOutputComponents = 128; - Resources.maxTessEvaluationTextureImageUnits = 16; - Resources.maxTessEvaluationUniformComponents = 1024; - Resources.maxTessPatchComponents = 120; - Resources.maxPatchVertices = 32; - Resources.maxTessGenLevel = 64; - Resources.maxViewports = 16; - Resources.maxVertexAtomicCounters = 0; - Resources.maxTessControlAtomicCounters = 0; - Resources.maxTessEvaluationAtomicCounters = 0; - Resources.maxGeometryAtomicCounters = 0; - Resources.maxFragmentAtomicCounters = 8; - Resources.maxCombinedAtomicCounters = 8; - Resources.maxAtomicCounterBindings = 1; - Resources.maxVertexAtomicCounterBuffers = 0; - Resources.maxTessControlAtomicCounterBuffers = 0; - Resources.maxTessEvaluationAtomicCounterBuffers = 0; - Resources.maxGeometryAtomicCounterBuffers = 0; - Resources.maxFragmentAtomicCounterBuffers = 1; - Resources.maxCombinedAtomicCounterBuffers = 1; - Resources.maxAtomicCounterBufferSize = 16384; - Resources.maxTransformFeedbackBuffers = 4; - Resources.maxTransformFeedbackInterleavedComponents = 64; - Resources.maxCullDistances = 8; - Resources.maxCombinedClipAndCullDistances = 8; - Resources.maxSamples = 4; - Resources.limits.nonInductiveForLoops = 1; - Resources.limits.whileLoops = 1; - Resources.limits.doWhileLoops = 1; - Resources.limits.generalUniformIndexing = 1; - Resources.limits.generalAttributeMatrixVectorIndexing = 1; - Resources.limits.generalVaryingIndexing = 1; - Resources.limits.generalSamplerIndexing = 1; - Resources.limits.generalVariableIndexing = 1; - Resources.limits.generalConstantMatrixVectorIndexing = 1; -} diff --git a/GPU/Common/ShaderCommon.h b/GPU/Common/ShaderCommon.h index 86ffdaad33..d45f43bc06 100644 --- a/GPU/Common/ShaderCommon.h +++ b/GPU/Common/ShaderCommon.h @@ -122,9 +122,6 @@ protected: Draw::DrawContext *draw_ = nullptr; }; -struct TBuiltInResource; -void init_resources(TBuiltInResource &Resources); - enum DoLightComputation { LIGHT_OFF, LIGHT_SHADE, @@ -156,3 +153,6 @@ enum { ATTR_COUNT, }; + +struct TBuiltInResource; +void init_resources(TBuiltInResource &Resources); From a31fc4087bffb87ad4c7cf4c17089b318cf87eba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Mon, 9 Nov 2020 16:05:28 +0100 Subject: [PATCH 240/275] D3D11: Fix writing to SV_Depth. Fixes #13641 --- GPU/Common/FragmentShaderGenerator.cpp | 22 +++++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/GPU/Common/FragmentShaderGenerator.cpp b/GPU/Common/FragmentShaderGenerator.cpp index 5e3f8623c1..1b5f3f1842 100644 --- a/GPU/Common/FragmentShaderGenerator.cpp +++ b/GPU/Common/FragmentShaderGenerator.cpp @@ -113,6 +113,9 @@ bool GenerateFragmentShader(const FShaderID &id, char *buffer, const ShaderLangu bool readFramebuffer = replaceBlend == REPLACE_BLEND_COPY_FBO || colorWriteMask; bool readFramebufferTex = readFramebuffer && !gstate_c.Supports(GPU_SUPPORTS_ANY_FRAMEBUFFER_FETCH); + bool needFragCoord = readFramebuffer || gstate_c.Supports(GPU_ROUND_FRAGMENT_DEPTH_TO_16BIT); + bool writeDepth = gstate_c.Supports(GPU_ROUND_FRAGMENT_DEPTH_TO_16BIT); + if (readFramebuffer && compat.shaderLanguage == HLSL_D3D9) { *errorString = "Framebuffer read not yet supported in HLSL D3D9"; return false; @@ -235,7 +238,7 @@ bool GenerateFragmentShader(const FShaderID &id, char *buffer, const ShaderLangu if (enableFog) { WRITE(p, " float v_fogdepth: TEXCOORD1;\n"); } - if (compat.shaderLanguage == HLSL_D3D11 && readFramebuffer) { + if (compat.shaderLanguage == HLSL_D3D11 && needFragCoord) { WRITE(p, " vec4 pixelPos : SV_POSITION;\n"); } WRITE(p, "};\n"); @@ -248,8 +251,8 @@ bool GenerateFragmentShader(const FShaderID &id, char *buffer, const ShaderLangu } else { WRITE(p, " vec4 target : SV_Target;\n"); } - if (gstate_c.Supports(GPU_ROUND_FRAGMENT_DEPTH_TO_16BIT)) { - WRITE(p, " float depth : SV_DEPTH;\n"); + if (writeDepth) { + WRITE(p, " float depth : SV_Depth;\n"); } WRITE(p, "};\n"); } @@ -424,7 +427,13 @@ bool GenerateFragmentShader(const FShaderID &id, char *buffer, const ShaderLangu if (compat.shaderLanguage == HLSL_D3D11) { WRITE(p, "PS_OUT main( PS_IN In ) {\n"); - WRITE(p, " PS_OUT outfragment;\n"); + WRITE(p, " PS_OUT outfragment;\n"); + if (needFragCoord) { + WRITE(p, " vec4 gl_FragCoord = In.pixelPos;\n"); + } + if (writeDepth) { + WRITE(p, " float gl_FragDepth;\n"); + } } else if (compat.shaderLanguage == HLSL_D3D9) { WRITE(p, "vec4 main( PS_IN In ) : COLOR {\n"); } else { @@ -450,7 +459,7 @@ bool GenerateFragmentShader(const FShaderID &id, char *buffer, const ShaderLangu // Masking with clear mode is ok, I think? if (readFramebuffer) { if (compat.shaderLanguage == HLSL_D3D11) { - WRITE(p, " vec4 destColor = fboTex.Load(int3((int)In.pixelPos.x, (int)In.pixelPos.y, 0));\n"); + WRITE(p, " vec4 destColor = fboTex.Load(int3((int)gl_FragCoord.x, (int)gl_FragCoord.y, 0));\n"); } else if (gstate_c.Supports(GPU_SUPPORTS_ANY_FRAMEBUFFER_FETCH)) { // If we have NV_shader_framebuffer_fetch / EXT_shader_framebuffer_fetch, we skip the blit. // We can just read the prev value more directly. @@ -1033,6 +1042,9 @@ bool GenerateFragmentShader(const FShaderID &id, char *buffer, const ShaderLangu } if (compat.shaderLanguage == HLSL_D3D11) { + if (writeDepth) { + WRITE(p, " outfragment.depth = gl_FragDepth;\n"); + } WRITE(p, " return outfragment;\n"); } else if (compat.shaderLanguage == HLSL_D3D9) { WRITE(p, " return v;\n"); From 5eea7435d0f33ddd4f22d04fa75e3f8f9c65147e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Tue, 10 Nov 2020 00:12:15 +0100 Subject: [PATCH 241/275] Minor cleanup in GL backend, fixes #13647 Was a stray old texture in boundTextures_ in thin3d. Now makes sure to invalidate them, and also make it possible to look up bound framebuffer textures when checking for valid tex parameters. --- Common/GPU/OpenGL/GLQueueRunner.cpp | 5 --- Common/GPU/OpenGL/GLRenderManager.cpp | 18 +++++++++++ Common/GPU/OpenGL/GLRenderManager.h | 19 +++++++----- Common/GPU/OpenGL/thin3d_gl.cpp | 41 +++++++++++++++---------- GPU/Common/FramebufferManagerCommon.cpp | 1 + GPU/GLES/DepalettizeShaderGLES.cpp | 2 +- GPU/GLES/DrawEngineGLES.cpp | 6 ++-- GPU/GLES/FragmentTestCacheGLES.cpp | 2 +- GPU/GLES/TextureCacheGLES.cpp | 15 +++++---- 9 files changed, 68 insertions(+), 41 deletions(-) diff --git a/Common/GPU/OpenGL/GLQueueRunner.cpp b/Common/GPU/OpenGL/GLQueueRunner.cpp index 34836c08a0..d81688189a 100644 --- a/Common/GPU/OpenGL/GLQueueRunner.cpp +++ b/Common/GPU/OpenGL/GLQueueRunner.cpp @@ -438,11 +438,6 @@ void GLQueueRunner::InitCreateFramebuffer(const GLRInitStep &step) { tex.wrapT = GL_CLAMP_TO_EDGE; tex.magFilter = linear ? GL_LINEAR : GL_NEAREST; tex.minFilter = linear ? GL_LINEAR : GL_NEAREST; - if (gl_extensions.OES_texture_npot) { - tex.canWrap = true; - } else { - tex.canWrap = isPowerOf2(fbo->width) && isPowerOf2(fbo->height); - } glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, tex.wrapS); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, tex.wrapT); diff --git a/Common/GPU/OpenGL/GLRenderManager.cpp b/Common/GPU/OpenGL/GLRenderManager.cpp index 7764adfde8..97f5bcb0a6 100644 --- a/Common/GPU/OpenGL/GLRenderManager.cpp +++ b/Common/GPU/OpenGL/GLRenderManager.cpp @@ -5,6 +5,7 @@ #include "Common/Log.h" #include "Common/MemoryUtil.h" +#include "Common/Math/math_util.h" #if 0 // def _DEBUG #define VLOG(...) INFO_LOG(G3D, __VA_ARGS__) @@ -19,6 +20,23 @@ static bool OnRenderThread() { } #endif +GLRTexture::GLRTexture(int width, int height, int numMips) { + if (gl_extensions.OES_texture_npot) { + canWrap = true; + } else { + canWrap = isPowerOf2(width) && isPowerOf2(height); + } + w = width; + h = height; + this->numMips = numMips; +} + +GLRTexture::~GLRTexture() { + if (texture) { + glDeleteTextures(1, &texture); + } +} + void GLDeleter::Take(GLDeleter &other) { _assert_msg_(IsEmpty(), "Deleter already has stuff"); shaders = std::move(other.shaders); diff --git a/Common/GPU/OpenGL/GLRenderManager.h b/Common/GPU/OpenGL/GLRenderManager.h index eca7204de2..fc774aa1c9 100644 --- a/Common/GPU/OpenGL/GLRenderManager.h +++ b/Common/GPU/OpenGL/GLRenderManager.h @@ -23,13 +23,12 @@ class DrawContext; class GLRTexture { public: - ~GLRTexture() { - if (texture) { - glDeleteTextures(1, &texture); - } - } + GLRTexture(int width, int height, int numMips); + ~GLRTexture(); GLuint texture = 0; + uint16_t w; + uint16_t h; // We don't trust OpenGL defaults - setting wildly off values ensures that we'll end up overwriting these parameters. GLenum target = 0xFFFF; @@ -37,6 +36,7 @@ public: GLenum wrapT = 0xFFFF; GLenum magFilter = 0xFFFF; GLenum minFilter = 0xFFFF; + uint8_t numMips = 0; bool canWrap = true; float anisotropy = -100000.0f; float minLod = -1000.0f; @@ -47,7 +47,8 @@ public: class GLRFramebuffer { public: GLRFramebuffer(int _width, int _height, bool z_stencil) - : width(_width), height(_height), z_stencil_(z_stencil) { + : width(_width), height(_height), z_stencil_(z_stencil), + color_texture(_width, _height, 1), z_stencil_texture(_width, _height, 1) { } ~GLRFramebuffer(); @@ -378,9 +379,11 @@ public: void WaitUntilQueueIdle(); // Creation commands. These were not needed in Vulkan since there we can do that on the main thread. - GLRTexture *CreateTexture(GLenum target) { + // We pass in width/height here even though it's not strictly needed until we support glTextureStorage + // and then we'll also need formats and stuff. + GLRTexture *CreateTexture(GLenum target, int width, int height, int numMips) { GLRInitStep step{ GLRInitStepType::CREATE_TEXTURE }; - step.create_texture.texture = new GLRTexture(); + step.create_texture.texture = new GLRTexture(width, height, numMips); step.create_texture.texture->target = target; initSteps_.push_back(step); return step.create_texture.texture; diff --git a/Common/GPU/OpenGL/thin3d_gl.cpp b/Common/GPU/OpenGL/thin3d_gl.cpp index 4e7067164f..6695ae7728 100644 --- a/Common/GPU/OpenGL/thin3d_gl.cpp +++ b/Common/GPU/OpenGL/thin3d_gl.cpp @@ -386,7 +386,7 @@ public: void GetFramebufferDimensions(Framebuffer *fbo, int *w, int *h) override; void BindSamplerStates(int start, int count, SamplerState **states) override { - if (start + count >= MAX_TEXTURE_SLOTS) { + if (start + count > MAX_TEXTURE_SLOTS) { return; } for (int i = 0; i < count; i++) { @@ -497,7 +497,9 @@ private: // Bound state OpenGLSamplerState *boundSamplers_[MAX_TEXTURE_SLOTS]{}; - OpenGLTexture *boundTextures_[MAX_TEXTURE_SLOTS]{}; + // Point to GLRTexture directly because they can point to the textures + // in framebuffers too (which also can be bound). + const GLRTexture *boundTextures_[MAX_TEXTURE_SLOTS]{}; OpenGLPipeline *curPipeline_ = nullptr; OpenGLBuffer *curVBuffers_[4]{}; @@ -739,9 +741,7 @@ public: bool HasMips() const { return mipLevels_ > 1 || generatedMips_; } - bool CanWrap() const { - return canWrap_; - } + TextureType GetType() const { return type_; } void Bind(int stage) { render_->BindTexture(stage, tex_); @@ -749,6 +749,9 @@ public: int NumMipmaps() const { return mipLevels_; } + const GLRTexture *GetTex() const { + return tex_; + } private: void SetImageData(int x, int y, int z, int width, int height, int depth, int level, int stride, const uint8_t *data, TextureCallback callback); @@ -760,7 +763,6 @@ private: TextureType type_; int mipLevels_; bool generatedMips_; - bool canWrap_; }; OpenGLTexture::OpenGLTexture(GLRenderManager *render, const TextureDesc &desc) : render_(render) { @@ -771,9 +773,8 @@ OpenGLTexture::OpenGLTexture(GLRenderManager *render, const TextureDesc &desc) : format_ = desc.format; type_ = desc.type; GLenum target = TypeToTarget(desc.type); - tex_ = render->CreateTexture(target); + tex_ = render->CreateTexture(target, desc.width, desc.height, desc.mipLevels); - canWrap_ = isPowerOf2(width_) && isPowerOf2(height_); mipLevels_ = desc.mipLevels; if (desc.initData.empty()) return; @@ -1091,7 +1092,7 @@ Pipeline *OpenGLContext::CreateGraphicsPipeline(const PipelineDesc &desc) { } void OpenGLContext::BindTextures(int start, int count, Texture **textures) { - if (start + count >= MAX_TEXTURE_SLOTS) { + if (start + count > MAX_TEXTURE_SLOTS) { return; } for (int i = start; i < start + count; i++) { @@ -1102,14 +1103,14 @@ void OpenGLContext::BindTextures(int start, int count, Texture **textures) { continue; } glTex->Bind(i); - boundTextures_[i] = glTex; + boundTextures_[i] = glTex->GetTex(); } } void OpenGLContext::ApplySamplers() { for (int i = 0; i < MAX_TEXTURE_SLOTS; i++) { const OpenGLSamplerState *samp = boundSamplers_[i]; - const OpenGLTexture *tex = boundTextures_[i]; + const GLRTexture *tex = boundTextures_[i]; if (tex) { _assert_(samp); } else { @@ -1117,7 +1118,7 @@ void OpenGLContext::ApplySamplers() { } GLenum wrapS; GLenum wrapT; - if (tex->CanWrap()) { + if (tex->canWrap) { wrapS = samp->wrapU; wrapT = samp->wrapV; } else { @@ -1125,9 +1126,9 @@ void OpenGLContext::ApplySamplers() { wrapT = GL_CLAMP_TO_EDGE; } GLenum magFilt = samp->magFilt; - GLenum minFilt = tex->HasMips() ? samp->mipMinFilt : samp->minFilt; + GLenum minFilt = tex->numMips > 1 ? samp->mipMinFilt : samp->minFilt; renderManager_.SetTextureSampler(i, wrapS, wrapT, magFilt, minFilt, 0.0f); - renderManager_.SetTextureLod(i, 0.0, (float)(tex->NumMipmaps() - 1), 0.0); + renderManager_.SetTextureLod(i, 0.0, (float)(tex->numMips - 1), 0.0); } } @@ -1376,12 +1377,18 @@ void OpenGLContext::BindFramebufferAsTexture(Framebuffer *fbo, int binding, FBCh OpenGLFramebuffer *fb = (OpenGLFramebuffer *)fbo; GLuint aspect = 0; - if (channelBit & FB_COLOR_BIT) + if (channelBit & FB_COLOR_BIT) { aspect |= GL_COLOR_BUFFER_BIT; - if (channelBit & FB_DEPTH_BIT) + boundTextures_[binding] = &fb->framebuffer_->color_texture; + } + if (channelBit & FB_DEPTH_BIT) { aspect |= GL_DEPTH_BUFFER_BIT; - if (channelBit & FB_STENCIL_BIT) + boundTextures_[binding] = &fb->framebuffer_->z_stencil_texture; + } + if (channelBit & FB_STENCIL_BIT) { aspect |= GL_STENCIL_BUFFER_BIT; + boundTextures_[binding] = &fb->framebuffer_->z_stencil_texture; + } renderManager_.BindFramebufferAsTexture(fb->framebuffer_, binding, aspect, color); } diff --git a/GPU/Common/FramebufferManagerCommon.cpp b/GPU/Common/FramebufferManagerCommon.cpp index b96f96b42e..45cee9199c 100644 --- a/GPU/Common/FramebufferManagerCommon.cpp +++ b/GPU/Common/FramebufferManagerCommon.cpp @@ -605,6 +605,7 @@ void FramebufferManagerCommon::ReinterpretFramebufferFrom(VirtualFramebuffer *vf // Copy to a temp framebuffer. Draw::Framebuffer *temp = GetTempFBO(TempFBO::REINTERPRET, vfb->renderWidth, vfb->renderHeight); + draw_->InvalidateCachedState(); draw_->CopyFramebufferImage(vfb->fbo, 0, 0, 0, 0, temp, 0, 0, 0, 0, vfb->renderWidth, vfb->renderHeight, 1, Draw::FBChannel::FB_COLOR_BIT, "reinterpret_prep"); draw_->BindFramebufferAsRenderTarget(vfb->fbo, { Draw::RPAction::DONT_CARE, Draw::RPAction::DONT_CARE, Draw::RPAction::DONT_CARE }, "reinterpret"); draw_->BindPipeline(pipeline); diff --git a/GPU/GLES/DepalettizeShaderGLES.cpp b/GPU/GLES/DepalettizeShaderGLES.cpp index 8e58de7c55..47ddfa1907 100644 --- a/GPU/GLES/DepalettizeShaderGLES.cpp +++ b/GPU/GLES/DepalettizeShaderGLES.cpp @@ -98,7 +98,7 @@ GLRTexture *DepalShaderCacheGLES::GetClutTexture(GEPaletteFormat clutFormat, con int texturePixels = clutFormat == GE_CMODE_32BIT_ABGR8888 ? 256 : 512; DepalTexture *tex = new DepalTexture(); - tex->texture = render_->CreateTexture(GL_TEXTURE_2D); + tex->texture = render_->CreateTexture(GL_TEXTURE_2D, texturePixels, 1, 1); uint8_t *clutCopy = new uint8_t[1024]; memcpy(clutCopy, rawClut, 1024); diff --git a/GPU/GLES/DrawEngineGLES.cpp b/GPU/GLES/DrawEngineGLES.cpp index deb288bd85..1873156806 100644 --- a/GPU/GLES/DrawEngineGLES.cpp +++ b/GPU/GLES/DrawEngineGLES.cpp @@ -696,7 +696,7 @@ void TessellationDataTransferGLES::SendDataToShader(const SimpleVertex *const *p prevSizeU = size_u; prevSizeV = size_v; if (!data_tex[0]) - data_tex[0] = renderManager_->CreateTexture(GL_TEXTURE_2D); + data_tex[0] = renderManager_->CreateTexture(GL_TEXTURE_2D, size_u * 3, size_v, 1); renderManager_->TextureImage(data_tex[0], 0, size_u * 3, size_v, Draw::DataFormat::R32G32B32A32_FLOAT, nullptr, GLRAllocType::NONE, false); renderManager_->FinalizeTexture(data_tex[0], 0, false); } @@ -714,7 +714,7 @@ void TessellationDataTransferGLES::SendDataToShader(const SimpleVertex *const *p if (prevSizeWU < weights.size_u) { prevSizeWU = weights.size_u; if (!data_tex[1]) - data_tex[1] = renderManager_->CreateTexture(GL_TEXTURE_2D); + data_tex[1] = renderManager_->CreateTexture(GL_TEXTURE_2D, weights.size_u * 2, 1, 1); renderManager_->TextureImage(data_tex[1], 0, weights.size_u * 2, 1, Draw::DataFormat::R32G32B32A32_FLOAT, nullptr, GLRAllocType::NONE, false); renderManager_->FinalizeTexture(data_tex[1], 0, false); } @@ -725,7 +725,7 @@ void TessellationDataTransferGLES::SendDataToShader(const SimpleVertex *const *p if (prevSizeWV < weights.size_v) { prevSizeWV = weights.size_v; if (!data_tex[2]) - data_tex[2] = renderManager_->CreateTexture(GL_TEXTURE_2D); + data_tex[2] = renderManager_->CreateTexture(GL_TEXTURE_2D, weights.size_v * 2, 1, 1); renderManager_->TextureImage(data_tex[2], 0, weights.size_v * 2, 1, Draw::DataFormat::R32G32B32A32_FLOAT, nullptr, GLRAllocType::NONE, false); renderManager_->FinalizeTexture(data_tex[2], 0, false); } diff --git a/GPU/GLES/FragmentTestCacheGLES.cpp b/GPU/GLES/FragmentTestCacheGLES.cpp index 47a23efc4d..bd977cf103 100644 --- a/GPU/GLES/FragmentTestCacheGLES.cpp +++ b/GPU/GLES/FragmentTestCacheGLES.cpp @@ -144,7 +144,7 @@ GLRTexture *FragmentTestCacheGLES::CreateTestTexture(const GEComparison funcs[4] } } - GLRTexture *tex = render_->CreateTexture(GL_TEXTURE_2D); + GLRTexture *tex = render_->CreateTexture(GL_TEXTURE_2D, 256, 1, 1); render_->TextureImage(tex, 0, 256, 1, Draw::DataFormat::R8G8B8A8_UNORM, data); return tex; } diff --git a/GPU/GLES/TextureCacheGLES.cpp b/GPU/GLES/TextureCacheGLES.cpp index dfe2f19648..93a2623281 100644 --- a/GPU/GLES/TextureCacheGLES.cpp +++ b/GPU/GLES/TextureCacheGLES.cpp @@ -445,11 +445,6 @@ void TextureCacheGLES::BuildTexture(TexCacheEntry *const entry) { // For the estimate, we assume cluts always point to 8888 for simplicity. cacheSizeEstimate_ += EstimateTexMemoryUsage(entry); - // Always generate a texture name unless it's a framebuffer, we might need it if the texture is replaced later. - if (!entry->textureName) { - entry->textureName = render_->CreateTexture(GL_TEXTURE_2D); - } - if ((entry->bufw == 0 || (gstate.texbufwidth[0] & 0xf800) != 0) && entry->addr >= PSP_GetKernelMemoryEnd()) { ERROR_LOG_REPORT(G3D, "Texture with unexpected bufw (full=%d)", gstate.texbufwidth[0] & 0xffff); // Proceeding here can cause a crash. @@ -535,7 +530,7 @@ void TextureCacheGLES::BuildTexture(TexCacheEntry *const entry) { texelsScaledThisFrame_ += w * h; } } - + // GLES2 doesn't have support for a "Max lod" which is critical as PSP games often // don't specify mips all the way down. As a result, we either need to manually generate // the bottom few levels or rely on OpenGL's autogen mipmaps instead, which might not @@ -645,6 +640,14 @@ void TextureCacheGLES::LoadTextureLevel(TexCacheEntry &entry, ReplacedTexture &r gpuStats.numTexturesDecoded++; + if (!entry.textureName) { + // TODO: Actually pass in correct size here. The size here is not yet used for anything else + // than determining if we can wrap this texture size, that is, it's pow2 or not on very old hardware, else true. + // This will be easy after .. well, yet another refactoring, where I hoist the size calculation out of LoadTextureLevel + // and unify BuildTexture. + entry.textureName = render_->CreateTexture(GL_TEXTURE_2D, 16, 16, 1); + } + if (replaced.GetSize(level, w, h)) { PROFILE_THIS_SCOPE("replacetex"); From 0510101f6cfcdfea54a80ce78ed66bd848746513 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Tue, 10 Nov 2020 13:24:26 +0100 Subject: [PATCH 242/275] Fix task switching issue with reinterpret. Fixes #13649 --- GPU/Common/FramebufferManagerCommon.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/GPU/Common/FramebufferManagerCommon.cpp b/GPU/Common/FramebufferManagerCommon.cpp index 45cee9199c..3a5fa2e21e 100644 --- a/GPU/Common/FramebufferManagerCommon.cpp +++ b/GPU/Common/FramebufferManagerCommon.cpp @@ -2273,9 +2273,11 @@ void FramebufferManagerCommon::DeviceLost() { } if (reinterpretSampler_) { reinterpretSampler_->Release(); + reinterpretSampler_ = nullptr; } if (reinterpretVS_) { reinterpretVS_->Release(); + reinterpretVS_ = nullptr; } presentation_->DeviceLost(); draw_ = nullptr; From d99cba73085e5caf90c5e55892e95630ce2983b8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Tue, 10 Nov 2020 22:01:28 +0100 Subject: [PATCH 243/275] Outrun on OpenGL: Fix weird purple highlight seen on some devices mediump int is just not enough. --- Common/GPU/ShaderWriter.cpp | 7 +++++++ Common/GPU/ShaderWriter.h | 3 +++ GPU/Common/ReinterpretFramebuffer.cpp | 2 ++ 3 files changed, 12 insertions(+) diff --git a/Common/GPU/ShaderWriter.cpp b/Common/GPU/ShaderWriter.cpp index 8494a905b5..2a90995b66 100644 --- a/Common/GPU/ShaderWriter.cpp +++ b/Common/GPU/ShaderWriter.cpp @@ -264,6 +264,13 @@ void ShaderWriter::EndFSMain(const char *vec4_color_variable) { C("}\n"); } +void ShaderWriter::HighPrecisionInt() { + if (ShaderLanguageIsOpenGL(lang_.shaderLanguage) && lang_.gles) { + C("precision highp int;\n"); + C("precision highp uint;\n"); + } +} + void ShaderWriter::DeclareTexture2D(const char *name, int binding) { switch (lang_.shaderLanguage) { case HLSL_D3D11: diff --git a/Common/GPU/ShaderWriter.h b/Common/GPU/ShaderWriter.h index cbb2b34aea..15436cc737 100644 --- a/Common/GPU/ShaderWriter.h +++ b/Common/GPU/ShaderWriter.h @@ -63,6 +63,9 @@ public: // F: Formats into the buffer. ShaderWriter &F(const char *format, ...); + // Useful for fragment shaders in GLES. + void HighPrecisionInt(); + // Several of the shader languages ignore samplers, beware of that. void DeclareSampler2D(const char *name, int binding); void DeclareTexture2D(const char *name, int binding); diff --git a/GPU/Common/ReinterpretFramebuffer.cpp b/GPU/Common/ReinterpretFramebuffer.cpp index 8c824a9b44..1352ac3b73 100644 --- a/GPU/Common/ReinterpretFramebuffer.cpp +++ b/GPU/Common/ReinterpretFramebuffer.cpp @@ -18,6 +18,8 @@ bool GenerateReinterpretFragmentShader(char *buffer, GEBufferFormat from, GEBuff ShaderWriter writer(buffer, lang, ShaderStage::Fragment, nullptr, 0); + writer.HighPrecisionInt(); + writer.DeclareSampler2D("samp", 0); writer.DeclareTexture2D("tex", 0); From c61f9bfd093307f12786dacaa0b0a6d953c0bb22 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Tue, 10 Nov 2020 22:07:20 +0100 Subject: [PATCH 244/275] Fix bug in the new color writemask code, failing to limit it to Outrun properly. Fixes #13650. --- GPU/Common/GPUStateUtils.cpp | 5 ++++- GPU/D3D11/StateMappingD3D11.cpp | 2 +- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/GPU/Common/GPUStateUtils.cpp b/GPU/Common/GPUStateUtils.cpp index fc599c6f3e..83ce5b61ee 100644 --- a/GPU/Common/GPUStateUtils.cpp +++ b/GPU/Common/GPUStateUtils.cpp @@ -958,6 +958,7 @@ void ApplyStencilReplaceAndLogicOpIgnoreBlend(ReplaceAlphaType replaceAlphaWithS bool IsColorWriteMaskComplex(bool allowFramebufferRead) { // Restrict to Outrun temporarily (by uglily reusing the ReinterpretFramebuffers flag) + // This check must match the one in ConvertMaskState. if (!allowFramebufferRead || !PSP_CoreParameter().compat.flags().ReinterpretFramebuffers) { // Don't have a choice - we'll make do but it won't always be right. return false; @@ -998,7 +999,9 @@ void ConvertMaskState(GenericMaskState &maskState, bool allowFramebufferRead) { break; default: if (allowFramebufferRead) { - maskState.applyFramebufferRead = true; + // Instead of just 'true', restrict shader bitmasks to Outrun temporarily (by uglily reusing the ReinterpretFramebuffers flag) + // TODO: This check must match the one in IsColorWriteMaskComplex. + maskState.applyFramebufferRead = PSP_CoreParameter().compat.flags().ReinterpretFramebuffers; maskState.rgba[i] = true; } else { // Use the old heuristic. diff --git a/GPU/D3D11/StateMappingD3D11.cpp b/GPU/D3D11/StateMappingD3D11.cpp index a6ca5025da..5b0bda982f 100644 --- a/GPU/D3D11/StateMappingD3D11.cpp +++ b/GPU/D3D11/StateMappingD3D11.cpp @@ -162,7 +162,7 @@ void DrawEngineD3D11::ApplyDrawState(int prim) { GenericMaskState maskState; ConvertMaskState(maskState, gstate_c.allowFramebufferRead); - if (blendState.applyFramebufferRead) { + if (blendState.applyFramebufferRead || maskState.applyFramebufferRead) { if (ApplyFramebufferRead(&fboTexNeedsBind_)) { // The shader takes over the responsibility for blending, so recompute. ApplyStencilReplaceAndLogicOpIgnoreBlend(blendState.replaceAlphaWithStencil, blendState); From 34efa1281b81bc8b786f47c42115752dd8225961 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Tue, 10 Nov 2020 22:26:34 +0100 Subject: [PATCH 245/275] More consistent use of GLSL precision modifiers, now use them in Vulkan too. Might help #13464 ? --- Common/GPU/ShaderWriter.cpp | 27 ++++++++++++-------------- Common/GPU/ShaderWriter.h | 4 +++- GPU/Common/FragmentShaderGenerator.cpp | 9 +++++---- GPU/Common/ReinterpretFramebuffer.cpp | 4 ++-- GPU/Common/VertexShaderGenerator.cpp | 8 ++++---- 5 files changed, 26 insertions(+), 26 deletions(-) diff --git a/Common/GPU/ShaderWriter.cpp b/Common/GPU/ShaderWriter.cpp index 2a90995b66..d5bc375921 100644 --- a/Common/GPU/ShaderWriter.cpp +++ b/Common/GPU/ShaderWriter.cpp @@ -12,10 +12,9 @@ const char *vulkan_glsl_preamble_fs = "#extension GL_ARB_conservative_depth : enable\n" "#extension GL_ARB_shader_image_load_store : enable\n" "#define splat3(x) vec3(x)\n" -"#define lowp\n" -"#define mediump\n" -"#define highp\n" "#define DISCARD discard\n" +"precision lowp float;\n" +"precision highp int;\n" "\n"; const char *hlsl_preamble_fs = @@ -48,9 +47,7 @@ const char *vulkan_glsl_preamble_vs = "#extension GL_ARB_shading_language_420pack : enable\n" "#define mul(x, y) ((x) * (y))\n" "#define splat3(x) vec3(x)\n" -"#define lowp\n" -"#define mediump\n" -"#define highp\n" +"precision highp float;\n" "\n"; const char *hlsl_preamble_vs = @@ -165,13 +162,14 @@ void ShaderWriter::BeginVSMain(Slice inputs, Slice uniform } case GLSL_VULKAN: for (auto &varying : varyings) { - F("layout(location = %d) out %s %s; // %s\n", varying.index, varying.type, varying.name, varying.semantic); + F("layout(location = %d) %s out %s %s; // %s\n", + varying.index, varying.precision ? varying.precision : "", varying.type, varying.name, varying.semantic); } C("void main() {\n"); break; default: // OpenGL for (auto &varying : varyings) { - F("%s %s %s; // %s (%d)\n", lang_.varying_vs, varying.type, varying.name, varying.semantic, varying.index); + F("%s %s %s %s; // %s (%d)\n", lang_.varying_vs, varying.precision ? varying.precision : "", varying.type, varying.name, varying.semantic, varying.index); } C("void main() {\n"); break; @@ -213,14 +211,14 @@ void ShaderWriter::BeginFSMain(Slice uniforms, Slice var break; case GLSL_VULKAN: for (auto &varying : varyings) { - F("layout(location = %d) in %s %s; // %s\n", varying.index, varying.type, varying.name, varying.semantic); + F("layout(location = %d) %s in %s %s; // %s\n", varying.index, varying.precision ? varying.precision : "", varying.type, varying.name, varying.semantic); } - C("layout (location = 0, index = 0) out vec4 fragColor0;\n"); + C("layout(location = 0, index = 0) out vec4 fragColor0;\n"); C("\nvoid main() {\n"); break; default: for (auto &varying : varyings) { - F("%s %s %s; // %s\n", lang_.varying_fs, varying.type, varying.name, varying.semantic); + F("%s %s %s %s; // %s\n", lang_.varying_fs, varying.precision ? varying.precision : "", varying.type, varying.name, varying.semantic); } if (!strcmp(lang_.fragColor0, "fragColor0")) { C("out vec4 fragColor0;\n"); @@ -264,10 +262,9 @@ void ShaderWriter::EndFSMain(const char *vec4_color_variable) { C("}\n"); } -void ShaderWriter::HighPrecisionInt() { - if (ShaderLanguageIsOpenGL(lang_.shaderLanguage) && lang_.gles) { - C("precision highp int;\n"); - C("precision highp uint;\n"); +void ShaderWriter::HighPrecisionFloat() { + if ((ShaderLanguageIsOpenGL(lang_.shaderLanguage) && lang_.gles) || lang_.shaderLanguage == GLSL_VULKAN) { + C("precision highp float;\n"); } } diff --git a/Common/GPU/ShaderWriter.h b/Common/GPU/ShaderWriter.h index 15436cc737..3aa1a4df29 100644 --- a/Common/GPU/ShaderWriter.h +++ b/Common/GPU/ShaderWriter.h @@ -33,6 +33,7 @@ struct VaryingDef { const char *name; const char *semantic; int index; + const char *precision; }; class ShaderWriter { @@ -64,7 +65,8 @@ public: ShaderWriter &F(const char *format, ...); // Useful for fragment shaders in GLES. - void HighPrecisionInt(); + // We always default integers to high precision. + void HighPrecisionFloat(); // Several of the shader languages ignore samplers, beware of that. void DeclareSampler2D(const char *name, int binding); diff --git a/GPU/Common/FragmentShaderGenerator.cpp b/GPU/Common/FragmentShaderGenerator.cpp index dbe352b8a2..d3024a6006 100644 --- a/GPU/Common/FragmentShaderGenerator.cpp +++ b/GPU/Common/FragmentShaderGenerator.cpp @@ -141,14 +141,15 @@ bool GenerateFragmentShader(const FShaderID &id, char *buffer, const ShaderLangu WRITE(p, "layout (binding = 2) uniform sampler2D pal;\n"); } - WRITE(p, "layout (location = 1) %s in vec4 v_color0;\n", shading); + // Note: the precision qualifiers must match the vertex shader! + WRITE(p, "layout (location = 1) %s in lowp vec4 v_color0;\n", shading); if (lmode) - WRITE(p, "layout (location = 2) %s in vec3 v_color1;\n", shading); + WRITE(p, "layout (location = 2) %s in lowp vec3 v_color1;\n", shading); if (enableFog) { - WRITE(p, "layout (location = 3) in float v_fogdepth;\n"); + WRITE(p, "layout (location = 3) in highp float v_fogdepth;\n"); } if (doTexture) { - WRITE(p, "layout (location = 0) in vec3 v_texcoord;\n"); + WRITE(p, "layout (location = 0) in highp vec3 v_texcoord;\n"); } if (enableAlphaTest && !alphaTestAgainstZero) { diff --git a/GPU/Common/ReinterpretFramebuffer.cpp b/GPU/Common/ReinterpretFramebuffer.cpp index 1352ac3b73..4793278f03 100644 --- a/GPU/Common/ReinterpretFramebuffer.cpp +++ b/GPU/Common/ReinterpretFramebuffer.cpp @@ -5,7 +5,7 @@ #include "GPU/Common/ReinterpretFramebuffer.h" static const VaryingDef varyings[1] = { - { "vec2", "v_texcoord", "TEXCOORD0" }, + { "vec2", "v_texcoord", "TEXCOORD0", 0, "highp" }, }; // TODO: We could possibly have an option to preserve any extra color precision? But gonna start without it. @@ -18,7 +18,7 @@ bool GenerateReinterpretFragmentShader(char *buffer, GEBufferFormat from, GEBuff ShaderWriter writer(buffer, lang, ShaderStage::Fragment, nullptr, 0); - writer.HighPrecisionInt(); + writer.HighPrecisionFloat(); writer.DeclareSampler2D("samp", 0); writer.DeclareTexture2D("tex", 0); diff --git a/GPU/Common/VertexShaderGenerator.cpp b/GPU/Common/VertexShaderGenerator.cpp index a36259ac55..37fd9403e6 100644 --- a/GPU/Common/VertexShaderGenerator.cpp +++ b/GPU/Common/VertexShaderGenerator.cpp @@ -241,18 +241,18 @@ bool GenerateVertexShader(const VShaderID &id, char *buffer, const ShaderLanguag WRITE(p, "layout (location = %d) in vec3 color1;\n", (int)PspAttributeLocation::COLOR1); } - WRITE(p, "layout (location = 1) %sout vec4 v_color0;\n", shading); + WRITE(p, "layout (location = 1) %sout lowp vec4 v_color0;\n", shading); if (lmode) { - WRITE(p, "layout (location = 2) %sout vec3 v_color1;\n", shading); + WRITE(p, "layout (location = 2) %sout lowp vec3 v_color1;\n", shading); } if (doTexture) { - WRITE(p, "layout (location = 0) out vec3 v_texcoord;\n"); + WRITE(p, "layout (location = 0) out highp vec3 v_texcoord;\n"); } if (enableFog) { // See the fragment shader generator - WRITE(p, "layout (location = 3) out float v_fogdepth;\n"); + WRITE(p, "layout (location = 3) out highp float v_fogdepth;\n"); } } else if (compat.shaderLanguage == HLSL_D3D11 || compat.shaderLanguage == HLSL_D3D9) { // Note: These two share some code after this hellishly large if/else. From 575ae376a9f8806311bf7bb836c4e81fa0194b06 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Tue, 10 Nov 2020 23:36:09 +0100 Subject: [PATCH 246/275] Don't try to texture from depth if not supported by backend. Works around #13621 --- GPU/Common/TextureCacheCommon.cpp | 4 ++++ GPU/D3D11/GPU_D3D11.cpp | 1 + GPU/GPUState.h | 2 +- GPU/Vulkan/GPU_Vulkan.cpp | 1 + 4 files changed, 7 insertions(+), 1 deletion(-) diff --git a/GPU/Common/TextureCacheCommon.cpp b/GPU/Common/TextureCacheCommon.cpp index dd67d94ab1..a17565e41f 100644 --- a/GPU/Common/TextureCacheCommon.cpp +++ b/GPU/Common/TextureCacheCommon.cpp @@ -569,6 +569,10 @@ std::vector TextureCacheCommon::GetFramebufferCandidates(const std::vector candidates; FramebufferNotificationChannel channel = Memory::IsDepthTexVRAMAddress(entry.addr) ? FramebufferNotificationChannel::NOTIFY_FB_DEPTH : FramebufferNotificationChannel::NOTIFY_FB_COLOR; + if (channel == FramebufferNotificationChannel::NOTIFY_FB_DEPTH && !gstate_c.Supports(GPU_SUPPORTS_DEPTH_TEXTURE)) { + // Depth texture not supported. Don't try to match it, fall back to the memory behind.. + return std::vector(); + } const std::vector &framebuffers = framebufferManager_->Framebuffers(); diff --git a/GPU/D3D11/GPU_D3D11.cpp b/GPU/D3D11/GPU_D3D11.cpp index 6207358c73..f3e738029c 100644 --- a/GPU/D3D11/GPU_D3D11.cpp +++ b/GPU/D3D11/GPU_D3D11.cpp @@ -140,6 +140,7 @@ void GPU_D3D11::CheckGPUFeatures() { features |= GPU_SUPPORTS_ANISOTROPY; #endif + features |= GPU_SUPPORTS_DEPTH_TEXTURE; features |= GPU_SUPPORTS_OES_TEXTURE_NPOT; if (draw_->GetDeviceCaps().dualSourceBlend) features |= GPU_SUPPORTS_DUALSOURCE_BLEND; diff --git a/GPU/GPUState.h b/GPU/GPUState.h index 25402a3b76..3af959f6b0 100644 --- a/GPU/GPUState.h +++ b/GPU/GPUState.h @@ -480,7 +480,7 @@ enum { GPU_SUPPORTS_16BIT_FORMATS = FLAG_BIT(13), GPU_SUPPORTS_DEPTH_CLAMP = FLAG_BIT(14), GPU_SUPPORTS_32BIT_INT_FSHADER = FLAG_BIT(15), - // Free bit: 16 + GPU_SUPPORTS_DEPTH_TEXTURE = FLAG_BIT(16), GPU_SUPPORTS_ACCURATE_DEPTH = FLAG_BIT(17), GPU_SUPPORTS_VAO = FLAG_BIT(18), GPU_SUPPORTS_COPY_IMAGE = FLAG_BIT(19), diff --git a/GPU/Vulkan/GPU_Vulkan.cpp b/GPU/Vulkan/GPU_Vulkan.cpp index afdebeef05..111ccffd48 100644 --- a/GPU/Vulkan/GPU_Vulkan.cpp +++ b/GPU/Vulkan/GPU_Vulkan.cpp @@ -231,6 +231,7 @@ void GPU_Vulkan::CheckGPUFeatures() { features |= GPU_SUPPORTS_INSTANCE_RENDERING; features |= GPU_SUPPORTS_VERTEX_TEXTURE_FETCH; features |= GPU_SUPPORTS_TEXTURE_FLOAT; + features |= GPU_SUPPORTS_DEPTH_TEXTURE; if (vulkan_->GetDeviceInfo().canBlitToPreferredDepthStencilFormat) { features |= GPU_SUPPORTS_FRAMEBUFFER_BLIT_TO_DEPTH; From 37e939fcf26688490cc475ba3313127ebbb9b2d6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Wed, 11 Nov 2020 00:04:02 +0100 Subject: [PATCH 247/275] Expose the "Lower resolution for effects" setting in libretro. Fixes #11099 --- libretro/libretro.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/libretro/libretro.cpp b/libretro/libretro.cpp index eaf7a4e83f..68f8c0ec7d 100644 --- a/libretro/libretro.cpp +++ b/libretro/libretro.cpp @@ -209,6 +209,7 @@ static RetroOption ppsspp_texture_scaling_level("ppsspp_texture_scaling_lev static RetroOption ppsspp_texture_scaling_type("ppsspp_texture_scaling_type", "Texture Scaling Type", { { "xbrz", TextureScalerCommon::XBRZ }, { "hybrid", TextureScalerCommon::HYBRID }, { "bicubic", TextureScalerCommon::BICUBIC }, { "hybrid_bicubic", TextureScalerCommon::HYBRID_BICUBIC } }); static RetroOption ppsspp_texture_filtering("ppsspp_texture_filtering", "Texture Filtering", { { "auto", 1 }, { "nearest", 2 }, { "linear", 3 }, { "linear(FMV)", 4 } }); static RetroOption ppsspp_texture_anisotropic_filtering("ppsspp_texture_anisotropic_filtering", "Anisotropic Filtering", { "off", "1x", "2x", "4x", "8x", "16x" }); +static RetroOption ppsspp_lower_resolution_for_effects("ppsspp_lower_resolution_for_effects", "Lower resolution for effects", { "off", "safe", "balanced", "aggressive" }); static RetroOption ppsspp_texture_deposterize("ppsspp_texture_deposterize", "Texture Deposterize", false); static RetroOption ppsspp_texture_replacement("ppsspp_texture_replacement", "Texture Replacement", false); static RetroOption ppsspp_gpu_hardware_transform("ppsspp_gpu_hardware_transform", "GPU Hardware T&L", true); @@ -242,6 +243,7 @@ void retro_set_environment(retro_environment_t cb) vars.push_back(ppsspp_unsafe_func_replacements.GetOptions()); vars.push_back(ppsspp_cheats.GetOptions()); vars.push_back(ppsspp_io_timing_method.GetOptions()); + vars.push_back(ppsspp_lower_resolution_for_effects.GetOptions()); vars.push_back({}); environ_cb = cb; @@ -312,6 +314,7 @@ static void check_variables(CoreParameter &coreParam) ppsspp_rendering_mode.Update(&g_Config.iRenderingMode); ppsspp_cpu_core.Update((CPUCore *)&g_Config.iCpuCore); ppsspp_io_timing_method.Update((IOTimingMethods *)&g_Config.iIOTimingMethod); + ppsspp_lower_resolution_for_effects.Update(&g_Config.iBloomHack); ppsspp_language.Update(&g_Config.iLanguage); if (g_Config.iLanguage < 0) From ac1bb785c52b5b6822c462c42017f3a3a15a3c59 Mon Sep 17 00:00:00 2001 From: sergioroprado Date: Tue, 10 Nov 2020 20:33:40 -0300 Subject: [PATCH 248/275] Update gamecontrollerdb.txt Add support to Nintendo Switch Joy-cons. See https://github.com/hrydgard/ppsspp/issues/13651 --- assets/gamecontrollerdb.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/assets/gamecontrollerdb.txt b/assets/gamecontrollerdb.txt index 8913052eaa..fcefb88ae7 100644 --- a/assets/gamecontrollerdb.txt +++ b/assets/gamecontrollerdb.txt @@ -196,3 +196,4 @@ bd1200000000000015d0000000000000,Tomee SNES USB Controller,x:b3,a:b2,b:b1,y:b0,b 030000000d0f0000c100000011010000,HORI CO.,LTD. HORIPAD S,platform:Linux,a:b1,b:b2,y:b3,x:b0,start:b9,guide:b12,back:b8,leftstick:b10,rightstick:b11,leftshoulder:b4,rightshoulder:b5,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:b6,righttrigger:b7, 03000000ad1b000003f5000033050000,Hori Fighting Stick VX,platform:Linux,a:b0,b:b1,x:b2,y:b3,back:b8,guide:b10,start:b9,leftshoulder:b4,rightshoulder:b5,-leftx:h0.8,+leftx:h0.2,-lefty:h0.1,+lefty:h0.4,lefttrigger:b6,righttrigger:b7, 03000000c82d00000260000011010000,8Bitdo SF30 Pro 8BitDo SN30 Pro+,platform:Linux,a:b1,b:b0,x:b4,y:b3,back:b10,guide:b2,start:b11,leftstick:b13,rightstick:b14,leftshoulder:b6,rightshoulder:b7,dpup:h0.1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:a5,righttrigger:a4, +060000007e0500000820000000000000,Nintendo Switch Combined Joy-Cons,platform:Linux,a:b0,b:b1,x:b3,y:b2,back:b9,guide:b11,start:b10,leftstick:b12,rightstick:b13,leftshoulder:b5,rightshoulder:b6,dpup:b14,dpdown:b15,dpleft:b16,dpright:b17,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:b7,righttrigger:b8, From a3d06e366f25706768ce48754df442aa4e7383cb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Wed, 11 Nov 2020 22:34:31 +0100 Subject: [PATCH 249/275] OpenGL: Detect Adreno model number --- Common/GPU/OpenGL/GLFeatures.cpp | 1 + Common/GPU/OpenGL/GLFeatures.h | 1 + 2 files changed, 2 insertions(+) diff --git a/Common/GPU/OpenGL/GLFeatures.cpp b/Common/GPU/OpenGL/GLFeatures.cpp index 2f5f9fd0cf..4b875f1256 100644 --- a/Common/GPU/OpenGL/GLFeatures.cpp +++ b/Common/GPU/OpenGL/GLFeatures.cpp @@ -160,6 +160,7 @@ void CheckGLExtensions() { gl_extensions.gpuVendor = GPU_VENDOR_IMGTEC; } else if (vendor == "Qualcomm") { gl_extensions.gpuVendor = GPU_VENDOR_QUALCOMM; + sscanf(renderer, "Adreno (TM) %d", &gl_extensions.modelNumber); } else if (vendor == "Broadcom") { gl_extensions.gpuVendor = GPU_VENDOR_BROADCOM; // Just for reference: Galaxy Y has renderer == "VideoCore IV HW" diff --git a/Common/GPU/OpenGL/GLFeatures.h b/Common/GPU/OpenGL/GLFeatures.h index bb1f5054a2..668de606d5 100644 --- a/Common/GPU/OpenGL/GLFeatures.h +++ b/Common/GPU/OpenGL/GLFeatures.h @@ -34,6 +34,7 @@ struct GLExtensions { int ver[3]; int gpuVendor; char model[128]; + int modelNumber; bool IsGLES; bool IsCoreContext; From 653a4bddde6f8dddca853d6e67231a78fe0340af Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Wed, 11 Nov 2020 22:36:10 +0100 Subject: [PATCH 250/275] Fix check for when to generate packUnorm4x8 replacements --- GPU/Common/FragmentShaderGenerator.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/GPU/Common/FragmentShaderGenerator.cpp b/GPU/Common/FragmentShaderGenerator.cpp index d3024a6006..e1308e0393 100644 --- a/GPU/Common/FragmentShaderGenerator.cpp +++ b/GPU/Common/FragmentShaderGenerator.cpp @@ -408,7 +408,7 @@ bool GenerateFragmentShader(const FShaderID &id, char *buffer, const ShaderLangu } // Provide implementations of packUnorm4x8 and unpackUnorm4x8 if not available. - if (colorWriteMask && compat.shaderLanguage == HLSL_D3D11 || (compat.shaderLanguage == GLSL_3xx && compat.glslVersionNumber < 400)) { + if (colorWriteMask && (compat.shaderLanguage == HLSL_D3D11 || (compat.shaderLanguage == GLSL_3xx && (!compat.gles && compat.glslVersionNumber < 400)))) { WRITE(p, "uint packUnorm4x8(vec4 v) {\n"); WRITE(p, " v = clamp(v, 0.0, 1.0);\n"); WRITE(p, " uvec4 u = uvec4(255.0 * v);\n"); From e14437cb3f75149d04db3571ed1c17027074d372 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Wed, 11 Nov 2020 23:09:48 +0100 Subject: [PATCH 251/275] OpenGL: Assorted shader-depal bugfixes and regression fixes. Fixes #13517 --- Common/GPU/OpenGL/GLFeatures.cpp | 7 ++++--- GPU/Common/FragmentShaderGenerator.cpp | 13 +++++++++---- GPU/Common/ShaderId.cpp | 2 +- GPU/GLES/ShaderManagerGLES.cpp | 2 +- GPU/GLES/TextureCacheGLES.cpp | 3 ++- UI/DevScreens.cpp | 13 ++++++++++--- 6 files changed, 27 insertions(+), 13 deletions(-) diff --git a/Common/GPU/OpenGL/GLFeatures.cpp b/Common/GPU/OpenGL/GLFeatures.cpp index 4b875f1256..9cff5bbad1 100644 --- a/Common/GPU/OpenGL/GLFeatures.cpp +++ b/Common/GPU/OpenGL/GLFeatures.cpp @@ -474,9 +474,10 @@ void CheckGLExtensions() { } } - // Now, Adreno lies. So let's override it. - if (gl_extensions.gpuVendor == GPU_VENDOR_QUALCOMM) { - WARN_LOG(G3D, "Detected Adreno - lowering int precision"); + // Now, old Adreno lies. So let's override it. + // Not sure about the exact limit here. + if (gl_extensions.gpuVendor == GPU_VENDOR_QUALCOMM && gl_extensions.modelNumber < 500) { + WARN_LOG(G3D, "Detected old Adreno - lowering int precision for safety"); gl_extensions.range[1][5][0] = 15; gl_extensions.range[1][5][1] = 15; } diff --git a/GPU/Common/FragmentShaderGenerator.cpp b/GPU/Common/FragmentShaderGenerator.cpp index e1308e0393..4118696bb1 100644 --- a/GPU/Common/FragmentShaderGenerator.cpp +++ b/GPU/Common/FragmentShaderGenerator.cpp @@ -116,6 +116,11 @@ bool GenerateFragmentShader(const FShaderID &id, char *buffer, const ShaderLangu bool needFragCoord = readFramebuffer || gstate_c.Supports(GPU_ROUND_FRAGMENT_DEPTH_TO_16BIT); bool writeDepth = gstate_c.Supports(GPU_ROUND_FRAGMENT_DEPTH_TO_16BIT); + if (shaderDepal && !doTexture) { + *errorString = "depal requires a texture"; + return false; + } + if (readFramebuffer && compat.shaderLanguage == HLSL_D3D9) { *errorString = "Framebuffer read not yet supported in HLSL D3D9"; return false; @@ -565,10 +570,10 @@ bool GenerateFragmentShader(const FShaderID &id, char *buffer, const ShaderLangu WRITE(p, " } else {\n"); WRITE(p, " uv_round = uv;\n"); WRITE(p, " }\n"); - WRITE(p, " vec4 t = %s(tex, uv_round);\n", compat.texture); - WRITE(p, " vec4 t1 = %sOffset(tex, uv_round, ivec2(1, 0));\n", compat.texture); - WRITE(p, " vec4 t2 = %sOffset(tex, uv_round, ivec2(0, 1));\n", compat.texture); - WRITE(p, " vec4 t3 = %sOffset(tex, uv_round, ivec2(1, 1));\n", compat.texture); + WRITE(p, " highp vec4 t = %s(tex, uv_round);\n", compat.texture); + WRITE(p, " highp vec4 t1 = %sOffset(tex, uv_round, ivec2(1, 0));\n", compat.texture); + WRITE(p, " highp vec4 t2 = %sOffset(tex, uv_round, ivec2(0, 1));\n", compat.texture); + WRITE(p, " highp vec4 t3 = %sOffset(tex, uv_round, ivec2(1, 1));\n", compat.texture); WRITE(p, " uint depalMask = (u_depal_mask_shift_off_fmt & 0xFFU);\n"); WRITE(p, " uint depalShift = (u_depal_mask_shift_off_fmt >> 8) & 0xFFU;\n"); WRITE(p, " uint depalOffset = ((u_depal_mask_shift_off_fmt >> 16) & 0xFFU) << 4;\n"); diff --git a/GPU/Common/ShaderId.cpp b/GPU/Common/ShaderId.cpp index 88ac081cd3..b01c46044f 100644 --- a/GPU/Common/ShaderId.cpp +++ b/GPU/Common/ShaderId.cpp @@ -265,6 +265,7 @@ void ComputeFragmentShaderID(FShaderID *id_out, const Draw::Bugs &bugs) { id.SetBit(FS_BIT_TEXTURE_AT_OFFSET, textureAtOffset); } id.SetBit(FS_BIT_BGRA_TEXTURE, gstate_c.bgraTexture); + id.SetBit(FS_BIT_SHADER_DEPAL, useShaderDepal); } id.SetBit(FS_BIT_LMODE, lmode); @@ -310,7 +311,6 @@ void ComputeFragmentShaderID(FShaderID *id_out, const Draw::Bugs &bugs) { } id.SetBit(FS_BIT_FLATSHADE, doFlatShading); - id.SetBit(FS_BIT_SHADER_DEPAL, useShaderDepal); id.SetBit(FS_BIT_COLOR_WRITEMASK, colorWriteMask); if (g_Config.bVendorBugChecksEnabled) { diff --git a/GPU/GLES/ShaderManagerGLES.cpp b/GPU/GLES/ShaderManagerGLES.cpp index 159f0261a7..eccc9f8834 100644 --- a/GPU/GLES/ShaderManagerGLES.cpp +++ b/GPU/GLES/ShaderManagerGLES.cpp @@ -300,7 +300,7 @@ void LinkedShader::UpdateUniforms(u32 vertType, const ShaderID &vsid, bool useBu uint32_t val = BytesToUint32(indexMask, indexShift, indexOffset, format); // Poke in a bilinear filter flag in the top bit. val |= gstate.isMagnifyFilteringEnabled() << 31; - render_->SetUniformI1(&u_depal_mask_shift_off_fmt, val); + render_->SetUniformUI1(&u_depal_mask_shift_off_fmt, val); } // Update any dirty uniforms before we draw diff --git a/GPU/GLES/TextureCacheGLES.cpp b/GPU/GLES/TextureCacheGLES.cpp index 93a2623281..7c75cf8fe2 100644 --- a/GPU/GLES/TextureCacheGLES.cpp +++ b/GPU/GLES/TextureCacheGLES.cpp @@ -347,10 +347,11 @@ void TextureCacheGLES::ApplyTextureFramebuffer(VirtualFramebuffer *framebuffer, uint32_t clutMode = gstate.clutformat & 0xFFFFFF; bool need_depalettize = IsClutFormat(texFormat); - bool useShaderDepal = framebufferManager_->GetCurrentRenderVFB() != framebuffer && gstate_c.Supports(GPU_SUPPORTS_GLSL_ES_300); + bool useShaderDepal = framebufferManager_->GetCurrentRenderVFB() != framebuffer && (gstate_c.Supports(GPU_SUPPORTS_GLSL_ES_300) || gstate_c.Supports(GPU_SUPPORTS_GLSL_330)); if (!gstate_c.Supports(GPU_SUPPORTS_32BIT_INT_FSHADER)) { useShaderDepal = false; } + if (need_depalettize && !g_Config.bDisableSlowFramebufEffects) { if (useShaderDepal) { const GEPaletteFormat clutFormat = gstate.getClutPaletteFormat(); diff --git a/UI/DevScreens.cpp b/UI/DevScreens.cpp index f2dad07e1d..71431f227e 100644 --- a/UI/DevScreens.cpp +++ b/UI/DevScreens.cpp @@ -496,10 +496,17 @@ void SystemInfoScreen::CreateViews() { deviceSpecs->Add(new InfoItem(si->T("Core Context"), gl_extensions.IsCoreContext ? di->T("Active") : di->T("Inactive"))); int highp_int_min = gl_extensions.range[1][5][0]; int highp_int_max = gl_extensions.range[1][5][1]; + int highp_float_min = gl_extensions.range[1][2][0]; + int highp_float_max = gl_extensions.range[1][2][1]; if (highp_int_max != 0) { - char highp_int_range[512]; - snprintf(highp_int_range, sizeof(highp_int_range), "Highp int range: %d-%d", highp_int_min, highp_int_max); - deviceSpecs->Add(new InfoItem(si->T("High precision int range"), highp_int_range)); + char temp[512]; + snprintf(temp, sizeof(temp), "Highp int range: %d-%d", highp_int_min, highp_int_max); + deviceSpecs->Add(new InfoItem(si->T("High precision int range"), temp)); + } + if (highp_float_max != 0) { + char temp[512]; + snprintf(temp, sizeof(temp), "Highp float range: %d-%d", highp_int_min, highp_int_max); + deviceSpecs->Add(new InfoItem(si->T("High precision float range"), temp)); } } deviceSpecs->Add(new ItemHeader(si->T("OS Information"))); From 38684762c88922b82c36097e2005db0d2169a7cf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Wed, 11 Nov 2020 23:23:31 +0100 Subject: [PATCH 252/275] Fix Star Ocean stencil issue with OpenGL. Fixes #13746 --- GPU/GLES/StencilBufferGLES.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/GPU/GLES/StencilBufferGLES.cpp b/GPU/GLES/StencilBufferGLES.cpp index 566671d1d3..df9cd06193 100644 --- a/GPU/GLES/StencilBufferGLES.cpp +++ b/GPU/GLES/StencilBufferGLES.cpp @@ -214,6 +214,7 @@ bool FramebufferManagerGLES::NotifyStencilUpload(u32 addr, int size, StencilUplo } if (useBlit) { + render_->SetScissor({ 0, 0, dstBuffer->renderWidth, dstBuffer->renderHeight }); draw_->BlitFramebuffer(blitFBO, 0, 0, w, h, dstBuffer->fbo, 0, 0, dstBuffer->renderWidth, dstBuffer->renderHeight, Draw::FB_STENCIL_BIT, Draw::FB_BLIT_NEAREST, "NotifyStencilUpload_Blit"); } From 668fca01a8906ec61811613537f89220f47c7d97 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Thu, 12 Nov 2020 13:37:27 +0100 Subject: [PATCH 253/275] Fix crash on save state. Fixes #13658 Should be ok since the event will get restored next time it's needed (delayed). --- Core/HLE/scePsmf.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Core/HLE/scePsmf.cpp b/Core/HLE/scePsmf.cpp index 5805cfe04d..51bb3beedc 100644 --- a/Core/HLE/scePsmf.cpp +++ b/Core/HLE/scePsmf.cpp @@ -709,7 +709,9 @@ void __PsmfPlayerDoState(PointerWrap &p) { eventPsmfPlayerStatusChange = -1; } else { Do(p, eventPsmfPlayerStatusChange); - CoreTiming::RestoreRegisterEvent(eventPsmfPlayerStatusChange, "PsmfPlayerStatusChangeEvent", &__PsmfPlayerStatusChange); + if (eventPsmfPlayerStatusChange != -1) { + CoreTiming::RestoreRegisterEvent(eventPsmfPlayerStatusChange, "PsmfPlayerStatusChangeEvent", &__PsmfPlayerStatusChange); + } } if (s < 2) { // Assume the latest, which is what we were emulating before. From 5819ef1f824deeec19898702c2557b3d74637f1a Mon Sep 17 00:00:00 2001 From: shenweip <1037567878@qq.com> Date: Fri, 13 Nov 2020 18:50:09 +0800 Subject: [PATCH 254/275] Reads all packets to ringbuffer. Calls callback multiple times to read all packets when the write position reaches the boundary of the ringbuffer. --- Core/HLE/sceMpeg.cpp | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/Core/HLE/sceMpeg.cpp b/Core/HLE/sceMpeg.cpp index 67d7222cba..83f02cf6ff 100644 --- a/Core/HLE/sceMpeg.cpp +++ b/Core/HLE/sceMpeg.cpp @@ -1495,6 +1495,9 @@ void PostPutAction::run(MipsCall &call) { // Program signals that it has written data to the ringbuffer and gets a callback ? static u32 sceMpegRingbufferPut(u32 ringbufferAddr, int numPackets, int available) { + // Generally, program will call sceMpegRingbufferAvailableSize() before this func. + // Still need to check available? + numPackets = std::min(numPackets, available); if (numPackets <= 0) { DEBUG_LOG(ME, "sceMpegRingbufferPut(%08x, %i, %i): no packets to enqueue", ringbufferAddr, numPackets, available); @@ -1518,15 +1521,21 @@ static u32 sceMpegRingbufferPut(u32 ringbufferAddr, int numPackets, int availabl if (ringbuffer->callback_addr != 0) { DEBUG_LOG(ME, "sceMpegRingbufferPut(%08x, %i, %i)", ringbufferAddr, numPackets, available); - PostPutAction *action = (PostPutAction *)__KernelCreateAction(actionPostPut); - action->setRingAddr(ringbufferAddr); - // TODO: Should call this multiple times until we get numPackets. + // Call this multiple times until we get numPackets. // Normally this would be if it did not read enough, but also if available > packets. // Should ultimately return the TOTAL number of returned packets. int writeOffset = ringbuffer->packetsWritePos % (s32)ringbuffer->packets; - u32 packetsThisRound = std::min(numPackets, (s32)ringbuffer->packets - writeOffset); - u32 args[3] = {(u32)ringbuffer->data + (u32)writeOffset * 2048, packetsThisRound, (u32)ringbuffer->callback_args}; - hleEnqueueCall(ringbuffer->callback_addr, 3, args, action); + u32 packetsThisRound = 0; + while (numPackets) { + PostPutAction *action = (PostPutAction *)__KernelCreateAction(actionPostPut); + action->setRingAddr(ringbufferAddr); + + packetsThisRound = std::min(numPackets, (s32)ringbuffer->packets - writeOffset); + numPackets -= packetsThisRound; + u32 args[3] = { (u32)ringbuffer->data + (u32)writeOffset * 2048, packetsThisRound, (u32)ringbuffer->callback_args }; + hleEnqueueCall(ringbuffer->callback_addr, 3, args, action); + writeOffset = (writeOffset + packetsThisRound) % (s32)ringbuffer->packets; + } } else { ERROR_LOG_REPORT(ME, "sceMpegRingbufferPut: callback_addr zero"); } From 5e5f5d01648938a36f537e0262e3b62203baefa5 Mon Sep 17 00:00:00 2001 From: shenweip <1037567878@qq.com> Date: Fri, 13 Nov 2020 18:55:52 +0800 Subject: [PATCH 255/275] Makes video streams amount meet the expectation of sceMpegRegistStream() not only the mpegheader. --- Core/HLE/sceMpeg.cpp | 1 + Core/HW/MediaEngine.cpp | 55 +++++++++++++++++++++++++++++++++++------ Core/HW/MediaEngine.h | 2 ++ 3 files changed, 51 insertions(+), 7 deletions(-) diff --git a/Core/HLE/sceMpeg.cpp b/Core/HLE/sceMpeg.cpp index 83f02cf6ff..f6ed065760 100644 --- a/Core/HLE/sceMpeg.cpp +++ b/Core/HLE/sceMpeg.cpp @@ -667,6 +667,7 @@ static int sceMpegRegistStream(u32 mpeg, u32 streamType, u32 streamNum) switch (streamType) { case MPEG_AVC_STREAM: ctx->avcRegistered = true; + ctx->mediaengine->addVideoStream(streamNum); // TODO: Probably incorrect? ctx->mediaengine->setVideoStream(streamNum); break; diff --git a/Core/HW/MediaEngine.cpp b/Core/HW/MediaEngine.cpp index 6b1d646bd1..0a1e50f527 100644 --- a/Core/HW/MediaEngine.cpp +++ b/Core/HW/MediaEngine.cpp @@ -132,6 +132,8 @@ MediaEngine::MediaEngine(): m_pdata(0) { m_videoStream = -1; m_audioStream = -1; + m_expectedVideoStreams = 0; + m_desWidth = 0; m_desHeight = 0; m_decodingsize = 0; @@ -169,7 +171,7 @@ void MediaEngine::closeMedia() { } void MediaEngine::DoState(PointerWrap &p) { - auto s = p.Section("MediaEngine", 1, 5); + auto s = p.Section("MediaEngine", 1, 6); if (!s) return; @@ -187,6 +189,11 @@ void MediaEngine::DoState(PointerWrap &p) { } else { m_mpegheaderReadPos = m_mpegheaderSize; } + if (s >= 6) { + Do(p, m_expectedVideoStreams); + } else { + m_expectedVideoStreams = 0; + } Do(p, m_ringbuffersize); @@ -258,20 +265,22 @@ bool MediaEngine::SetupStreams() { } // Looking good. Let's add those streams. - const AVCodec *h264_codec = avcodec_find_decoder(AV_CODEC_ID_H264); + int videoStreamNum = -1; for (int i = 0; i < numStreams; i++) { const u8 *const currentStreamAddr = m_mpegheader + 0x82 + i * 16; int streamId = currentStreamAddr[0]; // We only set video streams. We demux the audio stream separately. if ((streamId & PSMF_VIDEO_STREAM_ID) == PSMF_VIDEO_STREAM_ID) { - AVStream *stream = avformat_new_stream(m_pFormatCtx, h264_codec); - stream->id = 0x00000100 | streamId; - stream->request_probe = 0; - stream->need_parsing = AVSTREAM_PARSE_FULL; - // We could set the width here, but we don't need to. + ++videoStreamNum; + addVideoStream(videoStreamNum, streamId); } } + // Add the streams to meet the expectation. + for (int i = videoStreamNum + 1; i < m_expectedVideoStreams; i++) { + addVideoStream(i); + } + #endif return true; @@ -386,6 +395,38 @@ bool MediaEngine::reloadStream() return loadStream(m_mpegheader, 2048, m_ringbuffersize); } +bool MediaEngine::addVideoStream(int streamNum, int streamId) { +#ifdef USE_FFMPEG + if (m_pFormatCtx) { + // no need to add an existing stream. + if ((u32)streamNum < m_pFormatCtx->nb_streams) + return true; + const AVCodec *h264_codec = avcodec_find_decoder(AV_CODEC_ID_H264); + if (!h264_codec) + return false; + AVStream *stream = avformat_new_stream(m_pFormatCtx, h264_codec); + if (stream) { + // Reference ISO/IEC 13818-1. + if (streamId == -1) + streamId = PSMF_VIDEO_STREAM_ID | streamNum; + + stream->id = 0x00000100 | streamId; + stream->request_probe = 0; + stream->need_parsing = AVSTREAM_PARSE_FULL; + // We could set the width here, but we don't need to. + if (streamNum >= m_expectedVideoStreams) { + ++m_expectedVideoStreams; + } + return true; + } + } +#endif + if (streamNum >= m_expectedVideoStreams) { + ++m_expectedVideoStreams; + } + return false; +} + int MediaEngine::addStreamData(const u8 *buffer, int addSize) { int size = addSize; if (size > 0 && m_pdata) { diff --git a/Core/HW/MediaEngine.h b/Core/HW/MediaEngine.h index ff3a032424..7e9bc2c585 100644 --- a/Core/HW/MediaEngine.h +++ b/Core/HW/MediaEngine.h @@ -59,6 +59,7 @@ public: void closeMedia(); bool loadStream(const u8 *buffer, int readSize, int RingbufferSize); bool reloadStream(); + bool addVideoStream(int streamNum, int streamId = -1); // open the mpeg context bool openContext(bool keepReadPos = false); void closeContext(); @@ -114,6 +115,7 @@ public: // TODO: Very little of this below should be public. int m_sws_fmt; u8 *m_buffer; int m_videoStream; + int m_expectedVideoStreams; // Used by the demuxer. int m_audioStream; From c223c18afee8ed36449e9760cc1b8aaf17702929 Mon Sep 17 00:00:00 2001 From: sum2012 Date: Sun, 15 Nov 2020 13:16:29 +0800 Subject: [PATCH 256/275] Fix crash in sceusbmic on load old staus then save again Fix #1358 again --- Core/HLE/sceUsbMic.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Core/HLE/sceUsbMic.cpp b/Core/HLE/sceUsbMic.cpp index 8068471689..246d8921e1 100644 --- a/Core/HLE/sceUsbMic.cpp +++ b/Core/HLE/sceUsbMic.cpp @@ -133,7 +133,9 @@ void __UsbMicDoState(PointerWrap &p) { Do(p, micState); if (s > 1) { Do(p, eventUsbMicAudioUpdate); - CoreTiming::RestoreRegisterEvent(eventUsbMicAudioUpdate, "UsbMicAudioUpdate", &__UsbMicAudioUpdate); + if (eventUsbMicAudioUpdate != -1) { + CoreTiming::RestoreRegisterEvent(eventUsbMicAudioUpdate, "UsbMicAudioUpdate", &__UsbMicAudioUpdate); + } } else { eventUsbMicAudioUpdate = -1; } From a16e758f339408e3cc4b2092255d7bac8bd64774 Mon Sep 17 00:00:00 2001 From: shenweip <1037567878@qq.com> Date: Sun, 15 Nov 2020 22:02:53 +0800 Subject: [PATCH 257/275] Corrects the number of added packets returned by sceMpegRingbufferPut, especially if callback is called multiple times. --- Core/HLE/sceMpeg.cpp | 54 ++++++++++++++++++++++++++++---------------- 1 file changed, 34 insertions(+), 20 deletions(-) diff --git a/Core/HLE/sceMpeg.cpp b/Core/HLE/sceMpeg.cpp index f6ed065760..a1bcc83719 100644 --- a/Core/HLE/sceMpeg.cpp +++ b/Core/HLE/sceMpeg.cpp @@ -98,6 +98,10 @@ static std::list pmp_queue; //list of pmp video frames have been decod static std::list pmp_ContextList; //list of pmp media contexts static bool pmp_oldStateLoaded = false; // for dostate +// Calculate the number of total packets added to the ringbuffer by calling the sceMpegRingbufferPut() once. +static int ringbufferPutPacketsAdded = 0; +static bool useRingbufferPutCallbackMulti = true; + #ifdef USE_FFMPEG extern "C" { @@ -387,7 +391,7 @@ void __MpegInit() { } void __MpegDoState(PointerWrap &p) { - auto s = p.Section("sceMpeg", 1, 2); + auto s = p.Section("sceMpeg", 1, 3); if (!s) return; @@ -400,6 +404,12 @@ void __MpegDoState(PointerWrap &p) { // Let's assume the oldest version. mpegLibVersion = 0x0101; } else { + if (s < 3) { + useRingbufferPutCallbackMulti = false; + ringbufferPutPacketsAdded = 0; + } else { + Do(p, ringbufferPutPacketsAdded); + } Do(p, streamIdGen); Do(p, mpegLibVersion); } @@ -1438,16 +1448,17 @@ void PostPutAction::run(MipsCall &call) { int writeOffset = ringbuffer->packetsWritePos % (s32)ringbuffer->packets; const u8 *data = Memory::GetPointer(ringbuffer->data + writeOffset * 2048); - int packetsAdded = currentMIPS->r[MIPS_REG_V0]; + int packetsAddedThisRound = currentMIPS->r[MIPS_REG_V0]; + ringbufferPutPacketsAdded += packetsAddedThisRound; // It seems validation is done only by older mpeg libs. - if (mpegLibVersion < 0x0105 && packetsAdded > 0) { + if (mpegLibVersion < 0x0105 && packetsAddedThisRound > 0) { // TODO: Faster / less wasteful validation. - std::unique_ptr demuxer(new MpegDemux(packetsAdded * 2048, 0)); + std::unique_ptr demuxer(new MpegDemux(packetsAddedThisRound * 2048, 0)); int readOffset = ringbuffer->packetsRead % (s32)ringbuffer->packets; const u8 *buf = Memory::GetPointer(ringbuffer->data + readOffset * 2048); bool invalid = false; - for (int i = 0; i < packetsAdded; ++i) { + for (int i = 0; i < packetsAddedThisRound; ++i) { demuxer->addStreamData(buf, 2048); buf += 2048; @@ -1462,34 +1473,34 @@ void PostPutAction::run(MipsCall &call) { if (mpegLibVersion <= 0x0103) { // Act like they were actually added, but don't increment read pos. - ringbuffer->packetsWritePos += packetsAdded; - ringbuffer->packetsAvail += packetsAdded; + ringbuffer->packetsWritePos += packetsAddedThisRound; + ringbuffer->packetsAvail += packetsAddedThisRound; } return; } } - if (ringbuffer->packetsRead == 0 && ctx->mediaengine && packetsAdded > 0) { + if (ringbuffer->packetsRead == 0 && ctx->mediaengine && packetsAddedThisRound > 0) { // init mediaEngine AnalyzeMpeg(ctx->mpegheader, 2048, ctx); ctx->mediaengine->loadStream(ctx->mpegheader, 2048, ringbuffer->packets * ringbuffer->packetSize); } - if (packetsAdded > 0) { - if (packetsAdded > ringbuffer->packets - ringbuffer->packetsAvail) { - WARN_LOG(ME, "sceMpegRingbufferPut clamping packetsAdded old=%i new=%i", packetsAdded, ringbuffer->packets - ringbuffer->packetsAvail); - packetsAdded = ringbuffer->packets - ringbuffer->packetsAvail; + if (packetsAddedThisRound > 0) { + if (packetsAddedThisRound > ringbuffer->packets - ringbuffer->packetsAvail) { + WARN_LOG(ME, "sceMpegRingbufferPut clamping packetsAdded old=%i new=%i", packetsAddedThisRound, ringbuffer->packets - ringbuffer->packetsAvail); + packetsAddedThisRound = ringbuffer->packets - ringbuffer->packetsAvail; } - int actuallyAdded = ctx->mediaengine == NULL ? 8 : ctx->mediaengine->addStreamData(data, packetsAdded * 2048) / 2048; - if (actuallyAdded != packetsAdded) { + int actuallyAdded = ctx->mediaengine == NULL ? 8 : ctx->mediaengine->addStreamData(data, packetsAddedThisRound * 2048) / 2048; + if (actuallyAdded != packetsAddedThisRound) { WARN_LOG_REPORT(ME, "sceMpegRingbufferPut(): unable to enqueue all added packets, going to overwrite some frames."); } - ringbuffer->packetsRead += packetsAdded; - ringbuffer->packetsWritePos += packetsAdded; - ringbuffer->packetsAvail += packetsAdded; + ringbuffer->packetsRead += packetsAddedThisRound; + ringbuffer->packetsWritePos += packetsAddedThisRound; + ringbuffer->packetsAvail += packetsAddedThisRound; } - DEBUG_LOG(ME, "packetAdded: %i packetsRead: %i packetsTotal: %i", packetsAdded, ringbuffer->packetsRead, ringbuffer->packets); + DEBUG_LOG(ME, "packetAdded: %i packetsRead: %i packetsTotal: %i", packetsAddedThisRound, ringbuffer->packetsRead, ringbuffer->packets); - call.setReturnValue(packetsAdded); + call.setReturnValue(ringbufferPutPacketsAdded); } @@ -1517,7 +1528,7 @@ static u32 sceMpegRingbufferPut(u32 ringbufferAddr, int numPackets, int availabl WARN_LOG(ME, "sceMpegRingbufferPut(%08x, %i, %i): bad mpeg handle %08x", ringbufferAddr, numPackets, available, ringbuffer->mpeg); return -1; } - + ringbufferPutPacketsAdded = 0; // Execute callback function as a direct MipsCall, no blocking here so no messing around with wait states etc if (ringbuffer->callback_addr != 0) { DEBUG_LOG(ME, "sceMpegRingbufferPut(%08x, %i, %i)", ringbufferAddr, numPackets, available); @@ -1536,6 +1547,9 @@ static u32 sceMpegRingbufferPut(u32 ringbufferAddr, int numPackets, int availabl u32 args[3] = { (u32)ringbuffer->data + (u32)writeOffset * 2048, packetsThisRound, (u32)ringbuffer->callback_args }; hleEnqueueCall(ringbuffer->callback_addr, 3, args, action); writeOffset = (writeOffset + packetsThisRound) % (s32)ringbuffer->packets; + // Old savestate don't use this feature, just for compatibility. + if (useRingbufferPutCallbackMulti) + break; } } else { ERROR_LOG_REPORT(ME, "sceMpegRingbufferPut: callback_addr zero"); From 90cc325b53514748746df80708a540cbda533d03 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Sun, 15 Nov 2020 22:30:16 +0100 Subject: [PATCH 258/275] Clears didn't always properly set the RenderArea. Should help #13664 --- Common/GPU/Vulkan/VulkanRenderManager.cpp | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/Common/GPU/Vulkan/VulkanRenderManager.cpp b/Common/GPU/Vulkan/VulkanRenderManager.cpp index b70848cb28..f7f15e58f1 100644 --- a/Common/GPU/Vulkan/VulkanRenderManager.cpp +++ b/Common/GPU/Vulkan/VulkanRenderManager.cpp @@ -551,7 +551,7 @@ void VulkanRenderManager::EndCurRenderStep() { void VulkanRenderManager::BindFramebufferAsRenderTarget(VKRFramebuffer *fb, VKRRenderPassAction color, VKRRenderPassAction depth, VKRRenderPassAction stencil, uint32_t clearColor, float clearDepth, uint8_t clearStencil, const char *tag) { _dbg_assert_(insideFrame_); - // Eliminate dupes, instantly convert to a clear if possible. + // Eliminate dupes (bind of the framebuffer we already are rendering to), instantly convert to a clear if possible. if (!steps_.empty() && steps_.back()->stepType == VKRStepType::RENDER && steps_.back()->render.framebuffer == fb) { u32 clearMask = 0; if (color == VKRRenderPassAction::CLEAR) { @@ -587,6 +587,7 @@ void VulkanRenderManager::BindFramebufferAsRenderTarget(VKRFramebuffer *fb, VKRR data.clear.clearStencil = clearStencil; data.clear.clearMask = clearMask; curRenderStep_->commands.push_back(data); + curRenderArea_.SetRect(0, 0, curWidth_, curHeight_); } return; } @@ -667,6 +668,10 @@ void VulkanRenderManager::BindFramebufferAsRenderTarget(VKRFramebuffer *fb, VKRR } } + if (color == VKRRenderPassAction::CLEAR || depth == VKRRenderPassAction::CLEAR || stencil == VKRRenderPassAction::CLEAR) { + curRenderArea_.SetRect(0, 0, curWidth_, curHeight_); + } + // See above - we add a clear afterward if only one side for depth/stencil CLEAR/KEEP. if (lateClearMask != 0) { VkRenderData data{ VKRRenderCommand::CLEAR }; From d9350d48993689ef52094d4cea709fbe23769e0e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Sun, 15 Nov 2020 22:38:47 +0100 Subject: [PATCH 259/275] Fix scale in FramebufferCommon::GetFramebuffer. Fixes #13644 --- GPU/Common/FramebufferManagerCommon.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/GPU/Common/FramebufferManagerCommon.cpp b/GPU/Common/FramebufferManagerCommon.cpp index 3a5fa2e21e..05187676f3 100644 --- a/GPU/Common/FramebufferManagerCommon.cpp +++ b/GPU/Common/FramebufferManagerCommon.cpp @@ -1983,6 +1983,7 @@ bool FramebufferManagerCommon::GetFramebuffer(u32 fb_address, int fb_stride, GEB tempVfb.bufferHeight = vfb->height; tempVfb.renderWidth = w; tempVfb.renderHeight = h; + tempVfb.renderScaleFactor = (float)maxRes; BlitFramebuffer(&tempVfb, 0, 0, vfb, 0, 0, vfb->width, vfb->height, 0); bound = tempFBO; From cf092eb53430184dda7af90f3b63b35a53f63bbc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Sun, 15 Nov 2020 23:09:10 +0100 Subject: [PATCH 260/275] Fix crash when drag-dropping texture packs. Fixes the main part of #13614 . Still some weirdness going on with error checking though. --- UI/InstallZipScreen.cpp | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/UI/InstallZipScreen.cpp b/UI/InstallZipScreen.cpp index 0f5f79551d..3f871e348f 100644 --- a/UI/InstallZipScreen.cpp +++ b/UI/InstallZipScreen.cpp @@ -116,12 +116,16 @@ void InstallZipScreen::update() { progressBar_->SetVisibility(V_VISIBLE); progressBar_->SetProgress(g_GameManager.GetCurrentInstallProgressPercentage()); } - backChoice_->SetEnabled(false); + if (backChoice_) { + backChoice_->SetEnabled(false); + } } else { if (progressBar_) { progressBar_->SetVisibility(V_GONE); } - backChoice_->SetEnabled(true); + if (backChoice_) { + backChoice_->SetEnabled(true); + } std::string err = g_GameManager.GetInstallError(); if (!err.empty()) { if (doneView_) From f30c61849b42ef44bad3f4227d275a492683be0f Mon Sep 17 00:00:00 2001 From: ANR2ME Date: Mon, 16 Nov 2020 18:24:18 +0700 Subject: [PATCH 261/275] Making use TCP_QUICKACK (or it's alternative) along with TCP_NODELAY --- Core/HLE/proAdhoc.cpp | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/Core/HLE/proAdhoc.cpp b/Core/HLE/proAdhoc.cpp index 416716561a..808b1ff4df 100644 --- a/Core/HLE/proAdhoc.cpp +++ b/Core/HLE/proAdhoc.cpp @@ -1940,8 +1940,21 @@ int getSockNoDelay(int tcpsock) { return opt; } +//#define TCP_QUICKACK 0x0c int setSockNoDelay(int tcpsock, int flag) { int opt = flag; + // Disable ACK Delay when supported +#if defined(TCP_QUICKACK) + setsockopt(tcpsock, IPPROTO_TCP, TCP_QUICKACK, (char*)&opt, sizeof(opt)); +#elif defined(_WIN32) +#if !defined(SIO_TCP_SET_ACK_FREQUENCY) + #define SIO_TCP_SET_ACK_FREQUENCY _WSAIOW(IOC_VENDOR,23) +#endif + int freq = flag? 1:2; // can be 1..255, default is 2 (delayed 200ms) + DWORD retbytes = 0; + WSAIoctl(tcpsock, SIO_TCP_SET_ACK_FREQUENCY, &freq, sizeof(freq), NULL, 0, &retbytes, NULL, NULL); +#endif + // Disable Nagle Algo return setsockopt(tcpsock, IPPROTO_TCP, TCP_NODELAY, (char*)&opt, sizeof(opt)); } From 38d887ce889607a54e59467ba528a65cdeb71518 Mon Sep 17 00:00:00 2001 From: ANR2ME Date: Mon, 16 Nov 2020 18:59:32 +0700 Subject: [PATCH 262/275] Change socket's MSS based on PSP_ADHOC_PTP_MSS --- Core/HLE/proAdhoc.cpp | 5 +++++ Core/HLE/proAdhoc.h | 5 +++++ Core/HLE/sceNetAdhoc.cpp | 9 +++++++++ 3 files changed, 19 insertions(+) diff --git a/Core/HLE/proAdhoc.cpp b/Core/HLE/proAdhoc.cpp index 808b1ff4df..4dac67c609 100644 --- a/Core/HLE/proAdhoc.cpp +++ b/Core/HLE/proAdhoc.cpp @@ -1918,6 +1918,11 @@ int setSockBufferSize(int sock, int opt, int size) { // opt = SO_RCVBUF/SO_SNDBU return setsockopt(sock, SOL_SOCKET, opt, (char *)&n, sizeof(n)); } +int setSockMSS(int sock, int size) { + int mss = size; // 1460; + return setsockopt(sock, IPPROTO_TCP, TCP_MAXSEG, (char*)&mss, sizeof(mss)); +} + int setSockTimeout(int sock, int opt, unsigned long timeout_usec) { // opt = SO_SNDTIMEO/SO_RCVTIMEO if (timeout_usec > 0 && timeout_usec < minSocketTimeoutUS) timeout_usec = minSocketTimeoutUS; // Override timeout for high latency multiplayer #if defined(_WIN32) diff --git a/Core/HLE/proAdhoc.h b/Core/HLE/proAdhoc.h index c90a3f9eea..651c85f958 100644 --- a/Core/HLE/proAdhoc.h +++ b/Core/HLE/proAdhoc.h @@ -1287,6 +1287,11 @@ int getSockBufferSize(int sock, int opt); */ int setSockBufferSize(int sock, int opt, int size); +/* +* Set TCP Socket Maximum Segment Size (default is 1460 on 1500 MTU) +*/ +int setSockMSS(int sock, int size); + /* * Set Socket TimeOut (opt = SO_SNDTIMEO/SO_RCVTIMEO) */ diff --git a/Core/HLE/sceNetAdhoc.cpp b/Core/HLE/sceNetAdhoc.cpp index 16afedebdd..dc2cb2df78 100644 --- a/Core/HLE/sceNetAdhoc.cpp +++ b/Core/HLE/sceNetAdhoc.cpp @@ -3099,6 +3099,9 @@ static int sceNetAdhocPtpOpen(const char *srcmac, int sport, const char *dstmac, // Valid Socket produced if (tcpsocket > 0) { + // Change socket MSS + setSockMSS(tcpsocket, PSP_ADHOC_PTP_MSS); + // Change socket buffer size to be consistent on all platforms. setSockBufferSize(tcpsocket, SO_SNDBUF, bufsize*2); //PSP_ADHOC_PTP_MFS setSockBufferSize(tcpsocket, SO_RCVBUF, bufsize*10); //PSP_ADHOC_PTP_MFS*10 @@ -3269,6 +3272,9 @@ int AcceptPtpSocket(int ptpId, int newsocket, sockaddr_in& peeraddr, SceNetEther // Copy Socket Descriptor to Structure internal->data.ptp.id = newsocket; + // Change socket MSS + setSockMSS(newsocket, PSP_ADHOC_PTP_MSS); + // Set Default Buffer Size or inherit the size? internal->buffer_size = socket->buffer_size; setSockBufferSize(newsocket, SO_SNDBUF, internal->buffer_size*2); //PSP_ADHOC_PTP_MSS @@ -3641,6 +3647,9 @@ static int sceNetAdhocPtpListen(const char *srcmac, int sport, int bufsize, int // Valid Socket produced if (tcpsocket > 0) { + // Change socket MSS + setSockMSS(tcpsocket, PSP_ADHOC_PTP_MSS); + // Change socket buffer size to be consistent on all platforms. setSockBufferSize(tcpsocket, SO_SNDBUF, bufsize*2); //PSP_ADHOC_PTP_MFS setSockBufferSize(tcpsocket, SO_RCVBUF, bufsize*10); //PSP_ADHOC_PTP_MFS*10 From ade89270c88570c302310c5bdcf5a2b957480de8 Mon Sep 17 00:00:00 2001 From: ANR2ME Date: Mon, 16 Nov 2020 19:02:41 +0700 Subject: [PATCH 263/275] Updated socket's send buffer size as an attempt to fix PSP2i unable to enter dungeon when using RadminVPN issue #13648 --- Core/HLE/sceNetAdhoc.cpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/Core/HLE/sceNetAdhoc.cpp b/Core/HLE/sceNetAdhoc.cpp index dc2cb2df78..21dc1c0ef2 100644 --- a/Core/HLE/sceNetAdhoc.cpp +++ b/Core/HLE/sceNetAdhoc.cpp @@ -1230,7 +1230,7 @@ static int sceNetAdhocPdpCreate(const char *mac, int port, int bufferSize, u32 f if (usocket != INVALID_SOCKET) { // Change socket buffer size to be consistent on all platforms. // Send Buffer should be smaller than Recv Buffer to prevent faster device from flooding slower device too much. - setSockBufferSize(usocket, SO_SNDBUF, bufferSize*2); //PSP_ADHOC_PDP_MFS + setSockBufferSize(usocket, SO_SNDBUF, bufferSize*5); //PSP_ADHOC_PDP_MFS // Recv Buffer should be equal or larger than Send Buffer. Using larger Recv Buffer might helped reduces dropped packets during a slowdown, but too large may cause slow performance on Warriors Orochi 2. setSockBufferSize(usocket, SO_RCVBUF, bufferSize*10); //PSP_ADHOC_PDP_MFS*10 @@ -3103,8 +3103,8 @@ static int sceNetAdhocPtpOpen(const char *srcmac, int sport, const char *dstmac, setSockMSS(tcpsocket, PSP_ADHOC_PTP_MSS); // Change socket buffer size to be consistent on all platforms. - setSockBufferSize(tcpsocket, SO_SNDBUF, bufsize*2); //PSP_ADHOC_PTP_MFS - setSockBufferSize(tcpsocket, SO_RCVBUF, bufsize*10); //PSP_ADHOC_PTP_MFS*10 + setSockBufferSize(tcpsocket, SO_SNDBUF, bufsize*5); //PSP_ADHOC_PTP_MSS + setSockBufferSize(tcpsocket, SO_RCVBUF, bufsize*10); //PSP_ADHOC_PTP_MSS*10 // Enable KeepAlive setSockKeepAlive(tcpsocket, true, rexmt_int / 1000000L, rexmt_cnt); @@ -3277,7 +3277,7 @@ int AcceptPtpSocket(int ptpId, int newsocket, sockaddr_in& peeraddr, SceNetEther // Set Default Buffer Size or inherit the size? internal->buffer_size = socket->buffer_size; - setSockBufferSize(newsocket, SO_SNDBUF, internal->buffer_size*2); //PSP_ADHOC_PTP_MSS + setSockBufferSize(newsocket, SO_SNDBUF, internal->buffer_size*5); //PSP_ADHOC_PTP_MSS setSockBufferSize(newsocket, SO_RCVBUF, internal->buffer_size*10); //PSP_ADHOC_PTP_MSS*10 // Copy Local Address Data to Structure @@ -3651,8 +3651,8 @@ static int sceNetAdhocPtpListen(const char *srcmac, int sport, int bufsize, int setSockMSS(tcpsocket, PSP_ADHOC_PTP_MSS); // Change socket buffer size to be consistent on all platforms. - setSockBufferSize(tcpsocket, SO_SNDBUF, bufsize*2); //PSP_ADHOC_PTP_MFS - setSockBufferSize(tcpsocket, SO_RCVBUF, bufsize*10); //PSP_ADHOC_PTP_MFS*10 + setSockBufferSize(tcpsocket, SO_SNDBUF, bufsize*5); //PSP_ADHOC_PTP_MSS + setSockBufferSize(tcpsocket, SO_RCVBUF, bufsize*10); //PSP_ADHOC_PTP_MSS*10 // Enable KeepAlive setSockKeepAlive(tcpsocket, true, rexmt_int / 1000000L, rexmt_cnt); From 29b2f2c4ef5a3749dc6efdcd78a2c601a3c6502b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Mon, 16 Nov 2020 23:26:37 +0100 Subject: [PATCH 264/275] Better GLSL version handling. Now specify the latest version supported by the device. Correct the version check for our own implementations of packUnorm4x8 etc. --- Common/GPU/D3D9/D3D9StateCache.cpp | 9 ------- Common/GPU/OpenGL/GLFeatures.cpp | 33 ++++++++++++++--------- Common/GPU/OpenGL/thin3d_gl.cpp | 28 +++---------------- Common/GPU/Shader.cpp | 1 + Common/GPU/Shader.h | 1 + Common/GPU/ShaderWriter.cpp | 2 ++ Common/GPU/Vulkan/VulkanRenderManager.cpp | 5 +++- GPU/Common/FragmentShaderGenerator.cpp | 12 ++++++++- 8 files changed, 44 insertions(+), 47 deletions(-) diff --git a/Common/GPU/D3D9/D3D9StateCache.cpp b/Common/GPU/D3D9/D3D9StateCache.cpp index ed0bbdeff4..a799713c95 100644 --- a/Common/GPU/D3D9/D3D9StateCache.cpp +++ b/Common/GPU/D3D9/D3D9StateCache.cpp @@ -5,7 +5,6 @@ namespace DX9 { DirectXState dxstate; -GLExtensions gl_extensions; LPDIRECT3DDEVICE9 pD3Ddevice = nullptr; LPDIRECT3DDEVICE9EX pD3DdeviceEx = nullptr; @@ -64,14 +63,6 @@ void DirectXState::Restore() { texAddressV.restore(); count++; } -void CheckGLExtensions() { - static bool done = false; - if (done) - return; - done = true; - memset(&gl_extensions, 0, sizeof(gl_extensions)); -} - } // namespace DX9 #endif // _MSC_VER diff --git a/Common/GPU/OpenGL/GLFeatures.cpp b/Common/GPU/OpenGL/GLFeatures.cpp index 9cff5bbad1..bb355d3013 100644 --- a/Common/GPU/OpenGL/GLFeatures.cpp +++ b/Common/GPU/OpenGL/GLFeatures.cpp @@ -77,19 +77,28 @@ bool GLExtensions::VersionGEThan(int major, int minor, int sub) { } int GLExtensions::GLSLVersion() { - // Used for shader translation and core contexts (Apple drives fail without an exact match.) - if (gl_extensions.VersionGEThan(3, 3)) { - return gl_extensions.ver[0] * 100 + gl_extensions.ver[1] * 10; - } else if (gl_extensions.VersionGEThan(3, 2)) { - return 150; - } else if (gl_extensions.VersionGEThan(3, 1)) { - return 140; - } else if (gl_extensions.VersionGEThan(3, 0)) { - return 130; - } else if (gl_extensions.VersionGEThan(2, 1)) { - return 120; + if (gl_extensions.IsGLES) { + if (gl_extensions.GLES3) { + // GLSL version matches ES version. + return gl_extensions.ver[0] * 100 + gl_extensions.ver[1] * 10; + } else { + return 100; + } } else { - return 110; + // Used for shader translation and core contexts (Apple drives fail without an exact match.) + if (gl_extensions.VersionGEThan(3, 3)) { + return gl_extensions.ver[0] * 100 + gl_extensions.ver[1] * 10; + } else if (gl_extensions.VersionGEThan(3, 2)) { + return 150; + } else if (gl_extensions.VersionGEThan(3, 1)) { + return 140; + } else if (gl_extensions.VersionGEThan(3, 0)) { + return 130; + } else if (gl_extensions.VersionGEThan(2, 1)) { + return 120; + } else { + return 110; + } } } diff --git a/Common/GPU/OpenGL/thin3d_gl.cpp b/Common/GPU/OpenGL/thin3d_gl.cpp index 6695ae7728..05b27923c2 100644 --- a/Common/GPU/OpenGL/thin3d_gl.cpp +++ b/Common/GPU/OpenGL/thin3d_gl.cpp @@ -134,25 +134,6 @@ static const unsigned short primToGL[] = { GL_TRIANGLES, GL_TRIANGLE_STRIP, GL_TRIANGLE_FAN, -#if !defined(USING_GLES2) // TODO: Remove when we have better headers - GL_PATCHES, - GL_LINES_ADJACENCY, - GL_LINE_STRIP_ADJACENCY, - GL_TRIANGLES_ADJACENCY, - GL_TRIANGLE_STRIP_ADJACENCY, -#elif !defined(IOS) - GL_POINTS, - GL_POINTS, - GL_POINTS, - GL_POINTS, - GL_POINTS, -#else - GL_POINTS, - GL_POINTS, - GL_POINTS, - GL_POINTS, - GL_POINTS, -#endif }; class OpenGLBuffer; @@ -607,12 +588,15 @@ OpenGLContext::OpenGLContext() { shaderLanguageDesc_.Init(GLSL_1xx); + shaderLanguageDesc_.glslVersionNumber = gl_extensions.GLSLVersion(); + + snprintf(shaderLanguageDesc_.driverInfo, sizeof(shaderLanguageDesc_.driverInfo), + "%s - GLSL %d", gl_extensions.model, gl_extensions.GLSLVersion()); // Detect shader language features. if (gl_extensions.IsGLES) { shaderLanguageDesc_.gles = true; if (gl_extensions.GLES3) { shaderLanguageDesc_.shaderLanguage = ShaderLanguage::GLSL_3xx; - shaderLanguageDesc_.glslVersionNumber = 300; // GLSL ES 3.0 shaderLanguageDesc_.fragColor0 = "fragColor0"; shaderLanguageDesc_.texture = "texture"; shaderLanguageDesc_.glslES30 = true; @@ -623,7 +607,6 @@ OpenGLContext::OpenGLContext() { shaderLanguageDesc_.attribute = "in"; } else { shaderLanguageDesc_.shaderLanguage = ShaderLanguage::GLSL_1xx; - shaderLanguageDesc_.glslVersionNumber = 100; // GLSL ES 1.0 if (gl_extensions.EXT_gpu_shader4) { shaderLanguageDesc_.bitwiseOps = true; shaderLanguageDesc_.texelFetch = "texelFetch2D"; @@ -637,7 +620,6 @@ OpenGLContext::OpenGLContext() { if (gl_extensions.IsCoreContext) { if (gl_extensions.VersionGEThan(3, 3, 0)) { shaderLanguageDesc_.shaderLanguage = ShaderLanguage::GLSL_3xx; - shaderLanguageDesc_.glslVersionNumber = 330; shaderLanguageDesc_.fragColor0 = "fragColor0"; shaderLanguageDesc_.texture = "texture"; shaderLanguageDesc_.glslES30 = true; @@ -649,14 +631,12 @@ OpenGLContext::OpenGLContext() { } else if (gl_extensions.VersionGEThan(3, 0, 0)) { // Hm, I think this is wrong. This should be outside "if (gl_extensions.IsCoreContext)". shaderLanguageDesc_.shaderLanguage = ShaderLanguage::GLSL_1xx; - shaderLanguageDesc_.glslVersionNumber = 130; shaderLanguageDesc_.fragColor0 = "fragColor0"; shaderLanguageDesc_.bitwiseOps = true; shaderLanguageDesc_.texelFetch = "texelFetch"; } else { // This too... shaderLanguageDesc_.shaderLanguage = ShaderLanguage::GLSL_1xx; - shaderLanguageDesc_.glslVersionNumber = 110; if (gl_extensions.EXT_gpu_shader4) { shaderLanguageDesc_.bitwiseOps = true; shaderLanguageDesc_.texelFetch = "texelFetch2D"; diff --git a/Common/GPU/Shader.cpp b/Common/GPU/Shader.cpp index 35fd9fa035..bd62aaf2ed 100644 --- a/Common/GPU/Shader.cpp +++ b/Common/GPU/Shader.cpp @@ -15,6 +15,7 @@ void ShaderLanguageDesc::Init(ShaderLanguage lang) { switch (lang) { case GLSL_1xx: // Just used in the shader test, and as a basis for the others in DetectShaderLanguage. + // The real OpenGL initialization happens in thin3d_gl.cpp. glslVersionNumber = 110; attribute = "attribute"; varying_vs = "varying"; diff --git a/Common/GPU/Shader.h b/Common/GPU/Shader.h index 8a863f3c7f..20bf482239 100644 --- a/Common/GPU/Shader.h +++ b/Common/GPU/Shader.h @@ -50,6 +50,7 @@ struct ShaderLanguageDesc { bool bitwiseOps = false; bool forceMatrix4x4 = false; bool coefsFromBuffers = false; + char driverInfo[128]; // Really only GL uses this. }; enum class UniformType : int8_t { diff --git a/Common/GPU/ShaderWriter.cpp b/Common/GPU/ShaderWriter.cpp index d5bc375921..4db6bd8577 100644 --- a/Common/GPU/ShaderWriter.cpp +++ b/Common/GPU/ShaderWriter.cpp @@ -107,6 +107,8 @@ void ShaderWriter::Preamble(const char **gl_extensions, size_t num_gl_extensions for (size_t i = 0; i < num_gl_extensions; i++) { F("%s\n", gl_extensions[i]); } + // Print some system info - useful to gather information directly from screenshots. + F("// %s\n", lang_.driverInfo); switch (stage_) { case ShaderStage::Fragment: C("#define DISCARD discard\n"); diff --git a/Common/GPU/Vulkan/VulkanRenderManager.cpp b/Common/GPU/Vulkan/VulkanRenderManager.cpp index f7f15e58f1..e8b3849e00 100644 --- a/Common/GPU/Vulkan/VulkanRenderManager.cpp +++ b/Common/GPU/Vulkan/VulkanRenderManager.cpp @@ -434,7 +434,6 @@ void VulkanRenderManager::BeginFrame(bool enableProfiling) { int curFrame = vulkan_->GetCurFrame(); FrameData &frameData = frameData_[curFrame]; - frameData.profilingEnabled_ = enableProfiling; // Make sure the very last command buffer from the frame before the previous has been fully executed. if (useThread_) { @@ -447,9 +446,12 @@ void VulkanRenderManager::BeginFrame(bool enableProfiling) { } VLOG("PUSH: Fencing %d", curFrame); + vkWaitForFences(device, 1, &frameData.fence, true, UINT64_MAX); vkResetFences(device, 1, &frameData.fence); + // Can't set this until after the fence. + frameData.profilingEnabled_ = enableProfiling; frameData.readbackFenceUsed = false; uint64_t queryResults[MAX_TIMESTAMP_QUERIES]; @@ -502,6 +504,7 @@ void VulkanRenderManager::BeginFrame(bool enableProfiling) { if (frameData.profilingEnabled_) { // For various reasons, we need to always use an init cmd buffer in this case to perform the vkCmdResetQueryPool, // unless we want to limit ourselves to only measure the main cmd buffer. + // Later versions of Vulkan have support for clearing queries on the CPU timeline, but we don't want to rely on that. // Reserve the first two queries for initCmd. frameData.profile.timestampDescriptions.push_back("initCmd Begin"); frameData.profile.timestampDescriptions.push_back("initCmd"); diff --git a/GPU/Common/FragmentShaderGenerator.cpp b/GPU/Common/FragmentShaderGenerator.cpp index 4118696bb1..3fe4764029 100644 --- a/GPU/Common/FragmentShaderGenerator.cpp +++ b/GPU/Common/FragmentShaderGenerator.cpp @@ -409,11 +409,21 @@ bool GenerateFragmentShader(const FShaderID &id, char *buffer, const ShaderLangu WRITE(p, "%s vec4 fragColor0;\n", qualifierColor0); } } + } + bool hasPackUnorm4x8 = false; + if (compat.shaderLanguage == GLSL_VULKAN) { + hasPackUnorm4x8 = true; + } else if (ShaderLanguageIsOpenGL(compat.shaderLanguage)) { + if (compat.gles) { + hasPackUnorm4x8 = compat.glslVersionNumber >= 310; + } else { + hasPackUnorm4x8 = compat.glslVersionNumber >= 400; + } } // Provide implementations of packUnorm4x8 and unpackUnorm4x8 if not available. - if (colorWriteMask && (compat.shaderLanguage == HLSL_D3D11 || (compat.shaderLanguage == GLSL_3xx && (!compat.gles && compat.glslVersionNumber < 400)))) { + if (colorWriteMask && !hasPackUnorm4x8) { WRITE(p, "uint packUnorm4x8(vec4 v) {\n"); WRITE(p, " v = clamp(v, 0.0, 1.0);\n"); WRITE(p, " uvec4 u = uvec4(255.0 * v);\n"); From 0b64d58c7d03cf23e2c689932a78fdbc3ed2f0ef Mon Sep 17 00:00:00 2001 From: shenweip <1037567878@qq.com> Date: Wed, 18 Nov 2020 10:59:45 +0800 Subject: [PATCH 265/275] Fix mistake. --- Core/HLE/sceMpeg.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Core/HLE/sceMpeg.cpp b/Core/HLE/sceMpeg.cpp index a1bcc83719..67d71a69e7 100644 --- a/Core/HLE/sceMpeg.cpp +++ b/Core/HLE/sceMpeg.cpp @@ -1548,7 +1548,7 @@ static u32 sceMpegRingbufferPut(u32 ringbufferAddr, int numPackets, int availabl hleEnqueueCall(ringbuffer->callback_addr, 3, args, action); writeOffset = (writeOffset + packetsThisRound) % (s32)ringbuffer->packets; // Old savestate don't use this feature, just for compatibility. - if (useRingbufferPutCallbackMulti) + if (!useRingbufferPutCallbackMulti) break; } } else { From 572a2e48f6fe2a5e430cac62ec4ad601aee2a320 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Thu, 19 Nov 2020 19:38:16 +0100 Subject: [PATCH 266/275] Fix some wrong asserts (we don't use ) --- android/jni/OpenSLContext.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/android/jni/OpenSLContext.cpp b/android/jni/OpenSLContext.cpp index 93fa8848fc..47841567e0 100644 --- a/android/jni/OpenSLContext.cpp +++ b/android/jni/OpenSLContext.cpp @@ -243,7 +243,7 @@ int OpenSLContext::AudioRecord_Start(int sampleRate) { } result = (*recorderRecord)->SetRecordState(recorderRecord, SL_RECORDSTATE_RECORDING); - assert(SL_RESULT_SUCCESS == result); + _assert_(SL_RESULT_SUCCESS == result); return true; } @@ -251,7 +251,7 @@ int OpenSLContext::AudioRecord_Start(int sampleRate) { int OpenSLContext::AudioRecord_Stop() { if (recorderRecord != nullptr) { SLresult result = (*recorderRecord)->SetRecordState(recorderRecord, SL_RECORDSTATE_STOPPED); - assert(SL_RESULT_SUCCESS == result); + _assert_(SL_RESULT_SUCCESS == result); } if (recorderObject != nullptr) { (*recorderObject)->Destroy(recorderObject); From 737e0d55d4a06cb026ec453010e1860ecc23df97 Mon Sep 17 00:00:00 2001 From: nassau-tk Date: Mon, 23 Nov 2020 01:56:12 +0900 Subject: [PATCH 267/275] Modified "ltn0/1/2/3/4/5/6/7 .pgf" Updated more good size. --- assets/flash0/font/ltn0.pgf | Bin 54496 -> 249244 bytes assets/flash0/font/ltn1.pgf | Bin 50744 -> 328940 bytes assets/flash0/font/ltn2.pgf | Bin 58456 -> 270760 bytes assets/flash0/font/ltn3.pgf | Bin 53760 -> 357772 bytes assets/flash0/font/ltn4.pgf | Bin 55012 -> 255040 bytes assets/flash0/font/ltn5.pgf | Bin 52428 -> 336712 bytes assets/flash0/font/ltn6.pgf | Bin 58456 -> 278656 bytes assets/flash0/font/ltn7.pgf | Bin 54468 -> 352496 bytes 8 files changed, 0 insertions(+), 0 deletions(-) diff --git a/assets/flash0/font/ltn0.pgf b/assets/flash0/font/ltn0.pgf index 73c44c04b425842ef85ba9e3f50860827c8b32e3..0abc4fba296517b9dc6c5acde76bc5689f895818 100644 GIT binary patch literal 249244 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 JW<1Og&ODN!sGg&>MpiMlM< zh=N@tirAOLUe;vuB&lor#G;kn<1dJ|J=)*XSLFNCgjsff8eE~)W`CkU>xFALa zv0p!Ip$`@I@c}w2P!cdUoDETe9E`&}Q&>+2IcP8r=Q2SVG>$OO12Jd_tN{w^c*0q5 z4&!fia6dlqDWDe4g7vU>ZY}JA=YV}&plnb_2KCTq3;RgIHS`f!2b2bDgo*%#^Ju`} zeso~4|CiB0o(j(j+F4)^7VHIi4p2A`_CSO4U@g=!;4^{3IJ`a*SVLt4p9R)*FpmwC z28;`g4B~X4Oc00njSBYzF}M$$1(gJh3Jd{tETCkeLLaW#P(hprlnWH@3FpB5phCuQ z4j<^RdN_|Oj6-FDT9}7Da1G}{g?(@?obziB4)EbQ5Lge44c248Xu>|Oun!UTF@Q2b zKS>ye{qS1hesB+{um{HAejH&O0X{Se@Zo$usG&k1C_D?CiwKPie7Gh7h1W|3N`^UM z9S!usIE-;Xj17zqj0)EvMh1B%RA8`jB|j&J)luRoDY->lnWHD;d$YF z=(B+FfYIPQpnOor5XNC1_Q5z!*v|usz&ubUm_rB32mTlc!#D-R#(;7_{8tb3VJ$QS z7!?>F><4wOP8cTxg$CnrF6?K4IyjRIW^jdj!Tn$zJSW@}&Zof`R8RwZ$AEEx&jgBq zS|*so20jTG0*nRYKw%x!Uk0xO?nwr5Hp~mxe4u;~gZa5@752e8CYTTRWrBJ*AD#!! zhqKwjJRK+(#3?Wb4Bl&aT@1K}2J&z|39MlZ_RZ}NbPV{gp9SN<;F;hos2rehFQ{Cg zbf8RNWMCXHp9>Y#As`3$tFz%4-D3mflmi(*aHpvupZ82fIJNt5BOx@bAXKjgLQBotc7bh57u))EmS@* z9yAcA2;*F^{yPs=6PT_ z1{D|su0fm(j0^gyuuj-d1wJ3t&_Ij{Vib^qJrr02491D^zx1@bhYB%nYLt}s3Zd@}IaK$$?PK*vBY11KH%WatCs0ObK?0i^&Xff^tP zANVYwG@#ID0%ZfG1LXr{1BLalp9+)<6wc>>{TaZg0G|tdSO@cDu;u}Sb$p<7pd=9I zfqE`bCh*BX$As~@xqu6t0sHtM4%e_B_90-6z`W3hc^U}wfRcg!s)sta4^TJ<<~bnG z06KSGpmbq98O($AFir;w!aw z59k=Efl3B(SO@1pg>hI1eK>~!bWB*s06rD?un+FT0ZIctA1ECttb-h&!Z^GRST`33 zJ{!d0d|1x|J_oGf>xmB(xO05TK-s{jLm$+UfKq`{fzn_-PitcQ6fI5!on$*>Rju#O`1X~2i)paCD&bA&#e!v%3RP#|;X zf^~G@Lxtz3038DgWR4pZE?^$)#}nq~d=MrBp96C6JaheE&4;zXU>_C4$v|1a=K_Q0 zpo2NEh6fDR!8jAd;l5B|jslDWj3w-cb6}nVlmYJ-tN}iZ!+lA@Iv!Bq&Yd5g7uHdM z&jd2MA5ETAml!#oN2a9-c%TewLobgP6Kh0Fb?Zro(&Z4#{)_SJ`1ej z{UZZ~b2%VR1`4l}4wNCRhy5(*gE}TqI0G6L*cdPxFb*_O2hwx<&Yc6qsKBQHB>{!? zbf5@OxF76;K3V9)JaFgk3ykxC59h$yP+^`644wzZXh7jy__+psKJcl)rwi-IKGeMpUlmzQQoC)IahX;E>Jr&fmK%5Ha z0)_X03*saYCjp-e{4t<>&_e;r20lf&FCX}0AkGIqAJkJo9}6fK#7UqI?hnt&1U?P; z2*`6mo(_}_bgmcV;NEj*0BaUl^ME2i*`SUB>KI@S4TRv#x!EAjf&D=FfD;eo5Kuz~ zc@F4h0Hp(E10@56T;TO^fg(UTK*;dSK*wMn7@R!@Vmy%N10UuXpq>VN3Rts2ZVV_q z8xz!0fzp98fWjH@3`}5DP)7lAHi#iG4%TF_chgS-<89l_rd{f8~Yeqk=QSb8>}s zOktcPjFW_Mim(rIh4t)T^+F{J<8)yk?^pa+|1TBh$-nA;^$C?LREDsgB=o65r3w4k zLZ2?IgZC4ji!Y4Bdjx%kP!VArBJ8IK<8${K#Av_zgmYNJI;PMEFFGs*!P5`|0}*8* z;v7Vhhe(ehBoaoJf|*alEMQ<1Sr}ywMumq_8^e%ESWOC6n}*e8VD(v8Lk`x6hcy|) zQb;&63eJLtTf)Fuvv9T?oIMZcIEJH=@Gca*8x8Nlz{}NZlH@+GDWM|qMNv)wS3WfL~Juztbr=FjV`u>Db~am zYvGFR;)}H*;_YPd4yyQGy7)e(_8Vh2b7sSUbNGx5D+`b^?;)1m23ogR|1M7^NMhN=@xbEf1h{UI4$y9r{S?$A7wLkBu{WY#OCZj&F zSbcJ-`j<@gubb7s9aaBvM}2l&9g!tt&B*wP|8pFp$%HJj=oYg0F|y=cvh)O*G$D}D z)R1%0kYA;tP^O`@TVvrR4b>MK>R3$;O-(HqO`TPmdS#jhyEPYG(lmadX^Pcatf^)0 zqGh>C%c@MvX1A8zB`t>+T25GPXH9Ka7j5@d+MZ?F-n+GZFKPR~&<@1vEY;KzIO&80 z=`73AS+PYY{FqL}U7e^2K{Qr3MpHM|MK^wxZep2k@^0OfOS)+x2PY)^N9(;hrGF&Md>OErth<86LW8cx1wmBfIFB*`nWq7M;vm zbb8C8GshO41H(raU4UCG;?8Y!QPZf;#pv=XqpM{`*LNG;yks=+!e|g{d`HuG$i;Yg zmGOfz<43!VpIkBqJ-@#&9>JPC*ED(QVglUPtKh%r4@v+ffD%9npaf6?C;^lJN&qE* z5?=d$D4}V&&tDRXzz+UoKY1nQ3U5 zX}Ox|#G2`?H#6ukThwP}{L;)6XTDg=-2Bsj3a!OlyJf7o)p~QA4s*LcbBCAaPB;r^ zEelsy3-?$H&-E7G9TvWQ7XB|S0{`{BXmXZ8=9VGBmdmm&S2S3L|Lc|ispI~;n^*Q( zM!vL+#x04_S`zEJBtCXY;`$}Y9ZORBmZZI0l7X|z)UwKUwaSUL%3W`j-(gkQXI1pl zssv|Us%5?2)p|p$b>({N>JIBoeb%)vt?O|%o3(5j{+$;UXtOQWX2*J)rVg8yKAT-H zZQ5|Q?OL`SuC{w)ZTGFW-QQt*u+R4JOWSUo-BB&O{-s?n z&ivwf{V;v2Gsm zaUO}~9?5$=Qu;m8UU_8TJu|gEv)w#%;yiQ9J@fZ?7WR7?|S9khWBaL_UUl**&FAxuiR(< z9-o8#K8IiVbmM)GYWp5{^F0ygd#c>GXOHjMe&6%2e0%YJ7q$KR-25)b`CTpdyS~To zX20LSE5AX!{~c}rAvgcwIR6Lb{*U(fKk4`X{gwX+KH#}_z)QD)*Kq-F%LCr;3HYNw z;Nz=+QGDRIcHk$sz|V1kQ{{ovdjh}r2hO|-6yRwX9U9J^CK690ZlHwNYgS% zJ2Xf)CrE!=kl~3Sqv0Tv&p{OVU^B~Li_qXDIlf`0w|mT_?Q5J$!F` z_`VI{`}c+)yc~Y`b$GYP%A-0fkGrot5x?@(hLt^gSDwAR^8D+Sy&@48bt3xQBQD2B zT-^|HeQ(6g%Mk;wBL+nx@90DhxknDiM?TmP`DkzClgp96zm6OciF&RR_0m1+b$ry@ z4N>p+M*VR)>f`IEQIY6zo#;>Q(Vyd^r#3`S?~VR`IeO-Gv_OQ8(WT=&=pqSpVg+5S zlP+hb;2qQ-Bns1t8@}p=~b*U=v=kv z$|~bGt4s;8i*;koJz^~rV*h@zU~N?qYttEPcO};0O{^0k&RI9k)g#V5AyzKM?}B*f?@#CjyeCnO|RBqVnxq+Cfz zdy|ksNX*nt%=SpkNl47CNX+j{EWDCf^d_-{kW{LhwB93WLqgL3a*Thtl@&?Vok^Rn zB-Or2swX6G)=h5kNZyu^yrUwysWbT>Wi3~dcfCn&Bdl)MUESfadT+w&eHE+scdkBo zW%c1VtGfv)M|D$2Mq+ah#y?G^d z;7#fvA?=QC+K@-ua6;OHinK?aX-}@C{r)CxgpmGRH~pnY`s;-Bw-xE{JJbKTlK$~c z`Y0jeA1C?0ZK0kqu_R;ii{NuY##9Bo%<0aI?^iNr-ed>}42&KF=gAOBWDqMEV*3~p zR~b@o8S{vlGJ2VEo|%H^%mulbiaRouPi3k+$W)ukBr9ZTT4iZ3&(h7!(%+F~cq+^2 zL6*r>7DXZ3%qrVrdG?arY(agtpe@_>RJQ#TWa%&^aGc7fDy(s_TH^*H(Q7<%*Ldw% z<8x}wKSk~LU`@c(8k#~*kX25|@|9-14;vxoeYl ztX(~~MatE+X>ZqN5OXv2aC#g1{y>Opaf6?C;^lJN&qE*5+Pv#Q*?tK9cmx&OQJK+z3L^*022Z3s=;u)JzR zSl5P?*EU4H+Yl{U5u;xb>s1k-RFPO!k=#|0a;+lmT}8$}j`!=BsQ&+)07J1d%er#S zipsTlm3fVo1*a?5J*+JLTFF$bDzmOCUr|+&S5?(mwefUS&BLm?uT?C?>MhpQ|8*C& zbw%~|yz0ir>gLncJ0DiJeywIJZrp9XanFj4op~F(8aEy|z46e)jYqz2CEX(=N@jl@O2YcvF4I>P5;00C|*vgxms0oy{qQtwVHugG zPhRz(lj^6c>ZiNvzhA4Lc~>v^DnOK2SQ{2Tj77+2i8issdsvc>SkluhlG0{bo6YmX zHZREEtk|?!xo5M=qs?m5o5@OBG;OwMhi%c#-=g2N#jt0K(W5OU(_1J?4Q4hC7GVub z@*Aw18f<$S>>o8aPB&1Mwz}ACbqm|-k-yceX{%4qR=-DE1E#mql(q%gYzqn7wk&_! zil%MhJ=-E4ZHt=TMpxRt%4U09*!G0{?MY4BSNCjBeY8D&dOJgDN0!ZwHDNo}PR{`- z*^$?@qo8NUx<@;Tr*|-w8p~`N%flKg@*As~8aMVd);wygn{H$&HEpqJ+8WlhJ-?~3 zsj0cAY3HM+*6Aj;QuA(`<~?D}o%zjOP0a^-nh!l{J~G|RQEEA6)ACzb%gOwf(@iaB zdRopsYPm4o!d2RN$!2GN*v>2YJFhkEywS7s)}x)br+4y{cHOnvbuVn!{rp`In|6Vd zJ?`1{^wF+o)4TXetuJg^Uxl^4$!~qv)cT>P_0LDGe@(ZJDYZ@5v`vP!eaUb8`tw@; z>z+<@GD-j?fD%9npaf6?C;^lJN&qE*5Z*6AIX(&1~^AY{|!L>2GY3a=WZ;`~2|s1qJPj z&F#u(+EpI6t9@%HEAQ5{-K`zITeo1he)Dd_GrNr*?>70io1)xdX4_#A-m#>h!@9Y{ z_DqNU;||Af9aQB#F1CBz!uNO-?D1;e<8x+@-{U<2-}cay_XgSS4GG`7tYGhoZvsKv z-taSfBOdRK`nH#@+_}oOGcLR{p`bIVxpVcI&eX@9>EAjT%KNfx_pJ%vx3*wkUh}?! zGyB#(-dFr>A5*!j%(kmMysM(1tE#zc(Blx7hCA8oqyf!Tx`f#s7h1 zWApyzGy8Wwh8wkh+s{@$u-o>)9&rRgaELUbgcu>N$OcIncySRW5d#r>kwB4fktC5^kqsi-MD~lE5xFJuROGG5sK_@FJb^?| zA(#<72~mVBLJ?sXVIScNVVLlN@R{&~pi0ywQiv|Z0Ae^XmbivkN~|JoA+`|r6VDUx z6UT^>q8g%BqW+?BqU%H(L=TAeiVlnZB}xz@i`j^Ii!BpN5L+v@QEZRcIk9_UAH@jb z>f(0d%f(Z~OT@Q{9~8eNeoy>^I3l4SVJhJ%5iPM+qFSOwqFbU*;-SP}52-2$3X41aW zG19rxHPU;f&q?2vel0yMEj>?b-jaE=d5QCi=53z0f8M!yL-XFv!;{D)Thek;I;n!x zM*5A!BfTPhCrQbWWfsf0$k1eBWEe6TUVMSt0?Go<1uGXY z7E~{Ga)a8Kd6!e<3ZMQufMMHj^g#Vo}t z#a)WODPB{2rua!wOi4q@O36CUge7lUX`S(tZJxgqZ*(ZrJAW)uG*;DrFv5Js_FyP z*Q%4ML^UNfeKk9^05!VW8nq2-+tv1~^{Cxcd!qJ-8loL1myWJ&S@vMO1ZY)rN$Q^`K$5OM@LmYhP)C6|ylk=w~#WG;D_{DzFtP|~o} z@X?6U$kHg)Xw*2Q!PU5{@loTehNLE0(^At@Gg@=4X02wM=5LypH6Ln@YT~ujwJfyU zw8FHqw5qi_w2o_C*LtEgsYTRQ)i&1l&<@wm)GpGl)84IpQv0&@i1w&9UPnpCP{%>X zUnf#0OQ%AoRp&RIKArnIA9QAPus z8H;Kb?OJqvQQx9Ri@q!pH_|dPH*zzIG|DupG-@$AWOUAG!03U|OQTVvStF9Mnz4nk zzj35-uJI;gw()V}o5s(KzZert7MhrvxSNEVWSUf&>^3=Va^2*K$tM$>=>k(-QwP&v z({$4cQ?}_b(*e^Lrn9E<6l015WhrGPC61Ct$)S`}Sd?}Ohtfy6NBKy>Emm4=wAf{F z$l`>>YZuon-nIDX;=aZA7QbBlc`@Eh!A#H0#Vph;#jMDz)@-NQ5wl*iVY7E;7;{;3 zU2|)5Z}TwoB=a@q8_c(uA29DRzi&Z{-$Lg}xL#vNg7;AZJ18XB|Q)@G8OKWRuJ8MU4XKOcW zPir4*e`}g`u=O(QFl)MXf_18OmUXUmv2~?&z4bQhoz{D;yRA=KU$P#serEm2`l~g@ zhF~LYqhO$+s!9skLdb*<-`8>9x6PGi>w9hG4tER>yXc z?Gjt6ZGdfpZH8@$ZH;Y{ZM*FO+uv-@+4kAqv>md2V*A4OgYBg4cU!!jq@A3ds-2FV zk)4H|y`7t#pIwMugk7v%id~jnzTGCfJ$5JU`t2Ury|`u-Rdc!zqXB4v!q(I$#{x#PH_h|>ZmJtqezAE)I`DNanM2B$qv$DOV?J#>2Q^u>ulRiNrn zEvYWlAZi?S4YiWmOg%(BN4-sbMjfMKo##7~ofkRVIxlrjbS`w>;(XA#-+9FOv$K?o zj*EqhyGyW3yi1nL2A5Ws6E2rr9=eRXNW1E}E^+mBO>)h2WxCe6?sPrj%5$A?6}U>c zDY|L9nY%f;1-eDMG2F`BSZ=Lu2i+{IxqmRIcVJwJQDV82wqB0rX2hu?9(OMU}>zx%!QoAkr`%lWJNoBO-^2m43( zC;4aj7x{1U-|oN9|D^v#f1dyE{vZ9n`ilfC2+#^J4zLaI3kVBH49E#!2Gj&>4`2rz z3^)^TJ>Y4;p8?YWVuA93tt^y7JD-(UtQeOe6dvQX^_2jzsiE3`cy35JbpD z>PFf`21dq47DU!X?u|Sjc`x#hNNki+lv$K_RD9I>D0b9^s3%d=QS+nCqWz;2qM6aV zqEANOjs6%dLD#3d)1&A`^hWw|I*&d^myTH!;}eq-QyX(6=61}-7|B&8t9(}_t=h0^ z@2X3yUaZ2zYQ?(6CdO999*n&f`zDqUXAtKTmmF6WcOdRY+@Eoh@h0(p@#*n3@m=x# z@vq{M1oZ@mgy;lj0z2V+0zW~Jpql8I7?W6*xI6Ju;>*PMiDQXViL;5sB$*`TB&{T) zq$NqzB%h?^Nvo1llM0e5lQt){By}bImc&iEk#sMKpY$Q=Q_@V5M6zeOwi?WqS-Pp9^$-cEg*`e*95RIxP0H2pNIH21X7w1l)ZY2|6#(+;Nfrrk?> zmi8`fBJD?-WctE%O1f3LW4e2~UwUwQczR5FQaU3&FP)iQmEMrvn7%vxNP18Dwe&~n zAJS*iB{Ebp3^S}UoHKkfmS#j{Ff(>%T*(;7xR>!NV=4pBATbs)bQ$IhXGS0+k`c#9 zVPrFk8P$yKj5fw0#s$U@V}$Vs;|l|qDV?d5shw$>>72PNGbS@FGdHs=vo5nKb5CY> z=H<+1nIAI0X5zC{vJA2;vqG|xveslVvud&$v-V~k%Q~CYpEa2EH0y2Fc-C|lCR;39 zHd`fIH+ylmeYQvT((JJ8*zC0IyzKSab=l3?o!Q5-2ebdk#;#FZW4XqA&8jubH4SSH zueq`2%^GZuOpZa0cTRFnNls(Vshn#$Pjkj{2y2zsQr3E`O@Damcv$dPfq0=|p;sZju%xi5@L1tM z;k&|bh4Skbt#e*STNk@-&ARe++t+oiJH2jT-G_Bw)`=G>7a0}V6?qgz7G)RJ6m=AF ziyjtzE0QhNDYh?OR-9H`QoN(MyZCbPgW`|Hv&9Qa^h@kZR+J=_6qeMN>?%20a;@a| zl8F)`Q-x{H^k#-L)0ySWHs&$r4d#0$QmRyHQR-WoP+D5Lt@LQ=<54}cKPpr! zohnyVmR9bqyjJusCWnZ-O;NncEAtGq=}nZ`*!s`}OS)w!ho{ZM)14%^emyym!!d)5^)mGBBtF5Q)QQOxxCAKX)f?ddNVRP9p*w}WhcK7y# z_Nw;%?E~#&?XtTqcZcp?yL-oO?(XNi@g2GyE*()Fg&n&(E_94^AbZGrocF}+DciGW z&(%F2_DJtF*&DF8U~k9X%X{DLmFzU_4DQVB+}YXN`Jz)~pTRz#eQEpZ_Z{1JZ{OrT zxh~7DkglAr#;!A6PrGKjH1@mgPu#z8|B?My_P^ebKcI2I=|I$h!UH=GoIUXPz{CO4 zLDPc)2Qv=V9_&7N_u!|43l3Qy3O$s2sQJ*@L%$!IIYd6}d^q-S*lc%92ZUurUK2t zXvxvmqoyLFF>p%ADnBbWF@x{lN9#1*G`S@?g9~}R3T;(^X z-=coY{jK4*L%-erZS1%CCnzU;PQ;%mKC%78ffE-_44)W3G5;jxWZ=m)C%2wFbn@!S zcPFu@^iR2*iak|$YWu04eSYx#pj@p*ZaKpd#^l~!u94RaMyF$+%sGr_fM|qMa_$j7nfhmytwh=-izliKD+qiqSB=$ zmwYcpUdp?)=@R?WnM)5YOl!aKefNU|3Lr6 zet!Sge)-FbE_+?3UoN=3B`e9f-A~bms}0G znsSwSwc+ZatNmA>UY)p#zov1`>RQ0HxNAk%wqNVMcKzD(YhSO)U8h|4xW4Lo(e)kI zk6yoZ{q=R+4YeD#Hv(=X->A63zH#QpgBxQvq;D>|>2ovw=7yV{H!t6ObCY;W=a%QK zq+39=ilCRyXE%j+XJ^pZcp6C56Tbf4cZO*4TcWV2eSs5gWCr8 z4W1diHu!vSVi3=h<7x4h@B(EcZ%1`yTyCTd(ZpIBixa@qj_iX z9fvzUcUInszmt2X>`wii);ovqoW67I&VxHI?tHv6dq?8#!n+1{&F|XYb-NpMH|%cg z-SoR_?-t*!yW4vAz}?e#`|l3jeR+56uHf#xA;lqsA?qRUp|GLkp@N}JLoGuGhE5G# zA9_6W$Iy=BA+%HN(4x4-B6gzA`*C{QL0B;qhVYed+u2@2lK5x^HoxdOzTP`2FPjnfC<( zN$}THWD-Fn_G->EL@qAQdxsz#5F+CcWI}p@lonB1mQp{^qBvPhufHAC#z?gc;wvJE zA#w@Hdxao;41$n=X-N|?rg(jU{p>f*`p=_`Hqq%7#k{H9F+@b)hkHqe@fATVZpa#A zqxAX92^UQH7YL`-T?7Z7X7_wKoqw^VI}m%}S2$R3;Lq$EU%HYm9{Qi*bbWpj&T&r| z_k|1toRNV=5IQ*HYh`2NydWpM(TpNl;5TO6jXUOqvkjauU=|@Re>ji3+zen&O)3V> zgfumSvr-R7DiK+?RFQwEOL-GjramS!J^TM@x zVIqMO(L}5hb{TWMOcJ>EjlCp&g1-W>QJ{vbzmYuhy_WnL(R4N#I<*~Pg0u3$ zy@LFG<+MfRXp<`6^wjT;hEkSTb1!0Go&|C=a4j`BCA?kb0)mO3z>E2EFz@~BBJOhs zd|n&!D2Dw-&WR{-CX5<(82S-0_@1Z)b%BB{^>Y}xz&!ZO4{V$6A>Z_~TnvoLC_cIMn zxPYJ0VjkHGAV3VM&qrcQwF{j_Yx)#yk;!a zWyFb6I>g9mf^j!-K#frAL~y7lsNN@8g)C6=#o>Hhv$$jHiq$<81ad z>jEUmVg$?pjCkN0$>6>+#bk+CBSH~}8d1!l9xAy#`)q3BS*GlZD@1I-Ix@cj^ti%( z!Fj>Hc#Pqr^E%AQ)RVoKziinvA?mo6k_!C!Xc6O45tSJ??%hDV-!m897en?|RtE0; z#_^#)OV<8q_~8X-0A^Hh2)M6-n6z}l1^hRog@d?S?CAi+lzUeN@83!o|F{lsxcK`z z-b_62dm?XU8S}IHo8-K2fk?-V^9mSG?$7hX*Dsu7DJD)(RU}HhbRrhEIf^KL7ja~g zkypl;cesA0z=rKeJvY8*=I{$}QE?~g_ZD#+sq4lp5WF{>1I`1Vlb>_&(yDEEWJpG$*WKJ=2c&=ThEh0A(p}ay9RJ2yZ-{ zH?^AgBY`9c9+UM0w+f-b>jKY+pE>}eQmM^4UQ0F^5i_elJ@~#Pa)$n%MZUw6%JAYE7DOmq_^bLJxf@V4oPo?4X)sdPRE9L~|%a*@1n2%_^q_4#dy@y6I)GxQq zSfx*QT7dH{qQ+nt;2QbxtYD_^LKTc6^0IAAznA=HE`xnEk~tyzsT;g^GO5PY_J7p! z=4!P;?ThX)-Coikc?|ZQHtGbXYZRHjLQf|Y78aUQ!CAq5h$V`t5{`gpQ3dDFicc%S z*9PLx8{@$%DlLQH&`K~mAH#dHiuXR2FQ2Hxy@bH`9r!#^z-z+NM0}otDr;)SGBG`q zJeKp=Hus~yrYXkaf6m54C37#T5Dq&MYNH8}B?N~fgvgAa+u&55m~rne1lx+3#FOlq zyEWi>-c8FWV~yO*n0lczl?a}hRk@mTBJpi`N{efxJ5IqS47{* z&HJLuEa1pXHxiw{m9h!*W=1~caYP)|>JRS|ca-R{#C7S4v{=vS7Zdwgbo-i}@!e zZm(q^S+fDiPX;!4F>Evuqw>FDU;-F0hXRlvUsaHM&lXaYSQkHnXW-jNWfDH3N*8bK z{_mO>&Ie%OKXnmIFl2H+Qz1C{dY2oJS-Omveuft0zs&6t}X^)B(Ff zaHL1A8$X_bPZneb66{J^z-PQaQR2P>QQ~zZ(1SP=JyYui65|F}Hfc2S=*l zWv@uUI?9+cf)9do0YA2o-$pV0;!G0nW%eECqG*AMiqoxGc+Yu5=KM|~HobuS4-vVb z$?wFeeAR#bBe-p9@?&>y;WuNV)D|s_9(YfHGvRj@cu(BL#4;et+~E!IaVj`{x-FAO z7Dr5}m*$=~87(mq5fjmrMdDs*BjSpTiCFuOS$y)*sY$2tw~u}JS(LF%DuM(ue=?{G z5>uYL$-;q)9!{HF`>u?=ZO7k@JM2W1HW0+KreXy)%))47=&Lazuwot+5V{Ekg7;aR zSFM>mS}~cw8?pV{z4`k*aKP?N9;JxPA0lEMe@avlX-uYw!xa>97*z{!4iQxFS_IdK z;D26YrkL)p5hf+7y))fQxkJo}dJ#pWT`;?rMfow3!=lX$W^))|!rShkznKgB(#%Nb z$kdl;J)<`{B>qyb|K&QrfY+f(iQ3>dV}gy;*Fb^+@}-1`@tZ9maqbRgvPnN2iI_%# z2q%a&RX>)xf3~}~vNUZW5gRGIw@l%^Ef+Jy`BqwqIQow+!dinzr+yU6i^AuR(3}W% zfz3pTWLET6c-~V|P>yyYwcjgyqir~-YMFK7U(B!jV&YC=P9)8oP+b@1@ zV%T374{xyTySB1(qh@?{tkDPXFaDW1_~*6`e?p{56?r0JBlxp~&^9qhl#E@2WN}~4 zy*I!!vVg%ehTRwl7qOo4c6~Ua#r@=n*Pq4lz#aW8HCfE!2Tm2R*d<>JSgiUf6_P9S zyOm&Q{Fw%+9{0Uhp^ezr-DITaE7eFi^{F9;luWZCoTW7tE2 zm4xu`qY0c$!CLmD^jeW|$!Rm@C+Tl(E7r`4lx}-EV1RLiX9b@z@I855QyzyeSjXk7 z5;1?}kok^8iQV0mb%lW=v$-cW{FTiiynfbxLOeBSz7oDp8*Cq3w-Yd zZy&{(WPW{olqN&Hci~v_zVA{>#K;UH_9%FHgJ=CUc;5x{Z-H0J)I>znljyOOE_uX+ zh&3hRn3LTr;Aaqc?zuvC;4=u$3nXI4TQkQfqXvX`>u1|s#x&S(1%^biHv(It_ zhbBnkysdX;m;R-I?a`P{6Zt+9L7edi7m@`&!70dU?$5b&;p^$Sm>rnQYs(^$M`~l4 z#qR~RPDJZ>g4Q+c^|ON_2B!o*Snr1;*4VJ`y$eL12v!oMPD~uh;l&t@h7(ng2t7CUMtgP@2^4Qlc);q-ru9GHn7i*n)~EzwLj;l4J)DV^*nA&x)G=8b_j z*PooRFaL0X-x0z068IglS{)l2XjUCMnPO*q^}NE;y-31WFa ztl8m=L7Y`F!s8LmGG=ri1%cj3Ybk*s8WRa3r=^_SmP`A~M(M zJ`wvP7;J0=uE87m$;HJ@OcKCnMkAKw65PA)-GoVdYQ1Pbva~T~w!6nE){!A_qN;D4 zQ5YUk>PL=EG^bMSnZ4LBYB%m#7K1_O&JO&Oy&ZGOTt&FwuZ?G7rzRcO_kuuZ zZ0>IjY;aZ{@FT=TF}MEG8MCR!epVWKN;c=?5oKf*LI$rbE~tUOvoY;uO+!sq2=XaT z7$t5g!UVh~@5`yDp4I2{32eFjy?B4(4{5eF_`P)nxHl>4O5%9y70Bx;oqC<_=e_S* zq$W4eekVS}cs&&IJ%HR(X)Cj-c-vAG(xfe}hOhB>e=(;V3dmCn# z@b}@1ZTTtq0DHb4KFWdLj6aG?s>f^=c#QcABKeyqj%4ylI9s?kI2YU-qj>68fedr9 zIAr=8NnpnQ8Z(HumHwK~n_9`1oiN3DMbiYQ9{w^@*UDx1UwB<+OqwM)B@%|CmRxf5(wC0qSL&nsnX9X%MC1n0F7q~az z#f0CRfx#mfUOTje`6Yeps4ZEb$(fQ;aO(N4t{B}TIu*&5n+U{NXD|fH_rDpkI%Y4( z1ID(@pJ$+hUvzK~f?nw&6=8jPcW;zh-`X|E_|b09{Dd)$z(2y7z<*3P z;-{VGeGcv^xy_pTflqv|hjA7@mv`}EMswfEa)x4y0|mA!PJhng{MB%d4*ZQG>bTo$ z$oy2ii5>5Q&Aab7r!OOTHOsf(!29wyak{{m`txrkWbo`z!E3>N{ycoTGc%JT$**_I za}?my+NA%&EdMY=#F@aqm)UYPu<&myO!z#4dhoXuBEGhoC~|1lg)dKhhl@vM;+PYf z0_^zkyAiVBC3osEj;=>v40?Y(H{d%Y?r-M}KQuEqOE@D*iR67X99ztQ?*_ zjsMG-`?VhT%#!!nfp3S80{5=ei2L(96dmkO2K(O^Q-^O=Z^0MYnc{(&(Wy`BdKyu4 z-%arDRP8y=W1x-irw2k-u85qDFsuof8Biwf9mOT!s z4fygW)#k$t!Leuzp~7bk@L~&l-IOFT3o8_`fs-ppg7d0_nbBC^x=r|XH{H4SQt=Tx z{h5a*)8d{4vM0N-g)>DMUu6AUKNs{v!z*C}GPycMR=>ZQ8c+MyKYlY~AHG^FJOv*n ziSfe+81pyb>lX38YV$tpGsj1s2uyL&lhGmzbL8=ek8l<|3!LSqB!yX2xj>|3G6Ux& zX!$PC;yu>ny)XbzOS%zw4FwqStMSPaOD5gE`K0Hok5-&I58k?uZ{1X~=L-?tCCCkf;_&kfihw$w7r{~+y4z?wL>zh~Z=$wU+k zu82SaZpaqE4G~Gi4L5>2u0gGpRwV%!5S5HwtyU(r?X9;}liEdFm&EqAwTmWQueH`h zZx`#9abK!tB?$@1d}jcA{qA?a=lP!h_w>nN!_0Zld)_nWJ?k3>ddjbkWh9@ExP{ zX~AsRF{ejOOOEj?@gxW`%d(t>M9yI6Y9gW4Hs!sriS(QpWTz^ekc$H zpdru!S=3*#;m@?5n9gfpQzt6QclP2rn}skZa(^8 zEjOMnW?&tGPI(6}V7GL?1~<3Nf9+lV)oi9&l}mJPh8!9{j`6CowVl0cbRauA^3~@Y zzpEnvUCv;@)_~5mz=lhu)aBZPGr8NIhlOmJd(L=VK4bUPjWT=AdYMa%VJTLwZI9N1 z3>c8*1H4f4#%sl!RLC7{jkhc-|7WUA=-QqjHGan_$oRRIRO+R27&%-hHnqFA8b)U=7aUTcwRrJI0<#x_cA z3s$3q{8=yDZGd}bGvB!DPPXf#67J_9x5`C%zMGg_xMB@=(`%s$_~WgPm4o#mQaPB< zWcI$#9}ZEu>Fh@2qGIp6^U!DoB$1~muTb?)^i_@41!S?A)@%4yc)z}j_KcyV^tPxe zPaj?w$~5|oqqEbJK#%%7NE4J@MG?v^Y=Vy!nIYd}$O^=Giaa>f%QiK@uK5hU~cRCUZ#fbq-wvS;Q-@#0#mguu!K+MoyJ3F73% z4NC4el-cDQvdWo$o%5pPCz_MJXkPWGyS{x_Nj7k2hUAvRDgW%gztE8@XKwm8=iSd$ z*q3FScSeUrVhWAGM`VV`+fwFZaY)|a#JVdxf!o#3^M)XQkUa)` z9*-r6gp*N6=m~3Z@3W_E`Q}jFX!hw=qB8P*VCzL}?^fIJ{MX%88jp7+5Ji3Ot zf70hs(8rpx6#UbS_f)6T?jw1OU!%%(pXVvgw&(<^vb=%JRe`C@x6U_DxmkMT{x9c| zy+(^u^uQvS%vlD2e9e<1>M=I9521KG1iZt9OdA@jM8&$v6B4NHfnSx z=;AkR&ob~_F7U1s$B7_9+M}amk9rKE^ymqG3KUS{zk$S1u!#(cg6Go=l1xjdf2A|m z`Bn>A&nL=Wb|9loK|b}c`vN-oX~?^N>(aoQf$CtDAh*7q3B~?>P3z^(l(`F|jS_pX z<8wP!sBgGbaIY|aIf$-ua58)Q!Q40YlFjAM3NnS?Jtk8!Yg{dN%X?-l6B>+t935y6 z&SHXu`<~~{LUWg`abCqQ!QqPCj4Q6vCT^_8*f_>yJfOz-t)U!!SdDvGbl@WGY6|3F zyAO2nDqeC9gWcAfQYe+If?Tl7A|*zjAqpbfPx32`@1LGTTu#Hrafa{OeJ6oGp}ryk z8<0$}f#$tyD}v2DpKkryC9J&=pD5w;IfZqaPUL#(%`tvvwM_a)#YIUtvP?M&{hxmMgQ z$VCrh33@rUYbWt}2lb-m7e(-ZUbW<0a~9K*nHo8G{R3ZPNi+WFe&*lzD|}0W2l=%> zomHSJzVk0HzM>9D-%@|=v7yn!@c!1fCBi#rg!?7%Dei}(k+aEi&t;`&Yc8K@t(;1X zweE9kV9rKZHy3>LNYb^2o+6IE5y=X8&QyL9{dAMr-*270C5>B7OfwN@a=r_yku(rO zl6m)>G+KgA4rS6jZ-8A1R!}%i9|cA$G5u4r}`YCMQ0i+xz^7< z$=RskiN4qttQ>d~-bEvPRt_5mzR)uM`*I2!#B6a5g0+$X&o20#V6Q9TGh~?9I~mJn zQ%^_ot{x{6Qk5V-;9a;!kl+2T1v#_0FS=h@?p*g=bT&5-z8|4PZTDa>H#6Kbwo4~` z>WWl|<4EtzEtj;}X3wjIR@H4(D);R8+<_JF{jF;T;lh*G&Bp3qlv!8#iI0Z zw{SSs{ED+b)1uSzCvh1ukrhuj>cl=L^?VeCveGl&cBC;a>dNSeF|LXH2G;<7y~O^@ zOke|BYF+9v0Iz~w*OC~vpkL28FpZo76>qeDGTnX7P4>CtocWy_O%B=CG4E7H4A}$d z^cDwgZ<)({&riYn-fu*GZaWiD`jwCV`AM^FwrjC%;7D5cj7LL@HqG*QTdO+8U>+Nz z_OCIPJU&L)w$A)cWwwQ=oWbnme}=b2LsYby$d?^Y@S?U+?ogiAPhk}1_^o11_DH&( zFAlHI)vt>`L})w45p+hFOG3Y%gOByxP80RE8GIe{ZjHQZ^Uq|$@BA85DCQ4TAQY|x z4wFgzJzw}7(y~|G$D&R6Rvi=;Cr4}ptYIDTbi|OxoXg(0U<$vQy3gm>22Q5gox;ps zUXErkC2g{+gz;oBUSij7G_h%0Z7z4#tD^CQ$nJ15w~SmE9mx1dUfl4ft%ONU zOU2zqm(|3>3?|sQGIU<_F@N{#XGtx^qZDgUz3!af;rIi_9|GzBQ4mW^!+iJu-|tA~+`Rv#WE%hQ)&~bQ&5O z$S-<~HY%=Vtb7u-m0;Md&cCU#DmpjHLqU9vHurzTJH1%65bK9_f$no1>ldF)(4v*% zo;30HaT_guEqZ}p%)HAVIb1Lao1SPm)3vhHm17fm>Db>r=UcI{x2lQJcRha`yWkX+ z7238LAU7WdQ}O`~-E8y!`#Q$#J2QcK4M>WQw@}ZAoUK^Z$gcX3Kox3^#)kH#Jb6Na zUBBx&e=KH8%gp~+O9%pHVb}4kpd+(LF+r2n07;n6(%F#9BTMh{o8DO=`P6e{lCg*x?JxvqNz+J+t%CCx&c5uO(NxKxq??QH|Ri-Ac z$S*~QF_9JTtARK=l5daXG2ak&DX~#i<9_xa-(&yVa_q^+=o3lfYF(N9OxH+f3Q@uL z3K!Xrr`m6=EC2tU2rl(ABpy-D85Bqd@z;l4%5x;4x3G;V4 zQp>%7%GN01acrpYJn;C_>!PkGl@=8q(bh0eD0xD7&|?xF^hq&((=n4Toy(wCrEkos7}4Zj`kA%`hW=0z^si@}(H2A+LNEV&DLXpu>Q zrM1~vD?BgQ*&WHUV-fbkP&2Pg*6lALy8EhsfHPgO~9gc?;JF;z{Mf&U~|AW z#(cm#!hFLy)R=0Q6Mb7*YP5se&S#MuRWf2qR84GCa6_1{`A(J5z7lngtYT76>?+!FDW{ut;I;=y7S#pPgJg$L?zvxGGrHxLEv_QQzjjs_dwTvVh zND(DO$Yuc5v<|fUr`p34?SV{t=qY_mOt8UdWRKD4L|r8eqrsN7?R~`Xn*c&&x8BEhr_L*g@nQ@B>+sA&|(Ne>NS-KSO|_KO6BFz$WX3{=;Lgy zCJ(E?iz&tP?(m~r^$KTSG}1GSv)K+1}BOxssoJ3fR-9nb4V~#;YSzP_*LvJ5nkTDH28JK>jd+#=VdH zt`7dntpqSgCjF^porEm1sg0z^hMxeE6Zu+!qzXtTw5C{>GFNG%DOTVy)qWee9Baip z*u*4f=63iPf~^p27nw|uFaiB^+%?bN-yTj928hJQTAn}V%o}MpFR^>;D!GHS=1GQjz&qlWzK12 zs`#wR{z=%B_V$6RHgfS|%VgNN667aLz6>Mvi;mb>C`Fzl(_Pag{Mt%RLDLEv5qA_5 zJMuBVRf;8LPz#>pACdoaRlxU>|B~~YJI>aspCxjXE;lB0haD(OD#_<`s9LB0v**o? zu5tWYt`ZCZAs5Z5z^=E&{zl-D0i7-r$J6BEwMyeQ>~6rlLm%*N^kj&Bbd*cc-a!yP zH>YxM5eYjyV!LOWeuveO$xh7=lR4SW*L^mkv?q4kVFDOa9#&z6{RDi9ZfT-!cnR&X zh%&SEj>` zCPha{wwFt>FQ@WD%omt!v(7h}@rT*-;e07&^Mfm>TDHSPiymatA}MTJSmk3pgC8^< z-q(fTCl|K)$@u6-lytWSc+dSG@{Xw=;~lSo;}*W#Yc;D$VBa=eLkiq~e8f}Q&U}~9 z(01nI;)@05^*YSozm5AAq*o9&|67cKQZ3tNlC8RLy)3+NjMY4h)XW`=9% zZ^4FgpkFS~Um(y2*}sz3ubptc+3Fa|QXenG1iH@}u5MF_FUWL^c|n}{B}jarlar;^ zt>)Mtu>_s{42wYcTO(*oFwM0JB7EgC07g-fY?_kd_*85eUIqHXkO=(c^j1@dAIwBQ z<39+By%YA!L)yoLnjP+U(!DvpX-o_4lZrh%ON7H8TT=iBzgF2eS8}QLkFMG-vC5@=&_o7aLw~4^1@U%_*p$+Uor0`!;0o?#;8d zI;fv6L-hr~E{l2))0lQ0K9MS-@Dh>7MrDRgqJ`0Vt_pk}8t=P*9^@T>jew96k&QR5A<~m z=<8I_*9<0}SWA^L?fE<`UxppPbm?_%4(Io6<&8%r(dl z4SX9<-c6&$b&&p52+uv{3&Z1RaesJTpO3W+1_Js6UprIn!D)v~FqkQD$T!usq}v5w zt&&>@OEhpi_P_hJHw3?Sq-&PsBUw1p?kzFy_gaY6>Y>LcyGc{vpif8WK5YTtmPRkd zfNP7Y>)UhCBL)8!bpPj_$(hq8)6``rku4=Rer_Wc$;s_8Jqd&RMmTYxz(MP#T=Rj* zX1Kh%ro7xhWzJ;U^YXbJHZ}tj(+j>xC#A^dt6(~pF~OD3^9i0H78%L7MWN2IYVsuQ zk#f6GA-esTMG9-?AEs}f$meqxs8boyQQRr&Xyz8BcZEt>_w#X=Z8kbi}c~+%?A4>8A6)(gpBIJtXnBA2Ud?mO*Wl=}@sic``pt zpghe+0^tnSH?ECtEAfP@g0Ghuf8$q!)qns@x}ZZ2fAKqp`;|~MtI!^(sI^fR)T5o} zVeORj1j0Sl)bukbxb&Y>S9qe7Zj0M_w&P-#?m%Y(ymQ*xP zk(tPLd3YzZbNwJspdI5a5@_Q)6dm#alP$<2L^MxxRanI3Re#Z5*kP-+9kx0#nWn{C z4)(U@jwDsSdqiY3bJeo7_0O+u#AY=yU$-P5D4&ig;l7}b?lBQNq#%_@G2>mGb}PJe zHOYdwaS-=9rE83~1ba80fp?gL{oDogvF?~?2~BR|>vOFE9ZgOLQ=^zTJ_j<*nInct zX_`vfT9XT9dzx6q*C{1Wz#}stw_7K?cksMGBT-5dqduQ6Vtps4qjHPsjcitAO~Eq5 zY80ejaomC*>z$&jY6QTtdW9^)PRnbF?Y!^XW(8#c;1DN)n%>k7d3H$<;dIJotvyiq zd2h*VSA(rYO)6$@V||TE;|VV)PJ*G5PlF(EmmGuGsd?acE!ij)nF1zS^B&Z*MaiB2 z3$44oi9EO`18W}an)!TC?3V(7c$A|?d%@BLG!bnmH@d4<6To5U zoD+;u$p^NbCU}Vt%Sf26nx>LF4_#{A=h+WyD)?zGu*)Dqa^aIRUFrNpv)?h!+FUKl zsS^w{bMXOv_Risd@ZFfeC@h+RwWR6;G44smXsw*wXgVUg4+yKkMtk!(bE7{6cNn#-H$%A9efj^(NM&+W-7J8A2Oh#W*f9llK zX?_DYR0Mf8i2Fb;oS^40Mtna4UxDPeJr~AI3sb)A8M3NzLKyNzKpL z%|cQ${epOCNHhy{Uk5Y=KT4pR76&4U?t>Sa| z3C5jY4Ho$QpQK>@lyugkdP7?GZe+p;?StQP2UsIddkcJ>125kw^U)RRuaqpsb#lGg z#N;qd685n8Am)8et7-`aw?->%ozD6-sf2nNRQ&KH8(92!Y%WG10UIgI-w1XjKAxb_ znKk8rj>Ho`;h$iZgdIT@k^WDj=zWe3CmWX zbQLGI`|=r+n>1gRz-#7a(cZ<5gF554DSos zjW0D{HBGm_0tsmS?|gJH6JGFx6W?JVK2W=)3z&-$LcOye2CZr`~O18=zG37&Ap4z((Ub#y1`wgkg4NFKZ zb}O*%wk;;~6#tQiXrRJR+JlpsQjZSH2%`bEs2U~iZ-~!jj`GVOwij~!BYKDkB5Ssg zlV1oW2@`qDRuWCOUms!rqeiR$fsc-2LaRRE6EXiNCP>>Alok17WiTI^%%gNpm#_~H@MdZ>KLDi zoeOPbYIb0MXlR&C&=u2Px?*V8m8Z#eU76%zvBEGht3%j5<_LNXvVL-oC>AV4tYPk( zU2pW$Dx~@d<=XsG1oNq4)pVKM7!@_q^>H%(H)A7n7z@XA_Vp#8JIyGXLNz#z>w^xpKmQkhrnFmfedAOKZ#FA&`Tlc(!`^G8qzRq`eQg2 z!S*DQ5>es{RW+{J{A|W++SM8zV{gf``v+O84^dYJbJa(wJ5`;lZz+f>c_hlGC{p-3 zH9rs#T+^hexQ4^6LBn(_LPFhr$S{h;bvIQ=v0O@%y_3y>NS=Ghq}F%`IbZ6|mb|+} z;y_1{)O`&^7B9bLLCFquWU$>m&A3J4AQwt|C_ed3+TfIe3@0<~`-BqoRj`v8aTJYI z%`6%(MNi+~k;=4e4&{iwDcDI1DIsti4=qZOBqRimNv@vqcYJbfV3gKEPjfiY^J1bFBW`8A>UPyOroSqv#iY~D(TW%ZKbQxR_z>jQDGrBDga^KZ-fP1 z?3C-i7KTf0OQ&25`ca%~Av1?t$jv(Utjo@Tlg3lA{?ml`31lP4xf1jtwI@ZBs{l0) zh9Ub+nl8NXaw^ko09k|i{imbSz094Hpg4R5BJt5q@_;Cu`O0^4$y9!r^|>n8Zs^6J z3-v%x5A@7HuOOaOuUIToq*&s7Q;dHqEo4I+v<%OeC>{CHbk{6C-R{e}+JvTAP*Z<9 z-0}(BvO6wG@kKapWTG@Q&-h?$Z_?zsGQ<8v5ALC5(xd!CDx!#->8^C=G<3i=Gx|fW z6HRey;Z4d(P@i04Ark?&%v_^`ja4nl*a&ALd08s@LiLXkt^v+6QaVP+8O&qa_q8Vr zL}Y9?Fe+yDYwZqawd^O58v5uV|^-eJdyqWs`wcbqg9<00kxB)J27%=#5 z2L``fD%{{N{_fW{xk5&5x?s0J7lNt%C@@$BxV@VBNDT&yg%&&mCCvkagJ&Ll8j>8R z9FXK7^)^Uy{G(Y~-a1FJM zv5KLM<9|-%8_cW0>)S&>?dG1-xl|Rde5lYJp|A215{o?9ODmt0eRw( zGec__!vta_!LRHa?ZGs&)3uKAk`hO(hESnW)tbofTo!=l4#b6;7?%n2UW>%U6WgL? zWBEp-vcU^7mr~G6)IKlaUBV!CN*qP+m=C`?4N$CoQ5$(6D>uLo;I1~W;vt2a!L%e` zznp(nj$L)2GgFLyT#cgH?b8z3y_wt}WPO~EI2#^h_m1ktw#2nKA^8vp7F#X(t|!mW zt+rqL}Z0?ijw z7(b?VL55)uSs`^%H!_I5(~Nh@74$UAGWQ(=x{D`J$Yv?D$%bN^a=FW z3VfG?T-r-7+!nIPwf?%FI35@9;)5f!<0JP+=ev4rc2_@cJ1XevlXI2Ci2_FCQ(;Z1 z@Ku8NYiIi}i{;i(C+L&C<|a1B2E1gFYYpcWY3MFX1UacXV(_-SQA)i`zYg1{8}!)` zNuwGtl%>B%Mtyd~H`VSbHLvqcf}GK48+l~0ah6$5Y&Olh5OZ~+kTJ@g-jOk?z~^<~ z95w*Xp-@!*Bvb1ja&h>MYG|VLA9Wvfe-x~aW%_cfQAG~b_A_CCsO@L^lkMLxtd^!o zQ{-2i>s1E0btQ9i1~yidBjBjVchoozjLyb0>2>tV*LCi?XuX=Ps^f1*3vaXNttmRP zdVuxwd(dV1-6C#0xrd$gu#~&%XQ`BlcUhWjqJhq2Vb22@3x1`rFZo4%Xc{HIMT;)y z(9~!(V(FMC+!-9Z;zCTYHh&&|*Ub2?qhe%KpYpD^sL$tgZJ|!h>AKl6r|YUSnr6E5O5r1; z5#8Lz|9Qw`3WH+s8Q3Fkt=8&-8py~iSR!3PSE@NfT`)$e69mDiTx{K)m_TRO24lI% zAjqKW-H}*(JoNLbt7AVSs^LBD~co>-EB1g`}HW^5{Q>Bte=`9uo9# zh!ywfKz=)4kMEkY)?S{<{XmQP1(mwjo1I|0< z@d&u)a+s?U*6%2tMCQ!phNHoQushUA8{L}BwSMouAa709vKmkSbX+>{VlRMe9i*sS zWolauRRYh-;Mr%ByOJy|e&QC*>E>R%;1s|JEitZ!A59W;qK126FtemBJ{86i^yMf@ zid{x+M1N2hsmS*cD$q(Txwe>&6%Id`0`JlzytSZL3oyv*ONpipGU%{u(&ePs7BhiB z>;W46G*=Z*qmlTc18bDBvA+G8Xd^uNssP@7h37& zpJf5B3C&k{HryFO7D+ZK+wdp?Z!e9-I^o5266OuaebBi3B;&wcOPTZX7Ap2OU8)Gi za;=}9bYj7fR_ZK6MdDg-8ulYe0KTXVx6}o2OR3O>oXUYn&J1wXtH4PQUiVyY5fQu4 zLTA1t<**oMJbR(&7wwHsNHf`0E{AICB{k-G$`l*S7I1+Rtc(<3a09tr0u2cyEAj=s zT7)gTCg3^EAb?7k^LA1KkzIAYj9W=u(PiD&AbFr!Lkv2mPCI;e6J5n4&f%=!c6c`! zZ5qn`cRhd6Bc-C*`WyU9%Q!WW6kcyP&fuyc>hVW0R>b3CruC z3_(gao7FW_oy0*>o5lp3R8R3HHpGT0UM#-JQ+%QRZMAELb+KO5ls0TSBzkaHp)j7&)z_djdXx~eD>{=R?<#S)q=;Vs|cHMvhjvX}`TZDe&HOK%_ zr@vfZ$(5qgj@a(eK3ztV&{5ht=45H^Xt{l-+FgjsM;W7Zsg+mqS6!2n@@2! zybqV?Z?xEEn3vv{)LMhi5kgD=^VpS|EzYTzNv{1)qus}J{cr3DG_(8P4JHg!E@xh9 z)v=<@w>%CSU&$v5wrj}aVXL2tAh1uMA;uWEXaLQwI ze>C=ZZa9(jPRonc3=pLQ)^{v-Xwt_4xX^{FPGfD{5~k*N-YrLqE&gaG)SF0Y8CK>SWwl zRHo~9{UA~Wd?vsSJDy+;V1Y3g`9v}i1u|TN__dN|;|D4YfdeL&SP? zM47IbAI$mY&IBY@y|NN}ghvqeYKo<*$8-L5(NfnYR%{mEj26DgeyvbOCo*$dI~kpH zOA2<0TId6FRC=?COsVE8xSH3Z^-8WDTi9VMVn~cAgTC+qsA+S*>(zp0YEWUsveddT z7r~jC)RYT5P+|x;YX!2u@EO>G%c^)%=c&g+vB7!F+x)a#ya|{bz}=ZUQ;N#gX|V~A zCl%h|lF7u2o_CeqqZNA2R{T+s=y8w#=Y zd-{ttu!7a*w?|>&U%Ldz*IY=<|1JS3R?* z5d&;km1Z^eoO2NNYB;4kD4$BSc(k*K#jgA=Ig!o%aie%y^fFvh$0`F>;Hk8VB%f%wHb ziS_r*G`{I_WA8x9W`#7ONK~A1Y$nbW!1u(J0{!oMuwiojACXn5FHk=?4jh?deQ(=z z0q4@8n_AFMac=^RT0em(Uc`zyOMU%awRfiRkUN1WZPM~h5BL;?FZwYb;yK07w~KqdWQcf?{jRW>(xve;h4*ZihdvJUX5k@29OSU6yJ8 zxh~flQo)Y-({zZ>fk$D#E>mDJap1J&wfk>e@SopA2ex~H$NF6<-Ff(r7Yn(!NYDNH zB5Py;+6obRH`h?M5pR`>9m}IvfAf6s9Km>XXi8W^Zn`|z?pd$p7Sgno7($Oyw%hm0 zbkrmECF)^57kw{;P%Uc;kry9@kgNc(CQg$x4m<2#huk?T= zILg@kmVvymk{>Gho0;EK!u{qsQNq3INmUUUkp`8~->4#r@N+7wZLV(vtFFVIegfg>)srhiwe3koa&(>Cv z5*CO1;t5T%sN+a~rvIl=IC3zH`Im-c;nX~i-*M52KQ-m^r*Ui{%!38lWG7x}2j1pUsabGH6_eq5^} z$Shj(Ie#q$9neJ=?YyaqX0eUAIIp1G3UZH$iYNaq>t1y1P@d+AGE)F^ZHUW5@J4!5# zCkp_g_)HkJ9(S+A&Vq-S^!E|WtEVTgs^Z^_+JN~F*w9pTsdpB;3LF01k9_PI)Ti~9 z0bSDMuo0WK|E3K+u<9agTt|;fw<4^wqE=0lEF26-?kEGGb%RVlN%@R!@CS~_3xPoL zow+kwHXw*38~fRV>nZ^W(V%qo53W;UMOd2WMX)tJ>LB5Arl#EPuFW-1j}&d+7Qb^= zz;h>}$o-dZ*!9;u7BX654fdp>`S$Qet}oFz9-9E;3wv_6B2i}~T|<*94-_E^b9{A5 z>y=wHS|uK+8w|;Ufd8--LaaYxt~ArAba=8aSX1sAs#CgBgLMG?#l{Lb9LM$&NEBb+JM?tbX!x>pnV~z} zpz&O)T;@vkua&?V9?*~2!Aq{di!77)5>?PKD)U@sdg}@Pi#O34g%jlm3yuuA16~2S z5xd#;L+?x`-b526y{tmbSCC5^_L`;1ZM3VxKhz%XsWmtW??BG<{O8V813I%r@1;X) zb0vR53X6Cfe_CZq9JS0e!P>~f%Ue5$L#5_5jY z4j)j+t8y@Bk|GEekTkmGDoPp%jxI-64FKonXxApQ?-uM-yBlfZ^SiX2PS+Gj_&LAc z8SScZSn}=eS+y=;w9V%O847VL2cLvE94+1`6ud=zIXj zW1%eT62?m_H8lD>rW~$sNodq5RA0`3E ziQ-MJ{#?sz_1Hr=K_K>=bk^%FBHs$VTkNS~d?Nn<19>vV9~)FW7f##@JCKfG-@B}! zQMT|`>mU*P_?ovdNq2>+0ru@_%Jlp(KHhXvkt8b6-NeH666T9$9NeL|#Sb2wT>^Of zE$P4{dsP&OWQn4)J6Oc#{zrV1&`*FyRdRvX8dJGcWbxm@gBC7#_Ey$2AiAD$&5tu0 z=ycXI?2PCY@_?M-``Y~jz6)jHaBsjM(!BR`8$QY*#Ep;i6UE2XD~;!31euPC62P#G zPXrA;<{ZO!;{=9%^>Db@m*2M3$t2sr|4bGofct58&3*k&oG)8YQRuY-6-6n-VC`LP zSa#6;UV@HR58%$y_+}Puw(Q%LfCZze5R#SfBV03I50pA;a`h*CKWvaN?u7Fy&{KV= zTXYma2A&UPK_o4}QzyCRd=MU%0-dEXV?s@3Q`k@^hMR`lYf|? z{mR}_qm(!o(8ztYtU>QzqESEpzM)bR2zHXKsGh-rbpksBcp9KFG6CUTx6s5x#l3l? zJYXQlFKmUBpMQ-EO68K_cF$z)!HlZt+ySmyg|pk=++(8aB)y;$fk?ry#T~K}ut}(R zlh)|l4!wmbi!FyI<}v5^=l^WJv(TeSwJ%-3mO5)rc~3U<$9{3nw(Ope%6x4p+3#q+ zvj7YBv6lQ3YTv6J-V1L{7-RG`41nW@Hh@8d*0Xm1GCm=yugT8c>iWFCo z#dmBF=I8sH8=f6)83`v{P5;sJV}VafSUk|#0(jiTMeJUZ;pJrVd)^N*e-?A_^{A~W zjr$mV!S7g`Yrj}i$ql9dORoh=0oTw+i!ylOtf%X~rs=Y7wv+F8_U0cw;49*G!eUJ0 zK5}0VCPwC(-*HZ0_DfoAkwvr=owk9c_R)0Q8l{q-$gg+|$L4}}7Sw=PqK0-Ymelyv zaQdLgZz7mXl)W876B=*FvQ7RkShhfkIdBiKY>EynTVHhXFD%(CZUwKGp9 zoNk6QEUkW%w~hTD+S$kQ1oq1(aQlG$$^4vl_L~g?`w7~K|7M?Qi~qnMVmjk%6K^`8d(f*8U531wa2VSY_SUDY{uC;SAE3{} z!iD;la%Y}3!nt3)#B1-pX=CRJJ{`~({93`Dr2<4MYg~z|KVJwCtPy69VT^qroTH}A zb*&|aEgzoZ$G^~c&ZwR* z@C*J>HxM$Oljj=3gc80}5Dqv~XN=l&a9o?5^ZzGuc8s0<7_WMPS6Uo9pV&(49pB$p zBa>G{e&wuFx+->DdB-wm9-nd#Ac<%_991~Z3cu?U73ZS!7R>W~2haCTxu?Gng30WHLu>4Y81%=Ke|MXqc~KwtR6#eK4Zn0^akKf5dhFFez%x<~%e$kEbE% zI%UG@ayb|h)&bsKI6w|!nq(0Mo$&Qq>jyh&l>SeXr*%5>Y{YUz9LT|*yUR!L`c9nA zl?{#9)IA-O!yf7?gYJnm=)OMrMxt#A_o??VJlOYl0JFahgy<@%4D`Q^cDF7-n@U+D zV?OHC;z-^py5sOWE$KEmTqXS>`lE9&2OWs@Qu;5j=pf0(O1b_J{DZmsO029!6v#oP zPX4q>;m#&?{zLm}T&d@R^_BLwpzCH7Rx(52{kb6`3^G`HPm)l+!vi_7#dLiP2SqeP z+m($8<(U+bL|;5=VU7W{n5VAYrqHhFzJYuU)uq z(>md+ghqD~Y}W7Hj)VIJ?_&J*Zh|){anhMHJLq;1h}AGj==pS<;R=ha!Ke^_Gn-G-XU!7`eB`|hk&$)ZFZ{C3Xs zx8uq}mOwDei2mgs2P_-FXDh?5=Lvn!2fC9OnX+DDPOVg>8GA-Q^}p=uDV_In)VDKB zl*!7W+lZADa;sh80&en=B&98USJ|IeZ`WA958Hxk_)1rw-c! zkz&H(5quzAW?P*k8l_W$gZ|+ZetoWFTVV03BvGHnz;7Pi?D~i0UG7;xtbjo1kSpeH zw9XV{0DL~(JsG1lP{k})^b?(CpXLV}f8}5P{*Hz*-JVK^K6KW|%%Et=x0_$n$&hZ9!xCPBM| z>j+@EnF=`PW9^y{X^CS%6}Ij(+BhR{t)lTZbpU(yAAA#iFoFd|Fy1l>kQ%Knn-~0d z|6I1@4gH)$oQ(68I92G%B&Hct2W`X|XquF$ z0PEdY#{8(4zDKThe(Zi=p#c_^NXv)I39O>SZ&AksCaU8+6f>NMA{olP<~eX!@{l#b zfhaB5-_E-8ysL5*OrUkV({nzI&D^SLG34&eF*P0h9nT}n3i-s^T$x&L3o+AIz~5n+WU2mcr7`ThBPSnaN{Ap1Ks-)klcs$3QX!zkrf)H$Tfn6f(S1q-eR=@HJOse{pvll zMrkbp+qF_S*XKrizfdKNnb;4~lC@IG;gOSH@(JWBLyZd@^+9kvGa7vID;p@?K|aao zQ7Aq2kl<`u=rpt9mNb4#s8pBh76&eOfj=h0@#(pM$MQQP8gzE$uHI-G7-WPMGbQd7 zV2kq8ro!J05IrzFvyrm;k7*50nvSc!LQs^~F-ip&tjEF<_EuKQhWpYCHihqW^j>CV z+c~fuwfwCM5KiVy=RWd09OPPR>SWfSc@Z2iUuxGJv)VpI??){ep9Q5_hpO^+l-@23Z(~JRJM};X36%t(r$AS!+w*TmW2g5m;6A^C{BWNpB^tJ!vuFYe2Jn~dEiM=5mZ#C&U$8l9QX?Ae3s z;m`T_xAJgY?x8=~l(TAVaWR~iFDHw}r$K+@QqTsFg%*MHTAb-Dgf{3EEf$I^GqNJkgZ0A(8 z)j0qRiARp5^P<2g{Tp~o0R(fwPTI&F%9p)^{Uy%oK8eo8GC}80d}$^7+~2Ekd!1HR zUWT>j`g^UzdeLz;<&biIkU__-aHi0~skrPmOEln~8QkZnj{;LuCo=55q&}*@hh9c? zI%)0fUvJfwTW{)U>JZ>ltgnJDO?-q^huQ(%HJ--HMmaMmbwEy@t-xisCUa`4aT?c1 z9qh8^758gjIo7Id2RF~H@bAB}R__|iZ_q2TzX41gD`J+mjB%4pHN}=N%@kXvn`YTm(<~Q?DYk}oLkxJ7 zgd`*ZBuFC(Sh{I&6F?%Bkbne9=%9f>=&0G2EK8cVM>hB7yWju&zxCF;Z!KnodM$1-<6sx4G!{luSvjyy649sMslgY$7_s%c`hbo?qZLSi9cChg&Z}bK>jiY{>(-t}WPZ^O8u3NeVoV%kCFa_E zOH8j#1b@&ma_9@xg#^b8@cw!wqUnR;0T=J#cx#VCtqm${#4O`f`vAHTxoF#$kGS(q zTWB=;ojcYBuNHaz(19o7IJ6@0jo+tx>dsKwo}XdAd>Qc)tq-ihP0jAZp1eFwN-NP$?4QR?*LydBIT!(DV85+ z+7}!DWb-KhoEZ<>KU8C}3cQcXlx=ZLrz-4x>F7YgcJGgpyY80#I`xQ#ImqsfB*b+? zK;@J5MF2JPP0-e7;fMw8nu2!YMV~m?>(!$?aUp$>4KaD<%xK$xJ=`&ldMJ+o)qQQ) zLnM&1y>$;Ln4Rgu<<~br*gYcS_!i_Hor-ot`|K#svd^OVa&}{_S7!2O>Fx-W#J(;v zWE*Y>Y2xkd2KXLtX(qbu2PoB z(BhNW-&X#yFOB?t?l0b*FR*ueP+5 zF(=7W5Jfvd%08f+Q>2;NNe7T*8vUfwYID_k1RA65;v^kf3g*gkWRm=kJDks)1mepPE@|Q{jOzj&4)zi2HB1&Azwr3yIY(%OGqi&!tCGp)1yGxw`AK{%v;G5})Nng%c`B4v}6e4?JQ zPr`=R(BYr+h3dVx)pF(!uJCm573I#uecvDfkC5b_9?vXVU#9|#yi3JNR$u-bDpZrf z>>*ABLN=R(GX4?v41i%QqN-%x)uHBvRLe9rly*C=B3B9Khx<4CSp3;9e04Tw#NcV6 z+VBCRLI^Z9U-eb^+ zupwmFsj)KD{S5suP-`)4v@o@n`&DAV>Fw}al*6+{@a%ImCVZ)(r+u1XfxYCGveKxu zPd`(l12?pU{{QkF!jp0bSY91%nspVuFwgX|@6|xbBXAy~XE~-nFSfV`GcOaFW0}Da zXgz}K1GI&L`Z@dMW;`jM5Pvm>+VTnV_(B17k9~_ht!Ue>CRIxugWsJLMb^ zkYUf^Gmt@}3zS$28)Gu=YA>{0OobI;jnq)JA(F}Kw8eA0$k7bsaadn6qV;yqN~6dy zTIa+wx_52mxotehJx8pD=%Zl9eBXYq}%I8{eSPTpo`bUEgS%!kB!raa&$Oe%y%raMaq(!J6I_ViwCxWBj@+T8{ zVTfGbp$Fb1LqmaYZ{_mh`HmaN9{xy=(DA?*T20&1kON?R0_A?Jig*PxyR}&6O2{`L z+#qGTp_4n~GEG1SPF4*?L&M92SgZNx=0R*MS#zB0o_ zYnkDUErE(f&e%pG##i;ubof%8=e1)An%3Tg&MW_WD#emynt&~~@8twtz%Rj-PBlNHA4K6a4v}}r z0BL7mz_o#&bAepNF4Ju}X5in57GZtcyE*=FHdYzcjy!`CU&VBVAsor+^JfAWM~?ruJHdDuYTuytZ)lvoaSB(BX;E83G^ z&_trU*|kE`RvL{fXX?>RrNtZ1IQKrZEk~*)<`C!Xx$R=L)y$sA;myrcX% zXe`(y`h+v;bM4?&%$v{7-rI^?uQCW6HDZ%<4zP@^!~X)XRu2c?*;xjCt~wVjhO7*{ z7WLQ-v@V1HPK=D)n4ukKXf}%#lv`bN08c*(=UI+E(AJ;eU1Zo?G&B1v6|zjvZ>b*x zoAA+wWcwPEeI@ynEwg;L0_c(=?>IZWwI{6yEMA5s_9{lqSCApNI0=)Waf4fH7%3UX z&+Q!hoe8KQOhnwkjqeBjeN|)kD4Gcg?}WJuz0HrO3lZ;Q&$}#^NQXdDUMHw@d)Zd?Ho6p& zIY1?=W3-!)2UW}hY;#E&+|$_=%mRFM1z&{sit06qlj}em1N2V}b?-vJR~rRf2Vx4l zp~&PJKoa%!l_qD?o3At`!V&>WimcgFS3f1m0$APS;?zZ^X25Ma+84-E#I=iCm!K{? z&?2Cf?YTMk`NLJPh0WWn`MHO`?RLmMl zL35WP|2m=2Db5AjbGC8>>XUM`7kB5?Pi977$F%tKB#UDXQ;25hhqMjrZgD&Ji;I7@ z4Fep6wNj=4;IuGZuOUc>@4=n*m=p!Wrlqw?%B*o*xsg`nZn=siwA5U3$HUTRY35ue z3ydU@8D$6DiWmOnR5Tjf<&C2Gl&?*@9Ce>SW_%&~y?v18GSWPRx{SE7eDboeG1Q=J zpX-l?gQ>W;s5hIX`5xI07|oolf&Kh9;512stB2CHZ;K7z9_ZzW!yb#=`8v;=Dtv{u z4gOPX#jh$%`mNITu0m}yP2>#5jJt=u;CYa{VYA3E-(uKk>_&>O1*&uod>Y}!1A{dV z6i%bp5ch$1u0!ZT>eJyo1oEH;=U{dY+LH`RA#;>?3ZRu!RlbA2PBgHSh$rlPe!1V) z%QKMq+@&N&dX*&L>V}O3GEeSYgBhSVH&-IzOcXYc$Ud$@?tba~TE#dY5~Zjo$GT^b zrFxW>5bj7b=P<5)ct0w~d_aZ9yr0P~HC3y~u;Km*$h!_MwnUl}(vw6R*9a}n^@exZ z*_zL7KMtk7xAMh(k;_gc9_?G%PA`zZnu})p%<3n4Jm05oS!rk{t1O0fau{=N{Q^2t z8&JS+Rym&{{q#7*EyGbT8v;f^AD*t}--P5<;MX2zBYA;(NPiVe^qnydgZ{ue3}vMo zP&}f446=sqDmS76j|ABci2Dj`BGRnlrw7Wx>{U5V;|pa*P~KRn9+kD~G0ET?4NCqy z&uD&{KZeARiJUJi$N@Rf#R69fHI>Uc%Ex9pI*gLH35WID9iZhH6&6K?q!` z#|^SO+Ln=yH{8p!rmF{H74?h|mtgTPFtN`4h?3!Dmv}3TA^x=9X1*3s*2FTCPJyN( zzGVi#b-HPbjhBUiAEE?(sA?90Qzq8_)sjG(?h1hJV2~3m*uTAMlpj9T8E>D<;Z2={ zl!_mPn=-L2p-&d-yr-kF=nMPUfx<|QTTqlizpWP=^QZf0OG^UPY>hXT9bq4YZNG6o zTBsOnx_gI{O9v|j0+Q_Vovm6^YGY>#-(|Y4;lBbQRie*)%a!&#^F#?=B6;^6M*&)J z0o@%^4!&^1ZG~jlsYA#yoL&X$u*3@la5l{*;|kanlyBu?AC2xBss`|4Q^S2CQ*xee zAwgls1tv0Z*3mwzN{ z{Y*mKTGlKhjxLwnQxQ*>r2~E?AR}Y}9Edf*F4w#guz^N^(<%h`;>0(~Ot1U3`UL6Ges)3*d2NeCIq)QNujOhqnXb zNIqNMrpFj1T5FZtsA?X&$P?NgvPanx_I|cq;easW<_O9GLws z6O@)noeUWXr$|bK$dIeJcD;V1n{c-i+O_RO9B~@jk>44|nUR1Kuu`0apu6VltC%eO zP)G|h8f~0HZPG+AUV%lCLx(_wt_}9TmJbq&F1prMnsk{Y8S|{V5^@^lzt|^%??q<4 z)B-xKTr`~>&nQrdQ;!}~peZG6MlT2<`Np|A6^%==v=qRnj z0y2~vr%v801zJr+1>vgz49;q_w9VMsqj;W>(DSrJ%3$?ov12YW@Lp}Z=MD>A#AN7*+G z|43#x12_xXM_tN{Cvh40sdDoG#{3{m0CdW%EQq|>hd9&0&qF6c2e7}Yu@`0A$S#B9&df<+z~K%HdT-)4hD%zTK}puET4dK?(U%s`*dVblOY-HXk>(%#QrrL-+T z*I1o5*Qc;6gmm3@p8u4DaP;-ikmZGNTvhpxKC$r~KcknN&zA_tS*9n!IC1t7?j6P4 zJ5v8PyGqD`U62BJ$MrxGvlzWS7xvW`;2p!Sc#|uYY=3!wZT&-by{;+p0VINYwxi`) z6yf^VePz8akSYb_&ccDFY011<;=8J(2HH8Dk>UAD2WC(FQ@{AC_8GE4Wh5M%vUesU z4hU60$ySwG4sqZ-GY~B3k6APn3x$z{a5phm-O~{eJK=mDFTSfxs#6l4y#ebp8Btha zdlUZ$-F=JmbQV*At~48otGD?F0Qanx4So7d#osw!{B<(YAL+>ZV*nY;K%1v0M(|<> zV|@cEz(&ZXXzBUzcr2GflK=9YoqH}eqM|?bTB&(!dsm(FAy4RM!9x-$?JduIJq#5+ENRhcU&y%LL!ICiW=FqQ37d{5hWuD0EvJ;Gr1ENx?nC z{oMf9os#C(`MG$Loy`S4l-v}QP zov?-7)n>eMfW-25zRvykU9G_PsgfBA{SCGS_?hdw1pI_>dj#IB{4&d0&I_f3-`ZY7$!!a;9FY`{a_6 z%sIewO1 z+b5Nstq1>xPCv&e3~huM&BekPb@B(tE7-AC9V0(1;A8uW7?0^K>@m*c=IQ6gR(__y4xD>D6| zAi=gFCD8#jajst74yM}IC|IcJ%B4UmXiQNqJ_JaOtfC-32kH>RICFJ;%Gpw}3ee?w zMi{cj=25M2$al@p`|CV}#_h={5nK6@L~>)~V1Ou&-Z8wYX}8%t;J(zpDZH z*wzc1*B*!KUAHrBx%`R+w%!0ovSd77+W9Vyr~b>kOrBH{UunBf;x8+kQz4>LkYpPP zq0V%`JeK(oOF{l*bD!$T@D*Uy;1&7j4LXDlR|iHAnMsCbZM7VHC`y?vB(9ZMW}Pf&I4Q-G@=M|rl*{(cM<)X@O6J>^CuD$3UAHWe36Nyy43J64!XW*Fd=2mW zI7*DhZY0V5Y@T82zHwArg!K4B_Bp`q{E~zioks|J#8&@!p6+}U))wyB?10=30?)T? z68;f0vcvM}dZrFV6!H$glJ#K%BnartG?2W>XK6TDu}yk`__%8ys>_eluLc!Fq|)_d zIec`T`l$Jxo(*{V2Zd~{MtYouh|E1CesFy$ClfpB3xgnTl3%e&Y}(NJ;bA`@PVZ?Q z)1>%r&ktC|6jQ?w;3Z&aXil*B2UB&9lFuDi(MpAVxW0~k=0M+K`)XWDa6ecUX&+&_ zJ35H>pCmwX*NaWdTGv;1)V99bSH4+nD*pjUz8MmYk@#wGQ(ei{177o|Dv~E*=2L&f z@4N?Xg7K+@ODI5y5^!{NLS!yv>ok=rcCGH1#mvuFl)?t=2I?^487k0Z4Px4` z7FgSdZ-b?^-sDiCnaP&+5tIjMiNkJ0Fpke2v&i~~ zB#X6->l}v}Fs@wS^tjdudAEY2@a}U+AF>yNVBzwPU}1jYaONJqd#UV^e{V+@W>0&X z0vf(?(5~ei4WV875CMWuS+a)mn0+*U!pIXpH3D`jaaJp4r%_IcXR`_`|B?1RdOGIe zexu(rpWbct{lwOI_M1IV8?c?{Xcs)^kQt1`5hHTP)(72hi>E$izh*B?(^c;r2E&7- zQ+LWZ+g0@alhiDBW~dfqfK>%AE%j zsBS{aYIdF_W?%kh(C0~+Q5`)~!S+jozx zn`8*%s31-20|Lnwa|AtNH9}$!W*kWOV?iIEK(A#{*Jo{+FpOCih2O_%7MzpGPt;^Iyejm7A z4j4O$2^yFerO+-h$dM2NX<8>Vec)eKX1nNiU9>GLdwKwjC~p9OY9AuH58^6*&x1+b zjuD7!?n_=woIzv&4oD;9ZQpTm!e}#BhJ9&^?^LajIWA}}pU3eG>|;5e!3LZ?pUu~{ zp3b7$%`gAtc!*NQJnB;;VkASnc_OllV>S%wE*OWe^Ccv&orGjPZJ5WGXF6m?Pq6#< z#n>`2C_YuQ^~UZ&c6u%axfP)9-IxFYFHKV-H-elTXlQ+K_n!m{{s4d3y%Z!vP(TC) z1w5(leQR8B1eSgi1=-3 z(q|;ytR}-#;jCpDUB&IirgqMmH0Zx#*`mS>RgAuXjU%FOm$IusC+5);B?C;rF6d28 zVGeoxczZzHtyU8QFgXp-qppoYf28^c?|H~;ye``V>;&i84*ryI@?juQN)<#a&?b?* zin@Pee~ub|l4#^g2)W(o!q6G;frfd;`c` z{J*=MyM>!1dI5ZUXM&LgkUtWOvDHWcK^Azp>JtDdnERKy@X0qOk>TL~PPvRHAhrw+ zvxpc3mycZt$;{U2z%LKg3Ce_hg^|pM+#}Xjh~1NKtu>!urWNpJ&!vsK4_@IM$cfRuG&P7ceC z!bt(>>Dp>6@;dNMd9TR1FKM(tjyhzs08HdNY?1RFJB_EXAzqqfY_(W( zK?5^ZDR!*ImqJa~83*oS z$F!W_{m%N=iILDHf5A=@1CbI&b|Ye6hI8yMECjLiDWSGIv^A%5*<9Trv!(Us@&tRb zRgi4mw1)D5v+?aJs^$kJ5(E8R_>=SR3bZ#n?*yb82H>mH6RN07w*CFUzzVE}*J&(FN>f4M!GgvI4XlaxX5_dd)L^Haz3NwB77HZBUe}*O93*9L?zJgSzNpT z@KeT*QLzwfBGn}!_W?AW<;{V_!f&(aMlD|S$$CoKNP)?2-wO7(K9=`KQ*V3rv1vLL z{%~D*OB{IY4f@^&phKKX7)<6t@z5^t_sHVx$^E;d2>djf`P2p0WQcpzBMn+q+@5Zq zsB;iX9PHVX3?5!@S)7D<1dyruURCopO`tLUQK)7jM)M$UCxMg6u@GfWl7&@L-8P?+ z%sJko#4?Vzo+?HgbG4`QTLx*`n`Pgd{Ybp-J8?70HV=L&$-WpG`>F zk9r`lIMB>Z>;!7G$JUb=3GQtLSDh+C6J0ZPIV zGUVOoX=M0J8Ws0Ivf1p{tRcz9E>8z)ZZH$mAm?$b9XC0M@`(M&C4dpRS)_!A=I0%y zkt=9!0lQgf`0;!%Irt}y=KQvT`*Wy!5sHv#vENKku8P;yq3#qN;KuTu&l7c?JyEEG z?+~H;_-3Gow6QN$=~jZnB*w?-&~v2+R? z*{>Ix!%Qu|6vyj6y^zlb9F~rKjsfbUpgs_JxMZ4ytS_|HR<* z8J++K!~xG+E3m6^l@J@~PS$*@wkQq9?BI+^lw&!tf^#lZh@x{{dl%M75-(gU)wBpo z%c&McB~6sGgkvt{Rv;}hd^ZbO*aw?DxtPfDjm>%HE3&9g0tX>sot(KqV&G1RX3&5a zq3Gn>*M%H2e*>%lV@~edw>U7^_TP+ixS0t1S{da)Fkga~s{6 z4&e%NTL$(s+sMyd2z^`nKk=8vU9GE>2}cv!W;H(Cd}IKAVWSX^bi57LKq1=Kd)ui* zFG|P^HL#ezAHOh@W3dI-|G!zxwifIOqsw9aP63oL(5CpU$&`2XWn*Y-uFiiP@^G5{ zfW2`+g{`o9MpEs)1JTi*IPoZ3I^bI;aAPo?S`^RCBRTL>5sZ5XRKt&b?DljE9HsT_ zCm}~-KS&PMMB; z8{~Tv)Q3R5Kt6EP{~M9MW0Z{fzWLdHbSL|cZ?dVi4_ctWZqH+Og9{9CI>qA5vp9w_ z2eEWt7Uga_$Epb}ya_kH^E#qOTbkIkH;YZu?t|m|AQ43$=o;l2!q~{LL=L|Y=$;j%8`Q(m4eBDX z+$nT;%W3vdEufHc%dldjbRwV?|Wh*iK?1aplNSh?60@9 zXX{*Jdt;4x_95(a)AZx6hcQ(@W$Jg2SE5SSsVLa@qjL^^KMMOh`H&sw2U^d6QoXq+c@8T2eSbz1 z(MU5|W>7NukYcu_Zsc|ws)Qvp_3ZxcTnt!;?Q-ZbQk=7r#EhWLNzm9d(!ZU{)Czha z1@!4#a-QJp<=u6f{g9ru^$Q0%fR?T#!@D7qJ8df;my)q~?s`Uw9#rhWC@W%aJz`*y z;*b4f<&E{`6OSbb> zEg&B!JvrSSY}cK8n^M@@WY$(P?ip|#(zlw)@L6yB`SMz+Zhxg7i<_bQs8xa;P~czh zr18zxc!O(A1?4;V46b)I^%_sx+eoKl4vG?{Xnc;mnCZy`c&5QhvQybANB#3Tc|lA&dX)~fXKXfi1&c6 z4t1vCU3ENl#7RrI#NsEqENQ+yETQ|EFJZ$D@Dd8A9!n4r2_p9k-{PdPNSJIZ=v3J_ zvZ+r4zC(;FF?j~a)z6SsRVG-KR)RPF3TZy^UR&>IKZj# z%(G%6%*_=BhjBV&qg}f*wFvGPIc9-b)^~)jjR(=Bzy$c z?RAT1cB_;b#Y^E%Q>?%)>6IVhp}_%+H=^|Ux>BlzKlCp+9^5-e5)iYRF$v;?fqfQO z;e2Q#@uTM27+;3%M|bmi>iDMzxfqj4CcvAA@u52D0QeK|Y&Jldm`QxTtv2mzzjl+% zyhrok&c!pQCuYhrl|pu)#Z@AtH!uCsMyTB?e)N*{;~mmL@p%;5?Zv*9YeP>0(?7U> zds3z{u)xx?Nq(_)l>_pkPt1^Iyr@J!Ao5iQVRq|@*lVs^0ywL1b-*5~4hkR0A@TFp zH(zT6Z`~M4uHwRZ1$xTJhr2_@hpfa72|ss;Jq~KO*Rm?+_4jE6ncF!BOFQ{(R#X_# zt2^KA!ZJd@voEHt#Nr!gxDUWlu!%a#f>&`Sc)}i2!!)>l6|_|=u$#sNLz{Jx5TNw# zIrz8Yh}d>Gl9dRL+e*23C1~5Q9-Pr21-lw;vJc=pLcBJf^YmCDE&Pq9T-W#z`6iJ>~NvNK9-##lrf(w2c3FJP^Vr}$Z6Jd6xhvWg_IRE>Z`PgRGT#rp>mFd90E#S0zPF~ zIdN)-X{?h5IZz4o zmcsQ9IO!{2+NQ=;hn$CLKlMCMPrg)B60~)cs)mLM7-G zIDOM;?l`fF%p-Z{1c8OrA-bi2m>8g2`TN+fv*}5RQhytfsN?jUum232m@K9hkE|GF zab{WmseXb)a@bKp@Gra#U-^`LYim;$)tsLwe`q5TTUAt>epmDD8Q@|sfY^-QUID!9 z0tc1}xjTdUv?9;5Y(JI|0IeB@m4__$bYvneBk)Xn?FbM7^9Y2 zo>Yr1Pp46Pku$OQ&ZXKmcJ8$f4Q#*f8yAvj$#&O^xPC6i8^Ackn(2{pb<%rBTl2wI z*{WCdp^xgtJ|nSHiM(NvDlKh`A(rx(jGyjHvpg9?{jF86-5;3uk-l{TJP$?t-9HwD zEnN)b`q#Ph-*md^CRZ$HCny3t0rHm1|_D~Z2*acQbHAn@l=RROvs0P4kT2gy4s z0CbRU^AXTLgS@uDm}=mPfpJCmfQPceSr<)vo$~r_Qy19_H=GYKgMJM4xec^0A#F27Fky<} z=176FgqvX9Qw^-Xle88u`?mY)j>rSF8-!Qt_ry)B`qE zdR|7Tn{U?`TFq+>znjNWi%R`d_$zG2HHK0nn7u$Q$JNMTn*2Z1=d=0$d3`>Y&m#$? zVBHYInt{ND@eqaUdAxljz*7FIAEe7;lVDfDcM$(4H>@ySx!Z63rN`_Un*(c0EzY%- z4B-D|A_@Jcbn1mT+ezVupixQH@_dec9Xpx%0Uy<##q1?AWPp4ESAhsCoWuMC)+b1i zko+$J4wkBXfHW#EM>=c~c4#-ZHk{~OHapFEd%%(vG;KFP2wPLF+|;nW!^ZVrYXX~K z18gZ%z_{BGG=ix!ZwCb{OoZKEkm$iH8fx5K`Yf!gum*8!s{!10D*Y_WX=!=&(2{uo znw)e`)p4%ikiAtwls74;MWo`5w9Z23(3q3 zcsw}>*4_cp*@@HHtK01qW*wl~8>2~Fdr7k7FSa|;G!e(x3NU*C#W({#^kK>(&UDrK z($)?`-fO4yuldSH!Aat1@d&s#6$ft?$3SK?KhWReSOOWLzmf12%|EE zEZ)Dw^^f0l3=GgG7e!vIf1K|`(71cKf5NF3hU!swntPng&;Hj7pzWuZF)E0v;-642 z4lK0iu^V*a>+^UuD>>e}2WK?k1y0TYi=lmIjOQ2otUfT5zr&_MFg9vp=W1GFO?5h- zpc|=lpwW+-uq|yeTqL>#xrh=jk6fzo3RiaA$^KCF!=!MBGYSA#Bb2 zZGE4`sK649E6l!LS0rl&8|E??w70<^@pX!X?CRj3AqDL`mv4;eTP<479{VVkox=PE zPNtLg6=w;f%KlA;flmfW6eCxf@(h>4huPwwNSEg?eLxGnUcM`V`sxoW8ukMuTGnF~ zBTX$zyaG_t2AYO^iIo%pr+n-9u7g#UE#%fwW+P{MM<7S^KXu$M^jLWI@I!2r!9|at zQE$F6x|yIU56{l`@V`d3D(xZlyyYUD(Q(MZ%UsPS*$4gRU2JjHN~KC}j{`DS*SQA3 z7K)!fXrW~bD5^3=bAg!Pr`+9<9a&=UMoEwb_7tHE z*@G*KR6GxU>xwqi4Vq&}^hI5Z_AANUNJPTv{@`r%Q&8y_;A)xqYcQO1{@0LM0HQmm zaWPH?dt;gD=e`6nnbS*yUX8P-@cPH2ZifPM@J=a-f8E-`A?bLw5osR>QP2>q9(w`( zN{MWgn7>dD{aSg0%upU8A*UQ}hxoUk-9rvE;^>{p=^ZEeAZ)(1;!hRNk&U<@9a?YO zV#oXG&8tlg8Fn_rU9tDF1j)7)U@=bIoaVt*^Zl}(^=vmrnYq)0RmA&(EJ`Zesz;i(V{-9V6UuNiUpY>ai z`e}V=FA;;JstjY9pGiP#x)E8AeuU`*uYrqwJEVp15#>w@hppGaXC|&4FfYS;B6!JE z(-1K@7H@9^93yvw!zj#b2($|*-{C~V0ZlTvA~aTTVMgH3;yH}@QmJx>p1J8ueVKNE zg<}sCoqM0g0RV73(>!~`rJD=;39Wyq4S=7BRy2KGb zM~m>C635GcafCZAon65bvQrHs9aAlZRaQlnQ2{RMg*yI0D2}|)eOsU&Zp?vnVSR~r zFzs4D;riA`44~(MUsUu%wr(mM8OItvw+*4bH{+TS7Ix&7Aa&;)R~n`=!=bJh{o`zz zB&K%N52XdonMg_i6SFyB7yzC8brDi+=7}AH9DNXH=Wka2Gx6W!ttoy5^nX03>joa$8yq7E?+_U$5~|~D zTu9`F$<$S0ghK)D6H+ld#^Ox0IPxu?EXtpf)n>+Jtug|XW2qeM2{N{mr#YH(7ns9H zY(%@YKh?VWeWL)7I=Y$H=+WWqt2Ae*SZ->LL!)<_tbbb*Ko7Yt3^GmahYs%K=Wn1b z5rg5QuKU-9hG+K)9oV7=YMjbAKO13cxWw!KTS#?$tYpRoiS0l*77qW%o zcnX}ZzzSnKHA~J;)XC!8aV^**FfCdfQHj#s&&1sM7rU7j6!8mrBb2kK#X)=tj+Puh zU{K9cLyzF9@FM2_?55}FD zpkA)O$2L}G4(52 z&}kdwXw3D6vkeje(T88ntu{JGLk7c^<(i2|%g8eOOxrl=75atdOIcC-^B;wE0kaJr@7_;IqAGdhB7GV{{{-N{>E z+V>|;wJ)%xp|>R6_E^zdA`C>6A97TNUuGZP3gp_S-5-qdkg=Ry4$AKg@@C34_FyFC zFekaam~$l69A3(kp;wj2JzC$cMqZiY^{M$OEPAjTbxDi-?tRYYo2HG!7Rx($fSXes z-MD_f*lrYe^s~WpcBj%FNfjamQuGNf2B&H@u5Z2yVCW~7_+o?wIuEMG`zY<>!4={n z2>D9umovagWHNZ@ZS)_A1dKXZWA1hAmAJJ5nv3`3lp{>Ys(~ZW z!Ub%BrdibtDH&8kD|VJf92u0i3l;E|92#IB*bIc5MS<@x)F+3!xbe>Hi2w-5J~QHv zrUD|Tm6yK~Ile}&d-Z%Y1irn+_MiepkuAK3EDE+7zdp`sS!HsFuzdpWs8`-qAd?~a zuc0_tqyteSop^Prvw5pl@xIfDrYM7jate)mCSqh$N&FYK zDkC-60BeXk9Haxs ze+*nR!y_Yp{H8+w$oiU+2*8?0Lg0Z41}kwfk2Lj1H6psk1t6g35m*x9j{o;lEGj)&~rIKjBS9NsfxLY@c!Mw}{a_SC?-B1W48@Y1{ci{qIGt~nK|UIp@QaEz(WG42tL5-|y*E!*eQeHh!u;z8f3nQS7)KSTJ9y8tiDwbkL- zZw>hZmU}qTQDPtVHeJ2Xr-F1a=2N}k#5kkV2B(AiOwey>XjpK_FFUSWI#{bTrhQ+y z)K#Ps(p@3wK zJ>Mv_*D7tBxOAI$10$Ix^g;$>#Ga=DqF(UpKf;B2tf{}o8?1`;fnr4O)RI_663<@3 z(UqH*o$V8ZqOxU63ZcHPJ)0oHtmYqqPa20%zuMmM@4L>Dm#m4*V{}0KS{c@qt8+An zu!DtwLH^Cj>^)$68@etT_U^%-v0X}yNirUSa5@<5| zOBQA;Rn~6HCec1WKwy=nOaS%ExcLoq{orpP8+bVz_^DT{gEeJ7{XpsqYjy?pRGTPm zBp>PVE=@}lHSgQn*1;bS*64&+Xwca}?)Xj~9Rob7{P6v%`;Pm1{%Q#tyM$jZ+v^X^ zralLcEDWMw0yC-m=KRvYK#~*3}kfdf2A5HX@;FJ9N!MeSH)5Ie^@%Yi#$|c)n^KIa(n31dvn6oSH>exq zK`Y{v2VRblrzsm=Qu*)++nFzu_DD}))XRiu3u}J2*zTS0&HRY8PeIj( zpYl7}{W`~|OQ^#^zhW_0H^}MqAbTQ&&i9!XSOj{J?LE5uswkzqI5vFLm_*%P=gsBi2dqDhw8sl!rQ|SR zL2kpkZsOKTc+b}4M6%0*q6|Z8OSYwL9@7g37)v`h54E~BAj8EMi3=Hq%WOY`$2OL_ z6t)!`c}v$^ZfI!eL0$WsUyu@L@mreH$qpJLkypZqMN!TWH6!CnW1>l2Yn`?gj+&8X?DPkbffRAJHwFAC)`RvaHN1;i#z1Z6 zs4n-|#ne=5R=+x3gtdDJWHDqfdXbG*UXIL-8@9zD28Xn7?S^r>WS zHL?n{V%+*;hyGH)!ywbUl%2~p-d>TV`$OBWd+K(;#cl)9)tX{y1Hk}ptCx(k2WNw_ zEYI}%Q`ggD$@V;hxp<+ac__65cyOZlvW(36vbkvyHT4?1Nk+cqH)oUB`Fs*9g|Q0m zLEv579wagx<;}mIX+1X1)Slgalm}qNY5|fbmL{8WDesEGV^+0KFunKGd3_R+V7Rks zx}`ah`XFE&*7bK0k@2OgX_{u6@8A;MV{10q^-OUY86^tdJiG@0 zX&wMjG4Zi&SiE6sdjVL(g_gEq7B_Uum1a+6*V+4NV-PR*HOJBly=)#1noKg?KbC4S zP8c-l0|*>>)qR_@Uay-q4fIiWd7Pgi1M{AOek5WLU;5_9%kuys;pLZ3X|Yo=M2bS_ z@lB`xoDbH++o{aY{0t?U@@)CcE8cn3>o?EOg(e~^xVR1AeU4wq@M{yP%z5rwjUb74#6GWN3VqN&eV%7L`ueZJjfy zbss`kj?uL6VI&8(r7#lA==zvvA4t79)GY{;kRkguBC=dH6&1c!`=);`^O%!I!0@Vn z#vw!dbKX4MxQ4mp0#Ik(wxcF*6c+7XVf-7~-jC9vzLle>OIF?dTHn$pZ-3K3$X|#5 zxxR;?T99h2E6o8a>(cVQv!9>CpP&`}0SkB=xl=zr@!K!7e63pxVr$*99z0}j=li<# zfcN3?B$ji{bq%XNite*5AN0Dhb!7rG9v`U%n`!h`ZE2i$wtcuZ?a%cys5gfGxdLS8 zNAsW0C3*QYvaLV$X6;KpGZ}W(`3ztRU<{SqJOEkFt@GSG0C9r$e&gj~n7Z{LzlGjD z<^wGgSY*o6lcDalCXEDK_p3}gIOexin<|yynzB)7@z?02Y!q2o!46^8yn2lLb*)JX zA7#$2IVN6^_jR57@A=^Zbimr3L-}!OqBvUy{tG?O-ZR(YSYc@fgsF{;3VU8h8F%tL zO8y@b;FTgOA$Ts6L;LK|-Wr?-X;k_-a?i*+pQ*qEve76+ zb(v^u-1SgS{mJ13{QEP!5o04$>F>_7W4k^m9EHF-a~9?;R|oV@3}vKX(+nkek_lr* zAsc1JuDbeuUtqfWBIYrPjk;1Vg%rFb4oGHF)0yCWEQPW~Q1+|z-ngZFSQbDEr|d<@)R z@V=L8-y|}JpT%(BxE_5L*}Sz@KdK9BOn zE0Mq)%A24>o-6hQ!d}6`4u5wtT4z#}b*=$iKe+b58qioLwnz3ixbvq0c-BzreZLW3 z>7NG^vE7!!7xjBSA5fn*D1o4s^HoKfcWv4l>UDn;Xq8ssyYxMXw6+SULTdQ)SaqrC zgAvfq;!fGmy`xk1L!4eX5^CdF7zg`-5;Z~sD-EoWaxo@q5P1tw}zprmb1L;!`}Tt zFC|W^84r0OQnHMfTm7dC>a zW1783GPHLhM^_kMjvu-9?hfzGi-hfqjeL9M2Z}7F0pBN(zi!17X+nI{D#Bv_7jJI@ z*3`B251%PHVf3J)pg;nMpiDs=5JUn_C<-`LRFt7wsS}d}qQG&gIFVFqwN@pqZJi~y zw&DbFY8^?iS_hN_tt~2;5QZ=%=UY2qulK(9dH?_C`JV5)x5tE>bJkva?Y-CDd+oJ; zD~~E%LrLBpX}pC!2qiB~@`QZZq@O24xb>U~ev@d9WxM4&!qzr!%jP&j3ahvR8n0fP zq0|P@D3=hVk$YY8yDprcYu0!xTcrSGFpw8!3MarjA1^GyW%**o@46Mq%3orD#|e_I zJw4McQ#X5lk6F{eQ5)^)r{_th2hvM5D;V~B4NQLNhGTf!a>_J?f@5Q~;Zyb-jq~S8 zw9VT9z;K4K2kVw^fiblCT%E)%(N+O3ce%US?8a6Vz`6Zws2HPt1h9g}lAiLWCA~= zHlse9_lhtY3dK)@%^@3cnXR^BD)Wt;^QS`ElkRf>`dv&g=cQN)e_H`SM{X9u!AorS zzHJOJ1wmD0VrL%cpMpiH@1@1NH<~5^*^_qqRRb*u?k3WHSgRBdY%QQZdpaxThqMDr)j()y)P)PBFP)o;Ur#l4g)7C{OI=WWd7yUqS(zvw^gU1DRZ_8!fvUKelqSgN1;vSL^OSY5VrYX<(c$&dsw zkPs&huVP`{wmnI=JPz1X_A4AwGZjhdG}qF3X7E-i;LR|Hz5*27?Rwq0 zLT7)y-+y$fcJ2)IhNtVcf}aKqR++9y0X^4*y}eQ8Ie z_GL=}4F_w(Ml69f3X+E!>X8h(6m7pkRuwMF*1{6hnJm>zaF7T6p&_P}K$5U@taS*R zvYOYl4Qut(&y;r15*3_1yII@tWJ6WyH$nq8o80~<+sGx}Gz6#j(-(JdB7UZr_HFR?RR`Aq@uWJzX*BzXd?mC>4Cf#y0W z2d#VN`#edA1PAaJkf`0p+!Dk-jHod{FIU|`2?=))=6nxDirGVXwVYV00W$~TK%u>v zrH$7KZLRayW~k+W#PY9eQo9%Q>XJOFeaoh&-1h|%`Rn=JEpPWFELCN3BiXKYm4H%m z4TZK$>b{C+&4={wfso+cu(q(4^GKovxBR*~eZ1Z>RN?Fv`Z)9n8BC1%s{ovI6u3Z` zi!;TrlV2s4f5S~47D$a=2i{_T8OsSU1x<56dEUWqi33!V)_ycOe+3%zV-OD@i+Jc8 zXifn$mwy;d`Erxt2)A9eQY_!aEgQ#kTf+q_zU30P5t5GbIJ%#y9PqphfNB#62Zo>{ zE%P1XB`<_GDb1KDGxN>E*cQ8Z4OyQ=+yqPUD7MK>8%JG`8t3YVaH&dw4HSAz=7t#{ zjM3{?V?k;Xps{8t4S^6~pQSw0A9$GzYa(QqKRy?1Z?u0Rzams#qjMrF=CXfqp;*OQ zu$?8|i{gU^%@{~z+ZnKp0PEJ*%NTft7m{kmJWBh!yR!Fz&HawmCzoDPm4*8IFt`P%W{ov zLb{S0qi*6kN3!w7TeKV$BX-|h>eGfDrlNK4Sv9<>z$v-_zIw97g zIAPXZ^U4ccIzH%qs=bE>K=0EW?33Ys#S{V2+dv0mT`h4M>l|%~;-CX+u=CbTr#@-(O7_0-JFYSjyd+b>rnZXT_T>GM! z{`7)w4uqkC*M0=4f#IJIM?Hd@v^=VN4tYQCgBlNMEK=~@nO#h`#I zVC@g{NhR0o1;*ynBisPn31kMbyYcX! zx+AYMMEkqZyd(oGcu8nZhqYtYaL{>)IRGWtSimdgs<>d*09hf9VoO^5*hYK(9!O(U zjF)tVIckVpVKEWkIcEfzUBQL`>tAD-ehk|P=l>fnj8*gywHU|+tk_CGb z(3j2x3|T4-a!GHUQNCFt2sh!f)`u+tSB;B|+c6dWu7GW)*#Pi4s4s^gj$UjN2|*0d zH(~wxzHb7HRR6sb`2nN3*$^Ao0V`$>XQejkRVwfn!;)SXlMT-LJLTC8{xW03AnaQ4 zO!6QsE)T-SXPJsj0)PfW1aN1a%l|H>0!Hfqs@4eW`FA-YuzzIBB@01rkVC`5Z!Pc( zIdSwp(s238l8_er@SQ@e_2Euk)Yk7hEJr{Zm^Oht5O*8JO;k4e@!z@507ssW zk!4h*lsh0jCxd>dg|YR6y_MZ!zRR49K$T!I-*rxE_dY(!0qkU_S7|r!PK~0R+7_Sc z$$~CTuAL`(WDb(=*5p&JMZC){{7cp&T}F2fQl3cOSh;aAX81^56|6k0BAtFNDRxkA z@?x*)28r)2=U)!zEi2<4TBXfQ(tU6WG-5`6zURtsShH5e_~8m7uk}T0K{NX0^7Oe@{pb{+XKrG3bvBb>|Y<))}g_ z5UgqP`k+?(HX$#)`7PB>TW?-7KsyAcs3xj?yaePAaub2f80f=Z1TH*R=Bdxp#qnYN zLHI|IMH9i!rfnwHc2tugLS@Mx25coj>;Yf{s~w+Ix9tE8O@u*y}P7HRgk^k zMT2Y4>UeEF1=7o>@*qLS1Z|tcS#$VBlPv(kpT@^_$6KMf4(V1EFOE2``*}GHA1p_WgIaQ>zXg+-Fq;k!@k(rhacGT zE>&{<`)(z+Ee`AJJhgvdf6g^45MXk>JxJVzi({jDqIj~I^T1X_Ns{;lx>DeAkN{lcV6I1Tf6>K%9={2#jP zubU?Gd5JqB_1>~0b3{&~6)kvp2_z38_SrT&y|_e_4Q8s?0BtFJQCyJu$qrx!Z`OD# ze{Xwm+Z6p$)#Ok4!U3^x#ydswA%Av38b^B&}$ z7e@KZ4HpMW3E0J9DQ^sS9Fq+tyzrX{o89Gmg!MljWQEo!zp=Kwh%7&Bp!~>0)-XH6 z4Z;ZrZYNK~OI_~IQ5;|cn0EKw_(_?cI?o4u4Q}SGZQo!>WB@8%AKCMvanfXTE(3Z; z0qusyt^iGCfd4aIYu+6}rZ>>G_X?EF%|imod!dabM3~eV1=CL>Z*akiB>5Ap5mMt| zV>H8k^pUOEGrDsfsew*1TnN`24h_QFr2Qo&e>If0+x*HVmtZYE*cT?3Z5@3~8tzZX z71K11eTFqz3(njK*lbSU6_IXu{?M==TQESqpclk)K|6p>?LU)GP38IW+j;x#n@6&Z z)^gp2+ZuQI7Z(@Pyn^5E$aH_$wyg$}HTq%`*u&um*ZAHWQi5uUmD1^RhX^AlZfqcBC7gR^@SPtRLx&J zn;fS&X&3;B-0$InHlnGbN=n4sUV@*t0Sw}<`XatieG_eYfzzBY5A5eO3_6*?R@U%5 z<3+U04ZAg0%BvVGKQHU=ftUHq&&#(N5|UN3E?!RZ0VI{?V!S66Hnta#fi)!9#-Ts| z+Z@rqZE$J`)2{j=xtceS3q?}|k^Z6><_H=uzE*SXkmx=>+$r2?AU6l52$+rrgN2~o z8N3yp#GQwJ6xV&Cu9~j?Yp(WF+6~qWbI`g2$`}Jq0ld>Qv{}4UVI+iAZXv$a^|=Ue z#NaW~QjY5fc8+D%FnV9Nz;}bExk{#;nKs&o8>fEjsrN3TM30x5b6De2?0&^G?GE0d zxmqti7;IBnkaf2%NBzo+&*vXXP=7g1-85U-JnO|iSsb>vFH}XELzE4(z70{>>D{y^d8M}c9_o``+sM{U+_I+ih6Kix?xb<`Z1K?c z!rgIfGU~I?x3t}~w%YQ0d={ImvGTm$83zcf!<8*kGLf4k(j0P^-vQj4L~e%KG)vtv zTiqG0Xh;_wKFi_F>G)4Yy_93oJO;FsKnu-daLm(VpnZx^bi)WHF;kfGMG4u@EcK9G zsRJV5aMdeG-!lnzFd2pWIerkh&-bLpz1NSauttcO5E;P(C!4!1?)p#mnN%&AtfVtP z*_@)duJcy6M8d}eb&ESJ@E5^{ew~m@)US0jcZ`!4BVN#14F=;S9*spmM>2i&q&rw% z$pu^SnAxU+JG^L9tYR|TR)Q;3M2vYpS!yfe%)<`-J;mqJ$NvW}K^x{NjSUq8 zHP)Y$np9q$X;40(umUf7_a+a-jDBFTH82C1Qr7R8v1yMThhz->E!EA|F(TDJe)W7G z4R4)pyJ4Pq>>bW&h>!|1%?CRl*B^sEC^n^&Qo}sxg~0)q=U~i8&lRYemq1P=%h(tv zfVmC#8=D2bq>XR+qSO$qU9wS-rZ$8?IW;?L+S>4p>X z2;Qg?c%(6wj4}5f;)J#6F4b{>GW5n!mMvi-!LHEF=RsRKBFhH@bch`|4CETFx}iSn zevB-MTvp7hn5Qj+f7E5r*V=-$s85NxlkKiTkF&TKlJn7o1IT-7_k1D)`D@`q^9c{o z$@8hlny<`*0U4IP#ltnD_<*H?5d_;?C~0!(_jTjQZsb* zC8Xaco*0()zsOHjTmkZfk>{tr1+D>xeTqQrlq~}y^w-`auJrJ5QChyF8;;5&u!FW@ z7{MS(^{sdir3<#|Lpjbwa)iEz_(XbfG7@JX5q;|BpC-(=o4OKL@%~P7vc{_Fdc~U-jqK4H;sZp0c5+R>T ziH9ZD4$V~<=&2q!-s52j4vQ-qT=R&<1&uyzCti<*6l1NMpvHy+4WktGt;3W?9p%T( zQkx*Qc%)*6X$TZRh4GX4pttb78ZUzkhES zsnvy0lamHZ$qi=BHsY$#V+_07tl{^t37qDdu`54V584GHZ_tP517o--MXLedCn=HiBNX&pb!NQ*)Lq%YXH-@r@y{8o zE$E(qoF6MZ9+Dm}%Y&aUHIz`0u&i?+H&J_j;-(aU^S8_XyT;B|NF&8O+?d zXaf5kU(u&!W|y+g>}i0G4K^r?48I*^YYnvHK;@Ttb$}8ewA&3yWKJMf=FuD^YbN!% zthhM7ApL$ERc?5`-jKwbGz;^1h-WoU)34*^>VeVt53nw%Z3iZRLG#zq<(CsO*{CDt zvLrHWTq~Cs>rT!JW*=fvUzYiE%h;fm=Q$lEZK~QnoLZaf#j{{} zK>KFS;z4dT{)JN$U_-H|jw>t5W@K5Wiizx=x7?|3ci4SbcQ)<+L%1BeSL@W3Rv`(IUJ5!5^F{`8?8L&3;`BK9nK`$$PORVz71r zjfXwf@e|Jn=ng`qW@TkSro2tzgY?P)Jo$3kHJtGf zwChfu8;1D_|hRu~TR)dMr?@NZdP(GM>V;y5SkBbrX8TdfdVDD+h15GLAVmmFEHERfU z$3j;MKnFR_TX}^+&#-VGl^aUoWFWDRvpV@}v6vTfo@(A%E+95p@3kp&r}AtmfFTZ`S#=Z{VrRT~ov9&37hV^p#9Au?vI3AV}1$#flA8H$ng0`V> zYCa_AFs#kc!tp}_C3mQrkje<3Rm_*(^NXhh{mx9t62UEgIM`R`XNlB?imBZ+)ToX? z!yeUGFBfQUk#ng2!`al0$wb3V9e3ANT5qx$XX`s$mb#JkL{Hr0%`1Q< z2&89o^8ik;p2}n<9_s4Y?B$YR)!7riVxAIriyh2TNoar}j8)u6b}yQ?W0i&i>T)_i zj>H_4$(Rqw(ee4nAR<)y0=9FQ2>V!U={xWa3xD_W!dydnq5WDC6s`OfT516Mu_zv7 zfc63CKI4T&_iLk8Fmhv71ULrC;=aS35kDYP#|(G?1=V}`3T7K@VdndQ*HAC~{g40f z|Nq@@g8x>=I*6k~>y0g>9pJmp%$CUiK5-9V%fc8~S)C#CKZ0Yk#T8Y)^3e*9e*>6w!ZTG=8)ZL86w)d*}l~_Jq`_qexl_Kro`v4p$Tia{eI+1L>>2$V8_V7{_ zobPT+Em|v9Z2k%yFgzqR7>W~AgWS=W!YRN@CDRUw+D?*?j3*$HtrPhwYZ&wlx{od! zcqWeUdCb2KNAJ~Cw19bZf@qshoQ}q@VeAVG#T$uH-+*T!4G+H0dfvsIS>QzreUZg+G;WygGE9`OeX1IKA0H&~mhI#(hmqJEAR%xW z&_?3|(S~sWU?IKJ$x6FAa&UUh2*pE5tRgKVT4^n(;r>WKv_Q|JJrR1oH>3n2ec~GW zaKo5WO1C=FC%vYxc{uw}V*e*q$lt!9{fVA(|KZ zKi{*@X5>8^UHH-E@!(_H;)1;}d#PI|u~!P@Qu=FM5{>7LhV=}bV`5a#LKwJxc@TdU z#Y8Hi9(X95pe3eA{81!&aI|FS z6wH_oUqnR#@WrQ)yuaxIu`z`7nSwn?Ro@?~eh|gpr&9XZKJb7~2^Wn$AYM!%CPSdf zgVeFi80`Xp!(<_|H^?R)>W=nX%Q4Tw>bobl<_wg~@BR`Gw&t`GTNiB}N{GUW8*A@f z3YE9??Fr!nAj^@;D-Ot3fMk~e@4vRS%!JRTE-Df?N1G~a*Kg(qN)i@u zb-E<};%7Tjv7hf<=%aME?vvZSARS`a$4n%v7W!ZtEk1ewJnKRb{a22soZ72RoVWUNu>7I*O8PW0Oag5T zW8a<-;pkMDNWVh+zMjONTi2I2sJ6JE#jD_Z|QTpiOI;0&-p;x!L98C<>Z_)lI?jX5w^kUV89FTlVii=R+PM&_77OP90}wB}gfx z)?fbWzzXta&B?c4F?$n~83XF1k^i}o_QhdaXsO2+Bed+~ghkjTVkx+>LEi zlqwfJuIcjzLSFgF<+y7%?SLV6Uc_>DX2ZOm4@~v z(OB0o@YRoid;Ne6(AWn-fMpF94etjG@wO5~enf6i9Y6hwNN_W~lM2LR3Cx+*GSNUI z8Old(^@F#S-9j?%PYwL-jo$sRjetZDet&zw3^`v=Lsafz=3!oDo~1uTgPc(rVBFqq zBKO2$Z^GC(tYLa(5nzRN^DuRsw-q^+NH}Tz((O^A$Kxjxw3LOv?stXLoSMFhDx#Qk z&;fW%T(5e8;649)=X+ZbA)nyaq<3OU?3@B{GdEH_RMG>r5vt!*xZmCW@$K6ms``rZ zhlm#man#1|d4oP+*eblPCu^UJ(xs8MqZQAsKP+D`4L1}DAF9XJ){w9L<@2zg@qg&= zjq&y((r_kt$MC4TnhIa-C<;N;Tl#>wTSj8|d&p?7q^q&+jUYh z{ZL*-oCTQ$3UI>un|E{MZxdL6*0X?-> zTjB_prfhX%mb%fqd8j_hY?}i16Esdms3H{LK2ikbWAVp&2(IeSyauq%^N6T?U+E$2 zYH_LQ@~018_{mLqUgY4FCVy5M`DIo6$(sRehwkg~LO82Y>?xnAJX=8RRPjvtv=A0U zKo-u;9gsfu9EcM{^p>x3hC<9|b$!EYe)DAB9>wg#eYuj|@S29qR1hjZ=7W(-Q3I#t8fyKKlP@-zIl`C?JPl@F2gT zLhC99$#*?pL!n!rQ!#AUeBdd;tzpaR1EWqCOZY@+2TIS|ZD>Dg>{C#>j2kVT*HQeu zpP^T*^ns0mtQ|hAY>UP~EGH`M_VDJ`NonhEXMjy`B0x$miUAVe+ zX-BBGjpy`30M-^D-}rnYoCb^*n*Ei(sQ~D9UI&B=ls(#t| zF2X!Y(Gp)EXQ)WXK=GblU~ilhdRquVsY2cw-ScwV_r@q%2WbQczPK~+bO5_z48g=@ z5^3dcY<_?3$3Ddxtn6MB2^ztxYSTo{J?n#L$aFp$% zXgV~MeLL)I>^}2iytM9=hjL>*nRC%eQa6Vvls>XI^zjF(1{$dDOCsu;d;3G=hp598 zOF582{Lriq>+aTv8OrR~*52y`dFolqrESC5<{9N993`m-1>lMAWD@Rdo(!&lEJxp7NNOts<5{ z7TGfeM5(g~9C3%pf2X4W119l9+JRGPe3GetB)b9olW(^eS^+=4=}{8Xkq)%ye)WfH z2=gT_>RipRul%s};H=diZF;gkfc-OE(Wkbjy`1x5x9@r$+b_wZd3q$JqSRxUDL@!3)$DW*p0rO_j(1R z{L&kbMB^CRX}koIIl2pJw-|_c>pZZ}R7^~6j``UA-vI2rkO+WkV$;C46V+P}N;VmOa3gUdY*in6;^{?Ch(T}gB}BB{w^9f85&!TP zCMTW~(>AErSoZVcvj+-qW9!QYE4*aCGp9Y+Tl=1o_EVM95ytiOZkiZ;M>L@;{8yT_ z{IlIOCp}yg1Vry{OM8N?*9|6p&RW&9d$4aVpSQ8kWYiN;9igtEv&OsOd_1kLjL){I zOo6UaqQ6rUKRl3MbKnyX?eB1s8Za0ft4(VLV&Q?j*mSiagmseZE;Tq|zdU~fN;ImQ zjsxfmeChKL)_Ac5b4tRReix5o7Hj|Hy9MfpT@qr$>xF!dA7+1@EVOB$SOYJk3yFYUj}87$`pt+H66(4Fn>>>g3!rt4(H&$o#mfME89=ciL~2G!A_44oFrhMLl`fUIt=ayiNpN0{YY~Kcu$)JK^^l>T)GbT(0B^J?~WxaEqW_jWad3rhv1;3&hPS2= zs&HjQD=RuT58H0vTGI$9Yj00FcH}Y2GwEd;#JC-vaA7;ao=d#1+Sd_iIREsiC)-TdOR137=bW25bCh(pyYyxI#F}un zs*|{84rZU3o@pY8LbKPFmNCpG_T&lbadE|UrVHN zf6B+y`D!G)TSwm8r+a3WI*aP#zdoKooP@N+%1s2}yCuAvCwB@bY=6vTl($vqE-Y@# z>GSKyNh5-un`;{WY_)G9+NZEjMg0|KugV9p+TWY17b@I69iU3si0=1M|A6^1Ab-T( zdrsoCt#;pqu0K62h+RK7IoAb?+W4gJcO!MH7i0JHN49}$y4@o7JBz<}GW1slbPV4b zD~2{YQhDUqp!UK19B@noW*)++#L{;I^=XRMc^SuVKmUvhI~u}YqkAT${9}pmSTd8E z9|8~{kiGCaRW@GnY?0G4*=ue)=$tn2Ge1m7CQHD_6vhV9WqP$DKT}b5Dsu(z#umYXa+dB*(w1W%5U=ZA9)G=Klx^X{O4nHA@Kho zMFuoNaD@UBL%RG{Ui{~|mZ2R;qHR@g;!fBg}&AUpf_Q+_P?VIO#POBYp zjk!B}Vb;`r-&u=|6E8&H&Pqn@H4_8f_h;99p#)lDSmz3P0Rik!CRb7GDb8)HjsEKS zoKk9K zAM}HMga;BrDlgS=vmR%5NKHXGLUKpRnh2@qyKyZgV|*16L_^7j93^*fhxATovDJb{ z>EQ7lr5~c5j)U(~*Bbc|tdWb496o42rpLI)Zu1^C#BToc4Ay_$HV@Ws?Qi#UHsuCw zA3A34ccsJa;vXltD^uQrg#-AA0$&%T3t5mAs^3SrEm{WR#-_Jew@*p%9}lZfcHi#BQ18zJ0C${5xng{pn$tp0b{&-c>-D3a^P;2 zY61KEJ2JVw{m=}ysjO3A{j)AXxxkTf{Q&+rs=q5tB5y_sqK zZ-481VF7qg9ky4Oqy#PqoRlbmu>fQFfr~YkcY?-G^#R}y7z{u3bqGIZG#tuxsN6kR zKV7zKFgADho_3q%+(_0&A`lgmkE4$BT1KjG4^-b7p`WYWK1@(W#OFT}N1#62_!!=juC6VTUonLZ^JqtO)thqF<1)hn+y6pd`uOZvLC61qb zb814QGV&;~?3Uqi?$hnP+2Poy+`^s)qtqoRu2Pl+YSmY4^5136B!f9u%7hSd8 z3yglFQNIBFIdL;?FZ|1HS1((upsK(a<+m%TgFjL(lP0J`VwB%(qIUcgsSb@+PUuHn ze(~c8k(1|1W=fr%Rd%e>y(f~T4ERBFn=_7=c`-R`VgdHz1ap9FHPX%H)}5hjdO=(D z8GzUEPcqy*!)=$&z7fckVjVUOqgB@1h@wG?%>9tM1hcFkK-RE#vL}5O!Xz|}sa2Ie z)8$mW7{!~^Sq9Tb>1mogsr!j%urk#w7lU%8qtJ!;a^^4 z>oM-$c2hpa9hxS8;EFP-*YI|zHDzSXzb`9;3J`X&SpU7 zs9unfoF?;@5pL0}69Y+uYy3ZBJIRLm_|ZUFIR}fh60I+!Szy~Ax-teKm6P78k(TJv zRvzW>U+yi*Xs%wtD5ihpAs!-0!P9PHm=kz;V+p*2*3KtzNO#a!>prBNo3H_2uesT|(^J_xk8t`$H?eai z8frW&mL;N)9+5y9NGAor@j?)P-M){MHgaC#@r6vLb_{)Jo!UHA`R#Jvx;=>sm!=?j z&FXY=zH{#|HWX{Y1(krv$oF)1Z-Yab8Qp8LR8UBS@A)OA&Q)K!$@ywKqu6P$0-F!cg5X8N9O)%9EouMhxgYy?g{tOK^H6r- z(9SR3O_gnBTT~tB4|7Wu8#b z%vbJco1qaMEqKXY!drZ_p8QS!)MYZ>lOJ;X0KuMp9-{fY#;Ivto784_L+Q;dS;S{j zd0ljELXR?*t+u)q-J<~8wxi@UBd9+jRhBvvF{VQnY~1K>T|EnQwRPs!q3ls7!;YK6 zs|!A>eiQ%PslvVa>r)vA!@+~^kfv=EByDvR74QlJnU*?VvM^AqdFw+i5s2s>L$I!~ zJ$@M8hgX)UeTIC!&_Bv&OmLA46P>@Z`lV6syM~ zzL5@?jPrKf^JdR3Nx5;sy&KAoDKSi{mEz#uslv|~ zN{D4k$;6BN5onJDH1^Rr6ALgLA>1liM!~B!GDQzH{A1tsPyPwBz2fh>&U~@jm@C%q z28>u`jb*=v^cfmAi}7BgS2Oa%uM23a)74;7!zt0%)s97*5m zNpLo^3iO0U=1}gVbesp7=@@R6Nc{@p)(_Hx;cBbqkgab@)b$N7Dv$Eisuc{gN|X_9 zvglwm4hS5=TE*JiyVI$NPvVHB2R>HrUP>>m8_H6mCw*^j;Ayu(&S!ToB_r{5y8o5XnuzXx*YCgc zk=D5wXZeVcdeXv(-=`KvqBK(eY-|$`;^Dj6tzQ=(3;5@)fRE@};*U)>%%jlat4=>2 z&U0sav&ND>;Jmjx&tXR_Ht$j#0X3^^iIVv>n$l!E@gk%X|DgrEq?2w7Wp49CG3+MI zq2!}j=BbS(FSwz{@^CQ`eY2zwn+&v^?#5#GZp8dIT9&;n$QSWN_>Tkw+2xt+ruLC* ze1KG=ugj^Br+s+|xBriX-pj`U=mbC@T-D(MDmLLW3hKrWd)k+ucCz>0LPGqcub?&W z*27B!n6FENmPg5m7hH}=4T}7IJ2^m|Qi(YJ>kj-3h(|$gv<4Ej$*S~?Py1rDV9(u2 z>-YL#yC3&uHAikioz86S|8gKTNCaS3gg*{vFI{qWr*X&s%EzU(DO+&hW8Xc^CE$Y% z)04{sDd`JS89j-&0DrGv+}&`;|6R5h`+n9J$@WR-y*t21DH)+{iPHO2>(o9>;F7|KeQ^YH8h0QhYQIkN0GMz1Vk^ z6L7O0xS4zJe{h4&>$>CuAWQ$XeU_eFpxB+4qP!6U*&MROm@oTH3fg-l!&t{)tmk&^ zagNfszhznHUw;g~uAy-^J{E=@4nk`{v7I%R1Z%(Vz+v~;nw$G95BBE0P-N;c3Kxz72?{_F_N$TdB$eqs3m zc7D4W|9){0UH|;BdqmK@k;cY@KW$n6Ip`zhu4xvoP`vMV7CSGZjq1R&#tP8V6xCtx z=cj_EfN8>v+t5`{g&WR2ftQ$o4?@Z@8{jn7D zRD5@6hHxY0 zsS$x@N_QFY|5nDS2?zr4S?(D1wz=h}1`bfCj*=#h{Ic`eVo$}J+!a7xnK`(x%kJDj z-7#pnlGT|zyF1JmxqfxW9#vX;*lcJ^M0Ux4)C0B~V7qnw{ykG@s{y^m!Y`xPbvs+O ztGy(W{p;9ITpD)WXDb^A$APE~xvt&@w*CHyp(`?_nH z{XQp;a{F)3l(!Uz(tZaml47(e^FG)s0rM{3XURp!3h3F#OjAgoJI6Al<;2Ya#YDdj z-D>$u^AsY1IZrqh#~gh$Om>w!mZN<2PZRvB2OmPjR|9d7(f@n;-tJS-sMxl8-M-x3 z5B8wJy6VQtu2GJB2d+k_vEKj4?0HIRxtUZfu9K?l?A+3SpbpTKi z^5yY0p4bHJS`gwJ`5Yj=?QjgX=f%dRr)EGc)c$NZy@Cag?L*+S@HzJ};4SK+wBH#{ zkCoMOOH)MLn!gvJDtZA*@|6@z{Xr*+flh93j2B1w2nJvcvFt8`T{8E@QL9{R=Ii}5 z2|YJD}h%gjhh?belYpo3`H04>NYsgGfIU9l2#y+a0Rur!rbPr`BZZ2eev zmxN$+ln?ya61R1~oQ~gf8kpL}E2n&%4`7XP>vtRM*p>q#_xPIKs0@i7>NQ7s&7zOl z|3evgpV1SwK2*R&_06&RNJXn^1^q5ag#Lq6}Z+{X>+ZICNsXlxR z3sQOnB|!V7*g9cCy69td?JUJ(-3XcY1Kmf8zcc_uHhEy?<4~-$zAstyiMBVq0+?`J z{KR+j)3-OuDNPk+iPg1W_pa5gVl$?}$s)1DJOx4^HDhIcGEXgFOLyW-991+PNrsL1 zP%=ma&;lQ0*DY&VZ8u#$(1m$Vy)RRwXq9HN?9ZGN-v_$}K`+YY0`Qj1JT+aO_Ovg( zb24~>6-6l`4X#Y|XZtFxSq(Jbc&s%FwI%!OR~bC<$|5Kw1#sZI%0PM%wb%b`8RQ_G zolH6n&|s|-x9o!osLtMm4$@tM=6aRYczpeW9B9PWaU1ubMm)r1szuO%Gq?rHYwifA z>U|%v>W$gC)6~5{$m#5gA}9a^(Pv|L#)gEBzztFx(Y&4j2`*F7pOUUZ;$(TWx*%WS z-jlc;pq#F#EL)*8xY0{GTzQjhnntlh!ZG7rVyJUa8`9%5Sl|!dJr9i0IB*3ZA%s5! zeLzIxhGmkC30RbF7xUG(BjruDXYtRe#Bx7ow%RzDnXNo2g};yT+WA|pm<`T?%Jkze zGIuSL>`Bi;a)vsKyX8zG(!K~*$62FkSci}Uw-4%UO(Kb!C@PIoT1$8KWJS5_UWVd~$GpdLOhHpS; z?h2?A>O(_$nDpG)Q$HD-0fg;Pe!SKl<-ARuiuTNE7*}Y|9BhLLGM`oN@L|lF3V&5L zKp&OAftA2=`I{Ce2*b1PfHRH&Yz7hQh=nNeX^6fY-bM6-c^I5a-#KBNrhQ>dqIMK} zDzh}y>E+rt6htO#&b&0dG9CQwMtKOrFh_hrd8kY~8!Tz>!K22G{3P$w`AS(t-#BAO zfa-^Xt+d@6z<~DMn~;8%B1N6wzyCYkxikN+gR43+SwpA}pz;0=l(=cC10cE+;kFD=+b%|J54>Se zpA5KsajdT+veu~fl^2#4KQ5vsnj*=N{lQiuwf9XRf6_{*N1<4?@{| zpg!pmRRo|F9d={cOSGun*E6`i9ZTK6hpn)GRCEn=nv|g@K^)J%h(Oi72 zdTZg$=p=t9V2iOf?C3jdh4fB2R#oc8JlW~YlsA=4Wv?W$Txrgh4nWg5+g!0wImDAH z2xciuoFM9(3TR8nT>ysh`D>EZe`Ur4z(v#xQNwRH=8E%a+8= zn`|*sNYjUM;`I(|6CSnY#;a>`lC_C6 zErh1RLM5c79;oe5Jsb#<=DWHO)!^$mg8hpWmw6qFQ|NBgs<5g^rqdnVq`%?iyX!}& zef9p5Z!GI@&pLD+hLnzQ{pIimah z`(i7Ca$a!M1sPZZ>ATzlMSIIkc`Kbu%`V2WN$~piuclqb8|?<7%}S;9vt_ ztzyw9G8jK1;8!3bAVYdAZCjV6u34v)6vMb#rGx`ft9o2S4KBy#Dw=(kXtBjY@{^hi7eI_c@IGk}%H%*jpWGZ-r?dql~8ah`n zx_)$H^$hh#S^95#2!>&v7QBk(lnoq=X0nVc_BrXglgJ;X?)3hl?2~w7gA*I)&@tFu zex8ZoUm~-*Vm*d`@E$*ojs$Ru$9w~ioxU=CW>uWb*lIVVY2fcBPwgKB zHS|#BRV<;K?+j>X%9+T$w{5JvwPYZ508Y2Jkh!3x3?aViGU>=2G;?exhL2Fb_~#uN zyd!WXsL;=<#{@{6r|5p(GH3G5%Sf5Z-P z`bl@28@-JZFBTnIjifN*y$l2(yZ)4ft|EWt=LD#&^d6rXmv;z~j16w0U5&nNZmXeTH5BBrELH& zL0uUndyQAZ!9J-hNX?DI7ILH1P=gmEwdcw30yw=;Hvu{YbSo_6gLebQ>4&PDhiZQ& zcLtEvBekzTz6@{(#{Sr4&##iOD(W>q!;M@%LLUXy4_10u%1p7886=CwDud+fn4Q#Z zx^u!Gc`Hi_*tp)eX<3YR9RY_W>u9?H_+ZI;%lN~fZPZZsRfk^0=!voilFsqhjGs4r zf2#+xkD3qp9pK(jrH2FZ5lC^gAxi#A8}mi_p96?xfxP$s5ed#M9^3HN&W7u~+}(ExX1`23M4*p~@%=e)1AZNbr|Al0LXW=fGCt zOygRp_!~jzh`-vV8joYGLnF24X}l~uLoW$cMmc0aKW2d+FsCtB*|;E+Be~zkFhdb$SfT#L1NF}d*ccp@jpkoe_J}~h8(y8F575{R zWg8t^rvgTFV6u=sg&Ah=EBK{YD>Iti*{q0Nanxd=cBY~wWs!0kC`xdMve?`eKtqql zq76YN@mxAXw3TpJdp}M3i;aV*lNZb^Ro`)EHZe)@4p+XG9wf>QQVP;WMu2#+C`1Ez z`G5v77?(uKDsjmuwo;({6*ip(pB3CH0ZkIZ#{G3A6M#O}^3>7tFl*2DH|Mtb=(GA7`RG|oF5XpX@T_pl`T`=nd~czHI6@D}hPO*k z()NIbC{ll(rN<8Wv2acbeRNe15(jJ58nOHg7fuTv9L+baW^vYDWS{lq$!J7(xOy;) z53xL(M&f~6Hjsf^c6LIvAZEm}*lWiN@@RZJyi3MHSa~|^6D@lJ8OU1#^&HWgumCZX>hGAzb|6Gn$b&OYTu#9=c zgBC7FYr=MY;vs>$WWp~bn!SW197?nWfs1~8F;zGkYd8CC?@Yq7cLV&G`gOMYL6#QH zeG=Bg688}7h!N7g`D;6K8KyB6V8>#~yPD}teLC;$w}F%fucSh;#$0vFDs_7nlc#Q6 zqi$KL-B05)(EHF<=>6iBZCHzk-lNIuJ0dxdH!qf27DyEs;>cxz{rJ zceB{`iPPK5serM-ikQ9p<%N^HW0yH^{_%rcj_mTywglF=(5kIA_p{DzB2s+oE#QW4 zkME`@@1_SwOKxKsLy-J1^SZH?PEM2_8uoF=aTXFlw0_Tp@N1VGdo~xqL&>r{v9^p{ zPaRAm(==(1x!JOB&1H@f59}J22J4qMXx?$lRxj_i-J$wRta@vUk6y9dc!mE z-8us4LV-IGxG2SKrLdgrNOOk}Plm~X&~VC;mAj+<3qY$@qw4ea^W$%QjEQ=%F09-E z`6{(YV4%t2khHgz_0*>yE3ZB~lJu|g`w}Qr^W9oT-s~d!K*btE6&=4;bxTEqd zJa!d~80(W)Oau15-A**@v!%p`Wk;NQR=rAbVW6lwo^w^oE%MJmgB;|4mb8Mk&Hf!^ z_U)%TB8a9aY~w%r56M)}kKnsOpdEDIW&XIa%}ufpTn`DiFzqP9HIWGLQr}NMX(KP* zTtKX+i4qG|btK!>#>w!$1j-mj_95L?G0OGxX`8=Qd$%Q<*R^`9{{~<=b}DwonHVw2 zEXX$bb2$o0NtRL+2CrceAM{;F!!v)Wx^afS=loY^jnxkGe_F zU)brE&&|HyxK#Z(Me9lfa)0>$#ryU-+K2q`B%Z%{Rk5){5$K3ltWhg7ld(S*R9V)5 z&`-79b#MT;)L1ZkeiK037@-a+ZiNI#|sV4F@)>H3Sr>OtR(uULaIgEBK1ZDA)SH4YB8!M6> zOewJ3*N&p?gD}X=XKAw!c%faxXmSoLgpa?`d2QJa_7htp0KR<-aCi4th~-Vb;zt_8 z^2}daN-~uSuSobb`nE`z(vp2*VXGrub`n^ec z)F7l!CDE7TXuDA2^r#Oom-MJlSQB(Q#2tbC4V>}T30BOV24)1b)Bff-` zyxENQ8lb1raqr6nMG9LL9H5Z}CPFq;-9At|nn-W>sja_Qcdh2OgK3Ct8`c~HIVCSA z5n#`7%a;;j?vslC!{tV+ME=D%N4{%+3Y(AU!Prv+AMwz)kbdSDIWo~~18=L4+-Ik) z8N?bccf4&S6csz_@0N&L$z)p5vLQe_`~P9>JK&nSzQ^Bw0R$r2iZYS_D#&&qAdrX) z7sE*%48<)|L{Nn1Xp4(r?XY!_T3c-$MEzQ=i)U-Ab-+_=#RU(wiUShD3M=`a7qGS8 zTJ`(+{b^qklY7rS_uO;Oz4zQRFg+M-Zs@j3!ZhU}l^Yx%J;yU+%xg!gcH+0lq;6ti z;d_BE3p64D-$X}h?5JYu3y~h~YoDEN)#HlGa(jb}{|%p6jOC9mFyQPUwO*7_WFdW; zwp}CR_hMJ%a489U63dSuQ~W>s-=#f`Yst{Q8+#J1OR~QT|7w7Y2dzsvaZV}bQ#%KT zsf+^YyBrz{XE(+P6J&64UxWaBNRQ{KKI}u-xaBt0yQ`Hwx>?lAY0|U({7>H4cFofI z;cSBgO~N${^kul9bA<7>Cviv=FM(6#vPiBGyeD@cY0gLV*s>wd&d}ue2%2mc_2{-; zlI3~NuuQ?_Q!UEC7DG>~d9VrDLOAOu_q`f~c->V{@Frjd?}^*n<` z7fM~3tMW@-txD z6|HsR>c=p*QRx{p&-^LITy=PcYz;vU)l_3EW3dAo9B?iPFQ^x(y_g%2&qRaCKUI!^ zJ%tHQAAlnVkBESi##5C*(>H2N2W~(^3Krdh&IHa;z*h=^#<2dHj#Kg6 z)hO=je5S3>sV}_-N$i!Feu_9o28RmEAvC3dI`js06> zT;qh!|9_StM|>E-3uIFKJ7PExVKITKEaZ2*S909=W9(Y%x;sMfVytxRydpoVsgdWcNW{QKc{^CJStnI_I03tK(BB9*@y+-rLpi_A8k61 z4MIB3paOph?S3es;2P1Muq{E=+fH4_g4yfWh`gthi4V=^p5Kc*6cUd9LYw}u?@xIl zn}jxPtSD%++*KR3YrBa3`ilZlHmkZocUhEpSDnF~%HUXtmo^X?%G@`dw-kL5D-!hH zo^UNPV_$|?{3P;l)$CJVZIhY6x!j>-a_?-)lGz)7>XQ4<3&Wxl!uSVr1$s*RC#~cNhJk9 z$T>3yE&@QPfw(qCJ4!N7! zi{fBEuulS)h|}avOQek6#^^xJZ?}*>@uW6oqaVhY4_E9OD%`tsP+tu7XPYB5EU(e+ z6(qA6sSgWl#>R2%K>mYNtdtn{d2cNwWErmPmg>4&iPX)|j3xVf6Jf{$-xq7YaCWf7 zk%)QmAQ5LpV@5_>5WB8CX^{-BfX{3Er#vut;G80t(POP`Bto9FCHnulDxD_g2(Ak$V*u?WxKZ!0%bsWhi zZ&NAbm^xG{!Sjdk*?7$${yY{EQJ}*LrmM1%{6YII(E9f*ta(Zj891cQ;Nyfj>rE*P7 zQ(etpZ(g5mQ4anu|F%9Tu7t0f>Z?mXT)k3BS=; zCt9V-HE54+*493-jtJ`^0&`3Z4-K)4`#AP)@oX8S&4&MiAd04Uo1f`(wzfayU578Y2H}g{onNFW*wql_!rH_SfUjU{iOX?0wH1;#L^Ic78$7Y7(C0?4?n@(# zj=j$rG@((LYx|svD5jY%CrM(t=NvahcKr+e_*t3byeY zgb*%0U{GlhlgxlcrTMtx;S5+* z5~7bPdhkA&KPvvFLbCuOCl?PU{LdRVB@{f=OalW47n&T|IY-@S5Myou$Sm6R_H?8n znE`W34B%+p?Kg>}%_}8j82;~2h;hT&2jV#Bdja6Y0B(@99$ozTK<1Ot$d0H(T@OWF zUKYsSTuJO4C63{L#*cq)kF3F;e4dYH?tDtH6W+n?CZnT~hb9>8-(j$yjK<1)zGK(b z?&ygW0SJETlTqSuaa9MHRlx;2pX4ErKR37vaO@}BDENg)2=lMf;C%+-a@T?zlz807uwanHl_dF9lq>Bw&tV5U^H zxPBnp8i2hgN8+iNZeqr3qOjM4{!0J{IR8V&2#;H^Z`%ypM*CNNPzXO!@KYSSd8P1S z8GOir4^KKjIEY3~cmY$`KSIG>P{ZT)iw{E8kN$*_NE3gyV`>?G!l1BJs0AOED)>n> zbs%{JokZF*iJm8=^CgB@xV$zPIv=U$fi&U zL89VwkY(PQao|Mi6$P{kLWcDhO%X8xBslWG;eDwDZaXAf0i>poyNY)MOOHz zzOiIeY5WVU0fJb;-aGU2A7T-kl^4J0+Xj zbnlX-nVykRj1dVxu^z4ne^H1e6nSK)=U?o zHk#YCw>4OK`suy`!z3nj>E5xReVOpj{(H=I<~~hS{hqlW-x#rU*M7ZzykUD;WFbO%)^pZA3M+{xF%ya5qPj{A0*57V&z z3eqbKasJ~}sJ{1a-g^qSmh94Bxl8Y^hS=a$#C^x>?Ow|A_AAfJQkBRCku(Al!-Y|b z;-@9B(frnAFCYI(*nL&;xX*-4O?%Lq-@F^w<(>JwW#grl(l%MyyWk;oO;Ug5isoAF z{k@7}q^&m-?sGSYypTtURxshgGGYb}M@XrIaq@C3ecvqn(L zp%+brwYwn?lw??Gg*U@^OFzuKa`a(Orm4T?Zd2`k2*JM{D+}m`d?-iiH(c>1OT5)v zwxw!2^7;G;s{&cA>(;=xOhnC)?u0sepzqo}AbLAnmPWqi3q@xbnI2ed{e z?5CwLE-K(Fo304y3r9=Hj>77}^1|aXgs~O=BDq_WnBUCmD#$WpH{-N|7Kt>SbAdDT zS2Dq#Bf`xZSU=cTFSt-us#ia21x<&uK zQPfNM?ic7TCA5TxX|TpkUm8Vi`pHIouLiThyivIKzi)~I#Dg3b_O%%J`8XzUVAJ6g z%ROD@qmBP#Xk)}h3tz=*lYPoGC_sisv8|58bK@}XG2}>>HT2iI7?-7px%dfen?(4Y z{aIA)#st4q$1)TPLu-qeR>%4ZkwLCLLkd;n|4=k~)2Kfs?!)McS)*-z1+SDBjElS? zg4^66p}s%|z>9^xnVL@JREcV|wl{-T7HStr4Wo3T##zQqtPuKAKcIm=jsNi&ufSAJBaC4iFp1@=GVw%*;X$x31O%s+w{GV>lK=% z3b9O#jSW$Nt_pA$=qkX)dZ4IX!XPZK_}l7h+QH09RW2s-gha4AQ63ZBaI6OlL8A5a zy+X`>xU*?oJLZLO_QCp1oU@eKTyyFRNU;NQcWXt~pj0Wd_M$;^c|oeQAasu*E0VqM zO&`D9Ub<8jIougXTo9Q|XrBdG0u9FWKxt7oq$!_zbSyW|nmKL5<361@3cm|@ViqVK z9>w1#9b$32{<%(8^EG0pGxnk4Xjolbkf5i6c`^!1wd1hzgFM|$G^#nmGmwh)XlkV&;cqN1Co zzLQ{t1Ew>R`dQ&JM`we#0j|Agg8_>4%eVjm2H-gsDvOTvOlEwF+mp)%5Nb^kanTNu zeO)*i<_WelM4kHB^O$dq{2(3)0Wn4ahKM^@d--VfO7RA)NfKF`)YVC>gVX`vp{l);TB$X~L_t!? z5cOHj1Q-zv*g!A<%3<48*Q`JR;w~o952X=X5 zNPJ@|@AG@etfoUu)qqZYiPh`M$+#sG#1Pn77R!C#8}1Q>vjyN235;9-j~GQP&IZ%y zVk2CX3ic9kY=$kA+_(bLlV~#no=jP`Bo-D}&o5|*1OW?Ba|GO)bl1MzHt9_r(2#;i z)~^t2XKT96mC#nRtDQ6K6g?oI`#4soAyeCHSl^nfvN$RhU{-*M{I65F@P zHcRXTE&&aWF5ewBPB}ciNlu!!f5?B=v$jA9yLDnG^OjuCVn`+Xqd1dBb3f|U;MMQc zVPhEEC?`Ep<9B+2KLowC6oiZS_p)zXk?WQm9yU>q}GoM`C! zbLUUJO%(XR`$f4ym>7g`jRStEs2B?fSAd3B{t`%=elN8zx{g*ltGBAcxRo;nAus?W z)?W}szY1%UFouFm;RL<}SHfU#V!AF03%F7mj14h_U;(+g5xA#>bm$4!V}GHJ1;TkI zud^-!;}0SphkGkIdEk3uh{b69Bz6`H?{|0_GExsZ?w8wb*9(4-f{s9#LjwQMB#P!Z zG3$^(B-&0fWNpEapU)gWF(Y7oVUn5K-jLa5dAqF=%=`_v=0lFAmqEe2kiXOiwa^C~ zwHQbY#q?K7PcvF4>xZZwUOGNC!>7NKYc)RbpY^fefyB0Xm#F-i+`ggwmsGG9%$S$^ z9`fhDs4JY~zzhI%?d40P{81v}M&<$2mel_DE1T+yh3!s{cPg6diroL?ksc@+K@I5= zcjWnLKmHpm`NwBh7GwE->@RIUEkedpxg@M_v;LIva+u$G;I&5~@lBnx9o~e0p|H1u zI|txtg#sZc$2n|+9Ac6O<1-9lY)de4uYz)KbEmS6bJaf<&tmm*DkKxmv-8T(L<0u< zN~qg8e!|=b5SIPvD@w|))q`3Lbq*EBv(1jg#)<*#wL&6WGlFfkBf~R55~Mt`c^okj z^nOBpVeHlLz*!msq^7IHH^)-bFZCeZ%Ur3&`_tKadm6JlA3)<{FTN{$3Z!vxNrgjh zM!MglNgu9>1>b``U*)6?tgmx<0aKu<0MiUYS}yTn|Ff9J?QZ@JM9{r-b^QJW_UK}2 z$SqgW?)(_K%e+*n_8&0oO?z>mkx5q(K9y~9#7`B=z?>VOp&7{5CX*iR^Vt?VNRu** z|E&^rIyL^?IEi>olOLY4zAdkZ*wNdI(@o}w60E++q_cuPb1>Hs!lWCt^rP-2llH9( zSiLfoHq&?nqI`Tc4Wg+&W)|pF#sRee@ z@zi_v;>FZxPb8ZP2u8M1UJxV|^!eaxCBTD=m9Ch);I+ zpptHm$O_L1BzY^iSwF`tbD?o8pCfIxVK%W&bCM`HBA|fwt z+D<6yGTRS)n_qm1HAWDb#&=7VJEt70I4h!8wH2Kq<0c_UsIZ54!DBE-Kwm-&`MV%w zkm4s?mos+u=H~TjV2ks5jM>^i+~3y3{#yErS?+pZ0#(ZST-%0ClYX8H5+wYCKSJ z#;blX-yh2|c0U8k2+>{8rwk%h3ZSVVcceg1LEc;2prpg6kW6G}_h0V%W2cl+s?}He z!t`57d4b8+PrY#4aeKuZ#JKuy1Q}xkvf>~0cf3oEd9pZ4wdTsZgst8}`r%#IlzaL8 z`983o{iFVv&VC5z0a8N375ol-lOqM@>FS~mf&`feav?JU=^%*c*G_^k9s)t`==`*) zoY+Z=hP*f@Cju;*2$ykJr;2Y^`EsoTnWm=YZfMVH+1iHN-O|S@&j7To#xtcgUf361 zq|R(p1fHMGFT%mbg6xR%KK!MAv9F{H19U+yOp}&v>hb+S(#uc%@qyvY*GlpCRilxo z&BL`zV2}3~Z8~ARk~VqR*Naz2K3z0)|BivIei}9A$)YIs%U48pC9(J$B1~k8r}vC>9bV^7pYtT?WIoD#(_X z;b7hvTqlNjsgI>BWo97Zd@12N;MXN*mellq0ARvpt8aNd?r-QG3dz$pAO|yxi|O1?Aq+eaqV+C{Q|CWKIF0w`FnXwThgJJnps3G zE}fvhu7tz3JvOd<5Z5%C(~p7_@7jbEt55}o2{OmeG(V}8j>PyPBC#0vXmM3i>04 zh7qK^vg5dB7dEsn8K^lBREUS}8CSTzH%y84m|3~R=-xldu^olfrf|rSD~Pq$m+M2U zKW}PNEU_s9R+iocdbjjYb?fkG0Z6d&Kr~jMySrYJ$W7|c>C+?mv*0B}BcXyHJK+Bq zR!wZ&57|4+59MbZ9id*X;BSDgJ0p_!qDceD5U}kM%*Y;s2h^{rk!@wL-$61@B`1Cv3)aNsYT_VEAGwWv|S+G=y)Vzw4w6hO8DxsIQ6x~>D>l!-(*)G5VT_0&EHQ;2M_W_!~Y4-Do0YY2rP=- ze|CWC*(uf|^e6W)kTvo7#t$|92$^?Q-D z;>H17?IiyAnq2gebwDSrx6`0>^XmN#R#3ca9FWnQ3`yi4&^5EUo3pqk&$dCT-@=Bj zzMu?STUESz2$Dg3WL|~Znz*p28rbbmkOj{QnZY3*4W3eBK#B$Q^w&MCz4IbL)!vCYKAFsBD z;DHt@4<^c9Cbt??Y5{FoKwJJ6f3*ev?nsBd)4ZPj(8k1~1lYM5Ci5>|!rSNQ2lRq6 zrnBWd@b1WM^q#acmTw?qI$pSjk@pMw)<%HNZCT4b~a7)u<}^5rFQ?%DM{rHZ`;(>{EO8K$9CS z8z);nqLPw$c!?;Z=d^>K`=xTi+0j(aG4zH$imMa;XX|{|ZkNny7tr++&Mq)cVmLcv zGpFL=UYoqc$=5_>DHb1D@>@cbCGT5YL#v#VuYpy3LrJAKX1^5F3y7cx63*O0J=E?q zS1hdfcr3^FQ8z}7zZNs~O7;!n8JUmeSxKw!f-mDlXJk7!_|JKe1~YXy}_5NV~)v`>{QFvIsh7HTUQMt(>h8MXOSo)kUfgVnBR=gU|&sLR*j;RybkY9C`7v8tH^8xRi>$X)O z=5sHBm~kC?j~BFj(H>XX_e*`$j$L2G9Fu;@PTg_%yBOY;xrJO8s4{*K1{D3<82nYQ zw=f1=%+yPrWAJj)dz+JZz8UK zRe1Htj!i_)aFBhS^M0O{7^SU}j9CvS%neC0y1pQw;~>Z-^^Y?58+RuB@u0DA!cOl7 z0Y{+}oF9d9KohpJ-M@hZzi;A%fTp_&K0t``uBaQ*A#+C2Vw7^6^ugoLziVyV-y6Jk z`Jb-h8)B~E8_;W%W3U!fVgS1~8F*u8H0aeX(pP27rZ0P!A1JkB%|BfKVn?wrXuj<7dHeaTD4a4al& zmxPP-E_es2o6X&wq*_%y1}qN>k)NtZV-7nZ05;Qre1w|m)|KMf_xzb2ajpXY0{+Pu z1_AC#$LU=20Jidbe1n-MR)v0wd}t?g zT!di1Wh!q4L>QYhTPC zJG$YM7J0yMrQc=zVF{Z1kKY@V@7xX=t&H=#hmX60&X#rFyJ>;nI2a4e1to*9{!nJ5 zQ9P3U&Hh_vzey)2j42J19t=5Pu;t98?%gJP>(Cj-fJ%tAZxRJwgAv44I7dNQ101-| zEQRFsrvEeV-*0Mro^}1c>7S~lTBhGicTOs38@2?Z2WX|!ODf#{g8uUZ?~c2pXqbyU zlrxp>iAFq$7k0);y_^YD zS3VrdHO$ctisM#!!|kMS$0Mx$0$i{KGwoN}Hu|cIpE-jX+mne!K zt@Yx5NmW_J+0*7$jhQ_jThE(g$}<7968KffA7q}^HiP-ZP&^oQJ!afEkl(BW_agY> zU>{nP)}{f|I`)$iu%LSp6WVkJ123q$Vkoe-tpWlLFl*c4A3Yx#6Y;PM#zi(vYHP)4 z(jC5o(?b7F9noRs?F);OGbiaw+)4%uP7PTZKw9qkXZejwzpkwyzL59$g$IK~CyAc_s6 zbzR#0;h%sv%t;t4fk#<*;BFR2|`X~`B{hInaV;hhAC~*L>sRgSGO)RMprM_7iklk!3P#q&C1^u^pgmt< zZUa67Z!ki8z)HhK4WD0D70@2oy%l&&1h?IlS*XSvzr1W2TGxRi)ak^rprZ~%!ON^S z6JN0V_~r*m$j53!KjvIE6V&CL6L&pB=u7|qx)a4lqFz&(?w2s1DvQYcTZ!)AhH@C$ zI{x9w`#bRM<`acF9D0|Ewt{;m zhqC+qkkc+*nG47;LKObsl-*hD6}X-Cc*4+i47>P{&RyX}Wff)iz`Xi4qcDSKnSAUy z=syEE_OwAy+}qeyy5?)I$SM9QUACUs$vdm-&ib+5E3o<2Guw;D=|b841-qWx`7}6n z?CAx0)&TMw^Xjt)RcD8yd(A%kZdI)+(8>Hh4*`faPalqcX}dHJ<(~G_%lM%atiflb za~)}bbvbwSeAH+7`+Dk!ePKGR>pAarc-h*~lh-*e`e2^zA8~m-w_}q=KwJLMPeF$) zjF*5bOj9E8+mrrWLqEMAe}L#Upx*yMXp_t=(vnAY&QU=g;9z$R z*)ZT{+e7R8yyC~I(o?I;n)@BE&g;w7y70eZ@?8e^@2bBGIBf8+b8PKr`jQeVVX$|e z_2+#G850er$sh>=*$27!e9f?YrZTyp0`1vm>yK|Qjba2 zz<~*79tu&4i;#=?L<)iPf+MMGXAbKp4K25?`97v=i2rpv@({V1JBi!Fp zw%^1cYj5r7?Ngf{#YElS*q!Y6eQfGY=XoE?suxZu7)jN5)K)ZG3K;@<8LEtNz^v1!xC zC_3(!gfUmax+3V$9VfHb9r4Abz8q-Ve~d-&uyX9IWQ)1N;Kw$F;QNbxx%T(ihH$u( znb&bAGlAO;xP*1W5@;&G0@bS3TvlgCdfc1EwGL8Yj1sHzj4Wm%HN;Onk!#7+fg);U zDdEu$e)*pGc7WR!%}0~3fI~XY=AV%}a)|?lcv!m#Thlh4k=QOq8bQSw!2Xns*|pjc zLt1)~LDdu4vvR5=iTg-ARKN#hm7jn}0#`SeYf0c*M>2S`JK`UqF!W+t@i>vi*;s0S zQ51W<5O;6siH$4i4>u27-6FmhsT<9We@R~m8>*00sp>rhLOi*aB28z9zDt~FUpJ&M zWY*qb<-z8j$kqyDK-W#E9v63MbZ71dtCLZOgM{m8cyPZULv3+! zMStdj#=8mEhuxP*Axr65?6GG{h-Jq ztGNefVTM7>hedg`ruG2}XCq%+zoyv)59Y*6@IbTXASa&Dk8ya@)B1NAv0R+6Lj$;d zTA{0IoBot3&=mREBDstsSXqS~&1FKgsipK|KnWRw-2YRT5-H&KueuaJu^aQDej_d1 zxs^vl_z|a|SJ!=&P6gkLW#*M;3Ri&qCNe~Z41;kOblnht3GSju`{%yw!(=>LGXR(s zGGIot&GzIB%_O*7q)rzTVHp;TB;U;D;U4`4@2=`wm;E4*VdeAY3fuvcM%n)daujvN7F7Vr;uT%l^l#h7i*{)3#@O}RL}z3{y~ z$Y+Oa43LBh!VSYY5Y|bdyj3rh#w+TJuo#c4NiIytZljs!V_hbuKd3p6y+<$+lw&q8 z#)ozCwQxrSigL;kg2&M4)(B+(wS=Ln+Kb2QfSd2sJ$o92ZLQcAap)U1P%Gn)**rhH zTpM0-e0hpO+VxKuCVNbx0dghe_4JjT>X+bKP}%=!Ak4Gl!NvPaoMAq!+qn(d5A)$y z39_F?!`+}YxJR+p`YOJZ2{wQ%&|c8rjWI{9yJ8Z|7HNoBWiV@Y+-DrE6B#1v^YJ#3 zzQW{R>8zNAM0V~|3ZNS8i2Bbsm#{IdxcOK8yRNIRE>Xid3eLGuMhbFLc&z)O*HPl0UjJQQjPCFxt78S1aqgFiTx&G9I+c|MkeiB0 zPp~ZXQ*_*aTHVAgaLK3$%(MDNB^rE?8e>(zO#QHSd4a;JKC|E<@&J+`VU8;eA^gxO z5yy!>?2jfNhB&~<2PU1TJ07uTUrOoGeJK(2O4I+I-D!jgQalt3vO>5Ij}s>6I|ym- z1i9;1wco4AiDLf<#K%1y$UR!ZJfM6WAVlSOHF!3j^`XfSM1jmU`RHVeNO0VqI@v>! zlUxke;FHe9OCa)Eb_%Cnp2DeCq;O153hNUA_mOQ`G-cNUzgne5{;fVODADQt#;iE? z?B>jl8d5pfcE`e#3<2Jt_D1WaQ;)TXvXe_i;P)lLvpVg;MUdl|@)*9vhdICev+WYf zb1^x79O3CfTTaJIAa;fa3MSxT<{XmFC|H?=;|fN_3^dDGx&B0)pIPjOt4_rA0ZVc7 zFb*;nu|nDKeqbenmB4;DjZ=@{u2134&0$s@$h>tB{Gld}pny!9g|Ia*CU)EWwNAcqwB4qs0l*^*?mj8ngAtDm=_$ z?v{e}(q~T0(YQVqd;RS$td_21h%(hFq}Hpb3yY>Hi3JcL8XQ`Ix>&F$P?`u%6mYUF zTmM-#gewY~oPgxL4L%ci8CGH=p32>HRqsZ|tIzfDXYCJTZrjjRc-}xWrp=jIg_zA9 zV%GA9zQ$tiHH(RBzaDNLX0;N&#_g?B=?JiKdi`*{cC6ezQg&xw8=&$)wyz13Iv`Db zv^g+LLGa2+1J%Lbj)F15TuYsA%h>32%%KNX;|c>sTVBMr6CQjse$a!lEFjbsc$G*2 zT2SQvyRLUo)`|HKvg+h|6xiqINdo)q+Bo;Z!8EaI=-lqGMeN`okfU$GyO{s4 zO(k8I5sEhu2|13u|2E^5CS^R3Wr)`jW;bHlT(Xn_bWYH&MA#O7J>h?=IPUu`Dp%(B ziUnA_tHpYzV)0NWj8i?|na0?sOzlBizKLmoHlMvc9^(0=v^AdsRBR2U_cwkfXJyCZ z>>fapz|UZce~v4_mK2zo55P*?m_tCF`Mu%|Hq0jsVQJ;1+@17@xPUGbfAB8SqI@%E zCO&%en3?F~If4=-jw{4^@&^iiJYHHQV=Th96hz>8l#ls0er99vc=R|m_b~qrejF=9 z@(4?IaoF}UFNQ^zA^BdAVMO3-(Dl7m4y}6&T3y*ii!Nd*kN-2+e~dY&&5{&Z*n=za zcg(;nABLX01#vxIUB1B|nS0oxe%lgoq6uRy-=hO9?4=(rcJA7L(e~Zg-L#nE{IgCF z@k%zJpTN|wl8Gz-f8YWUzGxuISF{KOGT^GTuuthb*!O_IH)8JM>tu5N|Ec`|Z4|Q^ zCXz)n>SgwzJF2|yQG#`HPMP%Xn))D>K zD-iVjQXu=U1lllT_v=^ivH*u~ot5xl8lr2a+ zh@=yBt5^`iA_&aAJz8X+vge1YYzWhi-Ffaxzec*ejlBDJ+2SU)VK$#y5;uQ~xLp}k ze#sjKia9Z3rbU!AzrTB33UAeHIAf~N5@`@=1OX#Nm z6AyRFyTCi!2LOoQLq8VjnVDJ z&J~FtZNWlZZ*A=({@}2n-JgD10_V|tRdds+16XUo{5yRouA&aB(|L(Msm$FqO9 zd}6`jSI`P@i)UO+K5-~YBUD#VrQfc<;)>5VY@D)o&eLLidtsVd(bhc;LXM?Giou5y z!b&7+zK6%Mob z_wfkYz9q*;{cvZFRMp(;AuYO|+qKa#Ub{k*OGYGYOYQ?_kDNIE21pl@R2&B;d!kq2R&m_My<6Ph^(?Mmy)lFn- zt#u`a70ha6^>X4(1X%Lc{f9`J)EO{*10(B+{5E1->r{Rlwy-@XirJQGNTki48E4Sg zsba{Z*Ix|#^M9wh*P6F#a~8M6Svy=EPr4YFGVMjD{-dGhd)5n_rCNvliq%YpMe0|q zdWTK)yfa@Ooxj`BpfS!uKM7gbWSFW=djN_BIs`&pB=(_{rf(j02f6b43HD|>cl2|C(9gO>O%t_Q z)iY@sO`guhXC^|(XM7{bw~LUF=H^tU%H~nH6Y>P%0uD;T7maBCAp-0}9Y5nTNQRV!Vf%f;Ps*_(vg zvj44p=zr$(8DQQIkrCZn;o5e6u?|*^8d58#HyS-JSIi(I=CsXs0tP$tx-nkywsh|& z^t*mh%Oq{alK{9xE~AocR5AZ^eaUR5!T-siO%n1u3$8Cn*gOYT#MMq_u39(js{|fr zaK#U{=xbJ!w6|>kJ!oIsBiS%TyR^z5`oA+1)^BqBd*qpZs;>><$vn$h$LFt^Li?UBG*P76=QD$vA3HSvYV!pC1h(FSp90FY zi)IZInaVTmcMSeaee>8-FQDLKU|YYK{|EWZ!MF!Cqsp3*Y`{J-7y5iJ?4Ago_y~$8wu%xQ1&NNteBs~ zD1t(e07)gi-mE2EUEP?)bCtD^Yb4;F1`(VfkW)Floe&J1snlc|s|9BP;hA+WeF_6U zM4;!Ef{r@{o^AjN_E0}vt04W`N{R;aU+OB0!G=4jI=_qfv2iO}-D338xMO9Gt(ul$ zd^IS`W&ea*(q}>^T%W(-CPALbPm7SvBbn+VX?qb-W(YJG$BOec#@orLz23coo?H4b z0`3Pi5cop)Bmai0SJnjN97Npguv-yu6>L`^tcgB{XLK4W%P{i^k!eUon!VJIG=BUO zOn3BI@jgf=)x+T_M650|!9@QC6XK@)7oL!>Dt9fJG&Po~E}h&$mKn@bjKi3UBBZYD z9pBccMObm8=RrKHUDMA5?!Rz^e31e?(D_t5K<+KuPcQ8s$bZ!|!)J)HkGSzv?cJua zOmziWTlJ2(p?#osp>ayV_l6gnXK_=8RBX&KJ<>*REOSif_*qhmzf>yG`sc-%cP(C4l03=2a7KFR2+hU%XzAYfRB_*e&=mguJ|+-n;w2o> zh_nbQBwQ0tTqw>wZuDZ0o*}kM&S?zen3ne9uUZa#>sd4eIaFWmM%oP*7FppB|2v}7 zI&Qf8EwQv`P2mw|K zZa2K=lG5uN3_irn@nqNKW7vn90%dfBTW2z%hj3y7! z*xv{-^UbiQ(r8|@xwv^$=X|~3vL)|#7>Y6+4c$GU5LV@I%({O@AOKE(40B{tn?IZ2{9z6XU=;` zrYK(zTNp#Gda!;fzqJ9T*Nm@WrWGMga4Xzy?xP%!9w{>P(=MvGA6RhHcrfknh>r}7 zd@bGrY`&Td+xlIY6Ti7>oHRf=*r{oI?Q=a$I}KG^zUhKurGorirMEx>H0re6Oo2LgIr8vvt`)71=UH#o{QnVNulI=?(j{_}9Z0 z_*(J9LeZ*|3w0wjcj}|tx*t&%+BCkHkKv(qg<~g_j)b4)Lpjx|OVj=feQ4v2{0MFQ zdgb6Cv2HG8hQAi$G`q@L`qVInY2IzTSL4iI*WINuH8b(~&nvbsN%?yh5?|nNk0Mq! z^9okagOD;-REKGj@G`4!_P?u>sV*s=HdKvajE0~M zca2pJv|aTXNUU(CbpAVQ=Nv04XsRv5{pT#3((Ps0_sI2JdFC6}*iK!xq&{hIve_vo~^ZzPfgpH=juB=X*~urfTOysItiPgMD9rWZ~cLY;MwlD74wt zE6M%OaEYj>FQx4V88mH zz6gTBulS%QnKlG)wOM>FVTk54Dwmv2CN)il_k^R<8xBh7o6iZIsa{W(myh=yWX zbVcv`B$jR)?hRp&h1ZRA*+y$0V}{mQ!r!IQo*9VE8#?4$4G zCC1U}(z+>Nd0-2cqC-$&)p|o0|A+BR7pEzhKa38$<#d&@#UFOYwIZ&UA(K%eJ0TuN zRblIM<7{n|W*luL)5X7$krux#9}N^n$~0u^jFz!Y={$s$cgUqF!_201m?&Aic#z}` zy`1&7Z3%vG5JW(A)06!@7h7M`Ezyu^`sxkJLYNnG|A#i>fI8IPE-Cl!v%l-jnVJVz z|F{=q+F;Oc&<%BC{--&=;(0b%@jzDzakDlW)1(E5DvZm-jDh}56G1tIEBZO5+`xuwQ(@H4yh96IaIf?~ z$@I?H)(nUfOBtr6@&%2BnAZS)VuC;DApS+SE6A}o>swyPY;C+QUTBhQ9oM`Rf+lxx z-;Bm3+691zbcFXC3HU$A%q@3Ur1FuvXGRCQ+5<}j;WdKaK{><{<(VAZW;A6$Vq!xn zjRyXDYUJyQT0qQvYneGI1*Vv!$uLKppLtW+mom6=4NJJ%zVOOuVg70P!FAwDuvL(8R7!N)W^AEUJ3ccXv5TYf#U&YE)ANAM9EU7B0wUCBwZApe!R*?@8 z0&B<65Gm$0*E-A_^f6x)VzZcY5l%=?&5G`L1X)^tZwxHj3DC}rJ;BELT3P9KKUm?4 z_m4_b`F!w9S4i7V{H)EmKpR!D(HRsnwcC?IU#Eq8>pjIJ?PNZRvM+`l2U(0h`A~(N zwmhs80$;hqlwq23e=3$x_NB0|%F<4Sc$2T+K$XAsyqv`Mph-L9bi$jO-==YWC!3X4 z)fLjBR6}7}!B@tdRFxPm6>x{KH0WMlr)QRhy;-0BLdNplh>&=$wzptx3VC!MXoR;E z%^y1{+vHXcU|xw%iPbD%Ys2xHEGX;+w)3wWX5`G8&UmwetS1&c(=4LH3>!YYTM^1O zxD!F`PC_QKT2Jv}=4f%Q)ZoI!yDI~4#aY{aZ#1|t^{Xrm7yH)97~Pr|A7)#}pMalK z^|A;IIBxG(mg+?2>yli=vxxSrz{iyiWB>3X{2}U0d1+d~*VX%nBS_vGaaeKnzNfe? zM+rDYJk2`q{^54O;VDtz%6tJhbbJ6DIzP;|zDTid%m%^%kRA#2QYsOh&^d}hZY^k=aw_7c6ui*dSd!`s>@Tt_FaBq z>9Axx)4PG#HsAJfp3pX%D74L12yL_S);`SbT%_$tGPbow#I6+DzALm1rJ(Jz6(kT| zSDi(8ysB*k`QQz7XX?zv13VBQ{oTm%N_QQt3u~O_yykbuTXAjd0wxF8u#@~X-9fwZ z1q=XW5p`vffC)2W3pVDpeQc?|&4|MCTWDz!EqOKdVPEhDJh-}?-NkC?b>WxnST&yTXeYg$iiE3a;{~R zx_*_Xs-+$LHsxi=`dCIoiJ-p_qyCWY;bf-ib4zu3IwjFaj zYyEO)U(?k5IdmGmHCj>zuRv$hD|}NnTB1v5IB2qh7Ol%gKzH?Oeo{D{TlvO5ul%jy zPucpcqHlK*4DXlU8^_>dC1tqX`Txh-bHFuqef{!A9w1=cC?f$EBGZW=Bsfu-PF#Q+ z6=Y8t4@Xg}hPGO@4&tcQI*6^U)MAFV(8 zmiBf1)kRZRe_^5J992$3I2ZpW9VAw-4qzS^uz1Z2V!@-lfa?-GEJ_bC=03vKY}(=z z`t;8)$|pjfuD)3NK)nvQ`}c;PxM%ZM7LPk#q#SeVa_@tow+Ccu4SFnS{n5TCslcAO z!M}r@v$f{B3LOChM?;+MPwezgBpf}O`%xUU@_P5r>S^^OT?3F^aeR=z|7t(zVg=|l z4nP2*$|49Lfy4$p2O|>bHr@&XKN0s%sNr`2;V)iS;@xb3^x4Lbz#!7}EK`?szlLA5 zYLVU(76L8;8X)ip|4yVHHW@?DE3?>xJ6fv-6ap-Gm|X2xxS(S>5upwPSZ)JCUIIc+ z+rCuV8eD|X^+OKbUmj_ACq~wM1Qw8S?RetZ@E^SpQz#~3>q&pWNLSgNK?oyrSw~@y zFHq%-)x)jwH6RCusLQY$IqNON7OS&8m|u*Y(YE59dTu>};r)7!sWZJ?Q`{ZtdXaEy zT9E{Fy$Zs>41$1x`V8jSW~||SH}Yspf6;z@48E%-jQO$v`|GSZhb-=>SjL58iDi~Z z<2N0B*3iwU@wY`;zgy#D*vDj{MB~Ed0%dB_L8z)9fsqMaRG*$N;FfW+clP7MeN%tF z7Un5UfEN06Cf`EbQa~f7(9c)Bn=4a4N`s(3`f#99rM9eh4lj1iTIClOD{>eCbPAY@ zY#hKZHr_!h*MpT2yJo90-@@XauGj%oO)$#(PPBi5eUpXko2&X+(EoVB^#kS0?ZqI4 z(b@Cvpyk+}PYTqP#gx@S!vOgLHwMn0Pe85yu0=TkB2S82Y9>HN5J~T8w~_9!mWTem z%ifh}Y>c>mqC7fdH4D%^aqTZY!fZgesYmiJ>g}NCU4`ei>8@Xw?TPOd_D-K`dd_w8P@Fj<=NE*BJ)Z zJt)IhxClpL>eX^Q+(qb(sTVW|T2|yX7W#3Wf??JB#{!U0o8~cFjs4&~qT%E6IRnw7 zItJK@7hEo1gtUKTxpXwhXCK*P{;~d`9kTS5>!2T=sFIE`Du>dANHEPYav)@Xrx1Yl zul#TygsmN$i@@IF9yo1~SUh&4eu;38I6>_e;^oi$Wm<2^-5kP4PVR!U7!O>@qvxDu z%~P42qfG}4;1NlO8ez!s0UUf>Key@zWKXGozg@P? zLMu6=2X8x|9$|r^0njhuAzU;(26x+Ge{I1OMZ zjrvra)n#?v2kp_1*$OZYM*YBpRK?hVntYb9Jg8C)Fb@&~y4{=z`$lr*V zp`-!RL?LEySF?&O?qDxnn0YkM9vI?%_8RnwluyG$rjZ|DZ#jFrh1UH^;ab0!xtnyg z+tsUE$~Dt-d3>$VHi8YjV5R87{-`}JE9moy?H?%{&EEQUXE{Q z%C(TyIx+?7Mvz9})k|2{u)u&nDfp#G7z+%^)t>&!LTsz@Sj7UN2vY&?kw%~1enihU zTM4aq^!ObZv1U0k3pn~EV#J2>WWNUcU@VIJi-p)l75X9it4tomek$Hu$3UQxa@=A5 zLyk-TPE)T|R$hC&LA@XcqCS7p07!zx{ipgkqF-SsfFCmC%F$X#3##y+J9GG2nt*X$ z5>EuZ9nPJ9psW8UIdk%IF~}K}k1O{$7+mB=g9BLME(|P-&}N9U(aH!yE=NCvc?`pl za%?`tt9p1V=Ed{EDu zPLGk}7cJw3FA+Om=!T3cS?v-u?vS+v909Wm-xC23Ev}D3S`E|B$_2y9!g49(;1#lb zhyJa5r)K;8g8b8xxtzVqczI%vCM9xEFYV{2`G(z*MWKGk7<>5LUW{3JpVk$ z{*WvO8Mf-vc-tm!HH>$l`Arp|P0)%;YBN%5co?6@KV-qlF@6CFqa1pRi)=ha9JswS z%F)C$lJ`MWe1e_XCeQt*vs&f(7$G|!)ccd1WW5M1Yb3?AI5MvE{m~Z?XAedd2T$ex z8qCo(mSgu=sfRw$-#%v3x9OACIhC$)YrnG4Vq6`}X1d6#$94M^m`}eLjcqvkMMmZe zpZD=T{*f__tS&vjiBNcRJQ(0NELO7})BI%3)H>}8X2BF1PiW%qg~5c%LR@!cEf$Y3;=#(J>#L8m9?Jo&0sJNjR*dB;>9@PKhH?*sksb^BYj zi6hcu%+sPRQGj|?wlD&i5Ef-})u75@;7dLMYe5j~oY98|!z}TF z)2?WILz;Lb|0#rV#XZYV;YJYo4ZWmGI~y(hfd83J$39_g0inZ2HI0b}3%f(DH6B%f zY$~*j;|1dj#SiK<7~i006bx_NjH@}wzLwNFO7yjnXFwCi#`sdAe40AqR7Pr}xR+se`x}y=^!-mhdH*bW#m|x?^)b-()nLqVo zG=2D5lZSg!*S$2avu`4EU4)q+jz2Q%3NUoT#v0?nzU*#~bxci-XDwMW58O~;Ht6?9 zu;xKR3<~(WyB)^8eEDLh@4nm1wP7Mxp_q=y=NWpxl)@rXQ?o`dS+W9u^$z7h?}kvA z@YJdEYrp&M_(JgTV)WO6{5GNYUG4FXp)B}sqUNf(oejvnMSpC;>ooZ&jUDb-V_%c| z&`#sVueGo3^acFiZG!b-c$1M|3iwOa;__{w<;(YGB;7_=R>h)1nWWiza_wBD>)Yx0IkqS8F9>_Ymr zr9*I`bUYeA{q$-FPHt)GSZsS$wK>BoEu9X&z$Ei?LjcdnM@Sr8OYJd!YGz`_-w7$Q zxOaSDVSI=)Ha`^Q5d$(skjKLg&&m7zu{0$>pDt_v85EE8MQK3~Oyt?)!By3>a>~PU zWFhT7oJ5s-NLtuX1P9<6!N9;Z#10c)zIr12?uiWWAo7k+NRmpl2g?~EnO{4j9sIyz zG@ktqz>TfRsOk;;12EOj0GQNfcDPR;`bEK;AL(cFQnTw821{P0n`mZ_+a? z6EByV91n|p1;Z=YfsZ@U7DwOnsXi5+_H3e?WK=HVZ-jRNTt@zOUHEtzot>gs^7f4d zJh&=!dwZOB#5?BY21cgT7SQJUbO}uUwR`ZoAiQrk;vEuJJ?MD3q8-j#@y}ThED3f* za6mdoV<*avdUl*H%}^YD`_>8It=-lR-tH9a(}(crZ^0^Cvgr2mBrOj7ysEaqh~thp zZ9Y2TO#sD;f;cO=X-d`bK0phUZlW2av+$rT>i_+i*T>lz;%v+T#@cNNMpS91w?Qk- zkR6S>SD4mBdrIc7LT&MSB`g;2UE&6)j04)g_X39Y`k#Cinc4(E0;1r1ua2E)5MmzK zs>uk?4m=~C^TOk*TT+8j8)#N|P8>(k{tIk)>8R;6Xi)n+d4*Ngri-hZE(<@9X@dAw z+orz~b_Xjmo00(gw8aN5ni$-^uBr#p&%)zu4AHtIL=VIS+Da#pHd^LXp`=sbbHNK*0T2Y*Fni{f%VbYxTZ&2@(y!{J@$Y`r?~_$d3(W7SzrF z8>uhIWBxw{Q!SJD%HCT_Q{5G5G_msJ7`BqUgXjji1VI-3Fe z0_iZs;ud2+O!Dj$PF&TIRHF$voLOC4V5B?9exP*9`v^|)AL%FlBhYDlCpS(Jn}2#f z?$isxHG^~-J{7!`i?xS0{>7-@wxc@^PouJ~H+KRT%h}^=n6;SMB{cywF~KwoQCSuO?(G&%qWM zW%H^}lV7c}`P1|+oYPxvlyM!A{QZ!;0vR_qGUa%VE(wgVw{$AfvOHCyDlU!_*uFfl zCEh2`pS;Y2;%cQS!SB+5NV4*}K-eWLynWk0K{gt7%i>SB9RfZPUZei0_+aa?Pj5TY zO~-SZ)83CtX!?JpyHRgNJu3m7|6%P7#|GYn^#gQo)omZKr$EB~Cp>~G-l1F*H~ z(2wKsjq*OolZY<0%1goz@Z@H~=2QDjn_ci>QxE9;27DiF??>PR$@B&-K2Tnj`tcqx zl|N|pzERc(aA%iOV|w``p#9grY_xNtdS!!+{edw6vMO800k+I2&Z}{B2;jA!J?=R> zfR$Xm@y@kLDX#c0qfP+Qavv@YhIhtCoAKd; zI!5}SaVF$Lb3%xhzJMmfRNvgVwPyZHMf0?jSHyqBp zv>!*ej;#HV@$B`kd{(FSBs@16w$nFwXe&0}uGG0(3ed+Jjj`In>;`QGaN-ckBj0s9 z^|CSSHkF$8BnQ}=NC!rV+t>e4>Nqr}U3bKgJ&5|khX3u@eKt>+ugIf`>@@c`ADn3rKM9SqpuI>gFhE;3=pJuR zYqfTdclB6^vGS^3=r6AX$`Jb@mSee-lw|KYXNOFdob;wy0cR6A@A$IH5!k{A`!*x& z;|U7f?EVj+AW*nTCz9TlRtR=PtJko%;`{Y<(Hm_1b`OJ!$1?kkV~t?IH^rri_W;=n z|7g{q%fIYQbRARk&7<(R!Id!b2#OnI?9)?`%?9v`5y9cO_6J%p+Ag?;81lssqs09X zVS?N2Kx3I7WTJ{3;Dl1Rfe_Ioyu*UC1JOztVT8UU{#4%jSZ|?{RQ=oLap!p0<1E+d zr`Zj&E)V6?;q7D@Cs`E&F)>jPhuXHJbOE z_pdwxikjaIJ^jqruZOlP&#_Dt$>!8i0 z-DsSqT;TlEz@}K5<+W6)+kTmNt$D5a-K0(<;ZsVv#e<9tig&Vm+6J^0@35Q zzGfJItwO(M>cM4Rk5Fb*XEg6<-HpVdW^$>wA%^bxM0o-&+qsS?G~qo_pZ{5XzXt{G zufS=|le!mHWY9oq)>oRH_%(IuP+6{P;RpkGdaF{diWexpg?`c#8)aM@$p`s@>%~MG=Yo-)fW~!znvQuJi4+}thkPMu9-V2+w*%Hcrdfs>ASu?95rq0f zA9|f{03MsSB3ZY_RK>T!=D)5F*#p*gcT+4`UK@g`UKUPw>hiAEJe4nIST7+_rLjr|Cwf&%vbi=B4l&*@5*0Qv+@Z* zovvGR`?)hysX}uX7?OnmyBS4rFaOp_r*VzvD?9)Dh#OLeb!A4YIzpd6W9E-@Z{J|0 zCae%68>@d?eh$h%0q5#8mhpV9@uNhEII_klSB9wNx1|%IbQAH8V1&I&*P0sc#tZ-s zf@^qtxF!+Y@Akg~uHib&3(4cQv`AN*^#t&)mvD3%NdLZ%U0nYv2=zRgsjN+H%Zq%+ zm~rurOBVbuT(1Fa|D_GsF-&iD9`F;wAx1(OUGN?~EHh%2-|4j3AAhWfn^)^TiCLgV z>k39XpfV_;M~_aHnK|;D|8m7AJj7qmwR)LR0LZ5mlAKyKd=%CS1Ja3%5r$9Bo|yxl z?P$n1TmW;}&<+*Q_!G;>$a*ms=4@N@As%ea_ks4e)zx1xueB~f+k5It&#azP)f;O~ z$GkILY+U>U7G}*v8p}d5pEGW)qSLipe#h0Le}7jv z%LnlQpsze8EeQYaaNM6WtdTIO!PM(GUs55vJL8_w*rm?QZCq?_a(#&tlW)qI#qt+o zja`_@lSlOloBSo8QCPYcSUHS$Sku2Vb|VeDO)wD7*3@KgvI`^bz{_HJW?{E`Gxq+S z);O{tQiUC(_Uzl&&#`Y`Yzq`LTIHd#e*+Gd)v(12Rt>}Io;+#PhOIxab*7V5Ty*qb z%bW?%tSh(IW?}obZvXbcR$;@FJ$#nu&{;dydiBNX*3~rX)+a&gLk_ty$1Z335T3Jk ze7j~AcH`&Mw{N9x`ukL-56j*4O|gYu6q87D_&l9KG@2vN_RdF#ObI;y-QIKe!A`v4L$gMH z(wC%8*KTI|>YekNjIl@C`WotQ5aQHw>}5iGvN?Bx!uJcZri<}Wy?TPoccGj$`Z4rR z7Zh^?;O_|m+PI5tA04P3Gl>Z}nZL;-;G|e+7H~3TJr!`0l=^9dVU6xl^Q%~>ZRt<0 zIX7lf@g(#Jyb^fxWI1~LzNIut1u<1$#UMm!-KJX{TvHx7=}(JGC#xd^uUeu9{Ppve z`<$V!u&#~Z0N51(H@Z-k#g_eCDs20Wd@=9(!~63ds^M8_*UuS#f}iKtzm6MA(-5!g zQrgo*|IfFK7?|q6`|yd*d0W$a4NUtc{Xp)(?Z1pabmHsu-G^2dEYNnbdqE9tYjaz^ zna*iz_S}gderU^x)YVSA4-Y@|!`AfGP6Kx?J@muAZR=w<9of!b%m>;V^MO5M%=fit z^ZAlZvE>^xuSM;;Q@1v@I-1`Qee~&?VEFAx{qpABrN?8JG$IwyQxeHRwnqqj&xfnr zuCJ$UokIg+JR6CKgW@DI@Ld7dL94!Dp5Gk&>gN^q*ehL*bO6d{W=C+VDv{2M8v)bU z7>fIb;@4q7M<{{N4UNoK%Nj&B6QCxj3*8I~c!Y^!wW)VQf8s z&~KNj|%>_v|_PhS7&kRcE{EE$TV`+7+1-w*tpdlaTaCkPxv>*VxP4PSXNuw zPqOSGdAgq^C$H4Owed8`Gc*mBeK8rz@kf5}fIn?07RC;xshTW-qybK`b2VI=Rj4VX z!S+j1%{9cRQVio14|Fvi;1}O8K$Xas5)z%JBt%yq4pGS;hQ6bmC)qUKE22K0BRT^C zaZKuPcSDk5H?b#1_Sgg549Ol$msNQv?$8wjWSXS>dP1_YQ>W^-0s-aFcW`4oGzqjB zU6x!332A#8w`!1bJmtebP)B1g7>3> z2SUMHWRx_%wcvpmlnZ@X)CTwA9u#+|YpC3Gyp*MYgZOg{L9*s?iW_V$p8sFU{g)TI zVs68Sx+X=)sg-=GIS&@Ha3Q$YBEd70pDNj~L^a2drJ4fN%-0mrEG~G4 zRU|#fmf*8YIL-=dd?&e|7}&vyJb#i33}zS7WSG*bAEFbaM{#Rub__Tz(??)BUpY0i zh~kZa5SqFAMT%kSnpg6c2l9~Mvx8R1c8wQ*Ci4*6Mmlo(i)}eR;;l^J9qxRMAB}hy z(FoDr$h%N9Q9xz6kuM5}95okLs&`@Ibv6qrQGT5 z_6)K;z;9JeB2QFl@TDy(H8l$qmGw2F6_q-0?pCR*eNI&BG%xn+>W_gGkm6EZt(27N zq-<%ul(rmcfcU4)QkuL7PC_wk{yWP(>r0zdb`a|q$SS>M&qvEDXUm@VmQ}9IhoXT8 zp6>@QEh7pguCz-jUgAo*l#(T`gi9&A*cE%2nJ;mD2z69L=-1XdUg=qg^TZ-z+55<% z`GxrDgM|lWfAkUlMjq70EW?*OEhA%Au)#g@&2L}DZl`gG`|SPKL_BJwdo*(`WSPu4 z#lg_0YN$GD?G}m9cBX`~5?FA~>^kcq^RUM-R}?!F`su_Zh~qjJ;<%o-0=A5;T zbPHxTNYJdf8t` z$0;m4+T;e(nJnjR!I`fdCJ2eiH_%M87#)sSBZx_-c3~+bF z%BU(TS4(~8{+#DV_;YI`@5aq!=13Av_sn3@#f!|cXTe{+EnVQHWi7UedfYv}fjWe( zaTPQddAq-(c>rtB|I{6;tr??AMMep7AHkccl1R(P)Xyt~K}fYwe~=J49+KjOl$bV|tJ!Z}64k8d*MnJWm&N zfAc~)6;NcsaZ*}?4`V!*_@DH#buk>R>te2M!lm_F$eq+2+~0!pSI?J-{g|M+Mmw%O z?QYGugS(Ct|IUnIoW9>dn)^FSX_37;%^e6>c*jV{hK!*6vmd%a}0}())rXC%yAT+xMcl2O?|0wpP2L%G z#D?cyvafye+|XM%F|47tzIUO9=$GKq4Z!RVY5m*uJqM*7z;f~W)ze9%De&cMoF6rN zXnp53urQurudz&HyC5CvTK>!8q+8W=oU39A4(|o8+YRrb-SPMy7n#P9sgJ>0qqPgA@I=AvbzZ^uyF9?D1W(L0oe9>Ch%UvUR_EM$cgp)pnklCzNa=h{4qgDh-ggRZfa|I8KapYYG4K!u>PiOu3?WkG) zxRvv=so#^l-YlSFD^D56NaHLQD}8*)8ObQC{}bWJ&yB_kTd0p`SRQZkWnuA=tsKv8LY`&oz%3 z$XpCQiCHxVpHy5^`<=h0@w--M9L^cr41Ki~&e!#KZHd%cyn^(k5mL}A@3&olK8QR1 zRWOhdP4V7h(Q3S^;*IH{Y@@BqWshtctoTFijs0EcEh$_LUW<=(QFswvXAVq}ckMv;{h}^Cod^PGCdi7 zAu>b677XmPio#1FGU-Xeb`Bk5Lmiuh+x(Hv@J?S{$t7Q%g+yz~?C{J;nJ!)yIgrt@ z1inO65%#TEAopXm-Sep3wrt-a2HSXrqOO2kes)BCh5eEF@F=x^ISN9BrptIkM1V-A7iFa4^QwGs2 zetqWEFf`clM>j9UZ@SuGJVK|w&_|UWEbovItL&!JZj$Kg=kQ#)%MIS5MMQpG0VwfB z-SE1;uWYGYXbgKrszCCq3vHh3E8pX%N@>bicBUB zPN35!n%PY$90=o{;V$zq?paO3$j%JFECYDOaKW&RHs71#F0M3WNaj6J7qUI0$NX(r z$~e<;*MliXGg6=!!7e^A#Ob9ylZUPUa(j{~lNUMnZ`}0Z^cdXc#URN;Tk?D&vFUfx zHACSTf3#PZVn#^qi!IaR59NnE3Q zHcWy5j*Vvx&4b|V|0q||zuJnYA0xXrOp!&ok$YjOD$8B=D1j$?nB=ZlM0cEzcnkX5 z0mM|WTPi3yj8d*V> zW-z5KJBp6Kr&=t488ryCt<(aw&HQ$#OgE?9XSPf?Tc%wuskCK}te6K6JQyEQ!P-xF zRU}LlS60lH)D;n%U4WbH2lbAU5DsWx1_N{!!G)%^%>+~S@BThh(Xnd4<~e69}9wI-wpZ1bI35(0=sS< z8XrNs^5KGiFd=s)nIo#49z%fF?W}xvbAg@PrWM$AK}#UvAO1V7k7oYZB;W%-

ly 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¨$i!VO1-KI2+}bw_aYPrd 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 UkRlNI(C|#q1V)!Y5L(s$0OmNG6951J diff --git a/assets/flash0/font/ltn2.pgf b/assets/flash0/font/ltn2.pgf index 9b200342639e8c9b636a26d66f5d5e615d7c5f0f..bfd538eb0e2c57f163c15c953f2187862ceff7e3 100644 GIT binary patch literal 270760 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

e+`bB>IG+n-f(YkSk*i^hyd}P|yF5Yvhr2p= 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


8Ge=m7ts_&Y~m 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�wJA z5HG-WLJ}f6e=FNNdu9Mtd^NlK%VOu}=%BgY2S0;|VUsu*9}+6AoW*pdDe##dC!p3E zj4xWsdJ=h#IK8o(_?l2GxtU{+T7CU+hxhFLBnT^^(m4rwPH+wJ!<(}|643uJf_J7M zoD1OVXb3Au@uz5rDo5}IEsXWaEsXVJ4e_LYc4b$g{iKUyYek7bUqhVo-W<0j6PqE_ z-3I|-flzn%#GBFjQ-s`1e8fQ$jN3s;LY}uIDAPRCOB@AcY#XS6Fq`Yq1B7F6 zxy}gZz+Y_1nu=S?ntm|905xYnSjRONx0ZE43t0`T3Moh5%CZAw%AF~J4tXMRyP{uQ zPdHN+?J~V|5u@=l{v>1eEopH_K%EhDuQUv~!L0C(IO<2Vm1Z&Io8Gq{P(zEPgbg`P z)zFaUh`6cLNUwdqW2vY2E#sLA4&_>^y)lg8)L#K^v zNMSdyuY?oBnCJVg)E>YOeZ+pW=tQ|lVNwCT2nAN?Fmxl3#ZKsHIs_<}ANRsnP?5j? zb$ghj3UwKx2-PehK{u4=B9@TCQqKGlZdi);rG?OyP~z1J3}5k~m@UgvJVFQw2*;zO z9BLq^0{2i`p#*ZG*$W6Zi;_M3obYWU+2m)_N>k`b zi64zqmFH-)Z>gxBs@e|FG`D6t0dKxN_hBU!Sfz4*@@KHMkaVJ8p3!l8&3#|De+NPz zRZHariR6PQISXO4uE7Q$Qib%WA{$8@uH4z>hIBQ$i(w`8TS)12lvzQ^NXw(-!;{1D zg&ycKw5Lp~Xpsc<5aG95u!R5M_dPqY0+=bjBp*836uNzq%_QIhnAmD z8?4o+wu;Iq^+P(5Ybofa7e~}Gxy_H$NGY}c)c(W_8}Sk4&V~3Hbj`8SYfxaCfG;|s zfQo_mi|c|obStuImI~tV;?EF6!od6A2?H<5+tH&y%n&bxKt7rwJmsSx`$Gp)GraBm_-`n80`@QLH=od5ot*BZy6m=eDnJ+jox$c3BVId}$#!-MF`Ys7{pju6Ii9cwk;7mYA0;;A= z6zXk_P4=n@QS=A2_9K&V201B9yZ zGn|B{x50~R#0`U64&stq>j&|%7zzeqGt&SEpN0IMB>lnDs$}KPujNJcWB@TySGKjEvY=WVmZ2XXB@eqc7Rm(auC?T<>KOb;X*gqf%{45qPP%B5tG~6^^fuilvISx zb5FcM+hbhPJfB z7U+KaGDu)*JGNDo`dGPR3(P?6RC@%Sdk*cAti@4O^mZaXZiO-*`)Y4{3CLvTxu$Lc zGO545d4O>4u05GHa2o&qTG(cx7Y^vd&I(dP^?=YO!zfdIC@znG+B7 zNsaX$i3J6m;HanIGotphV?Nbc+jBDe`V1L`})792m(9lwpZ5ack>0t4mQmXNp zg2hwJztT{~Jja3N%IlkZQ$h&_2385VeVEUZWU6EN>0CLKByT#iLdc|hHtdrdxunAq z?epEO!FE`Kz^~f|CJKgLQC(F~*>%CzL~0HR@fugoL1`gPt%sKM)m)Uhq8&e%wMau} zbh^*@YN1cs4?-4HZ-J`B=~a6PL(DR=LfU#+LCpp)`j8IN~8vsW%|xBj51vOAEx0z4L-nRzyE3-p$i!VrX&Fk;1~u=gFVc}5A&(yorApai#(#} zXIJ?A-8A#z04LoGS6IR=@$TsmDy+YCwX(kf4O9#l>;Q}b{#Vn~5xUJfleV^#Ad4B6 zuTpx!6$ywQU`XV{z#yoh z@Tp`u2VMv=%Dc#vbFSJuyQxjJ1GF!!ga{=fcWgBQz-;vO-r^i+DH-R@^lPI9$?*QI z;~+sF)m0Z8FO~=jY0Z1kdq5+pW=6Qe(4qF#3JbtMnuH?%uON@$CY~ak0JUeL!T(Y!9KBc! z-k(^?!JBKI!yO;c0={IAAwcQSIK)t?31}rmLX`nwD98DG_YpsCQJK@99+C0yV5 zOx(@jf$y^rp+)05Qqj(AE*oRGw!xO!3wLJ%m*tW5gh`e5?t2`u4tg35e&FBFel=Uy zAoPdmsuHfhFqpv?1~Vw2U@(JP6QM68|GNg!GxWB%-fdL_(-Iz%hVbyEAv_E^P;F=e zesT1lTmI;;7T18(9{Thg3nfg4 z-EwjVlnsT1)wu**jWWGpjtU74`lR&xN)k@pzVYoITfy?Ahqu|a^bvTQNdnvl_e8c% z2Yt80@oyXu;E&7A52bKlgPRbfCW`!N`ML)tkR>T@Y$$s}<((V|H-#+n0?l59;$Mw# zz+iG}aK2dZ1eC+S?@N48=38v96)jCP3Rgj4$72ihpxfkc8u64}w6lvH+#wQnAQyIk z1-5{Ix07%k8)#M-ijN}0v!g8y&u%3O3x1FPZISsw9zsrH^-Dw2FoljXHzW;*;j?i3 z8zs(kxslL;{+y|0g%0#Hw1u};q{|VHUi#c1eDf-;+D4%KwZxCWphCP8{@Wp2>;f%X zPah2-lOQ*7t0%M1s3^Ifv6!zsS5wavn5$}U)ze83?ffy&8J{$SJN1Y1uhT-f^P;T5 z#^8He?G<}(4;|$IE%3RPRIrJ`5p&`^q0x~kKi_mrfT1||a*zWwG(+!CIDGoUXH=?j zW+An8Bh*TvG3se;a)Jp6W4AT=WUz^FIRf|A3~j^u!fdX#@lZ>SXhui4LFR8YvBx#R z5YWX$N?=bYK}yG!pn9R#;?xxKpGnj?|4gDPE1lau4COt8?`ho*v|zEB72bj!U>BQ$ z^;>|mAV2jG1!Z}IC~QJQS5`wOPQ_>VDI|@|<}sF=4RB0%+rA|Rk8SMT(&TZfOY3M1 z{WI6USPS#oUDb7Scxr{YFU}}A~AMEJ<{2Jr|h)m!A!pxYt?=YIRNJB z#hRGSCLNvVtHf@p?&>i0RM~WD9P3TAr}lma1KftelyGrZ{lJ$AngC>dGm0(r*R7na z-R4LiqeIKLxahX|YBM`Ac|qU=7HeCc+sT}OIii;zNPsgs)I^;s*0`Lp)=59ra5pXX!|m9GZnMv64+@R#fo)A?W+?gt6jh zE@~pM50w_H)ZL3ys=J8$8D`cVwdClq3RuD2CBRmYsKnKc;3p0H$cYFsA^-E*Q9k10 zV_zN!G{^E!IWvD6rp9D3X|tgvmQSYT^J*wqb98UGVHfe3Sl}t6y~*+1uD~zIhe^Zn zMfFc;W7I}E%7i3~MY^Fgx;Km=N1;sRnr_*z-S|W7L(*DzH(I#b9LKL=X1sfLC(sG< z!VMU~NtZ29!gc4KZj_a`eo~`5e+xEcu>#Nfe$EJvn4Spg=9L&I?raa7zDui?UFYa( z^fgB<5-HgiL(nA{6e8w-|0D)@Mp^a7SP9^Ox&L?udyZ7h*1K-lYjk|7zSoNDuE>Re z;h9&Wb$48} zixuzmtTSOpRWdci+?~#^J1W}ap+&>|dnV2&*V8)dgmPnvDSv^naFTfHBK+_r=Av!X z?}RM73>3m+VK3cK7^rN|Ix|kw)y5twGCW-EFzQ$6p6Ei(cG=oTz2WY3I>tji4Rs>t z{^-Ixvw6P!eiki+S>(dp%W)lO0w%$*P62_R;Djp+nEX2uXmpDjW2XP2mabtQjw3!L9bkkn<$!>RY_ypoRiZ9JMKFv2h8qQ?Q!1*? zGGgs~$}$H=!2c5_Rqr6Qk8 z!^(}OQc!~a5=BAD@tO_pha8^L&G4JWru829B1(yv9Twqf(G7-}j6~xS$Dl48x7mr~ zl8NJS5#q%Wx@zchx(!4lDNPFlVWJ$j0OouO&+XQkvW4feVM$;iW6!;p2=lXF}7sgV|(T|Qp`;X(0BvtW) zoeQum-lGF2pLBLo0{-f3PB2HNB?XF;bX;$kg8FD5jCAeXJ5hZ1a2zN4EN4NQL}Mm{ z5ymUg0vJ$7XyR4BeKI};2ckn=i4a8%Aw1`8XNqEl=k#y{4v2$aBnIBfKsz2D4n;1| zX}a9q3+7o&Iy}jn6BS&^Zb+2z(J-&Dw|?TQfxI0#F3}r$ao~UClCPI=#QX$sQK09G z1X%&!F3jZBLoY@L+7Tv|mnF(D99cJ_rw!44z%&mFX>nFbS;kSZDJMgDCh=bCAVP_6`gq@I1c0hHO>Qmz=$6T1uTeJnv zEjdmR0W1;tAM(PP$3|#J!=cumIF2s4xNE<8y^VYrIaupb-=FAi9!)w2H3t!XCLS`) zmphy-RMEU@5dSOXV18pO?d7Q+t60J~xoId#tTuikkTtAIl!!~y2LN^7mjfL26Vr)r z-9IOfo$4z_n>faEHca^L!m**KMNeutS_1nbc;WXPoMCt^nGY1zkL5KnT+;x49P8z+ ztBd4+qr%f*8fo5QzQng8Ngw(E_VP;sGr^fH>q7U1O@|?qVR@`#XW7>FO|DD5k;|>n z0Wxn*Jz>3e{-j7x&241!%DHN_J73B)Qx$_?eub4ce{A{V;rudc0W{8S6CHfhSv(QX z>n$1Pfb8j<%pL=}=*OtOMkcn!=AX_WH=+4tK{VA~_xDyp_uE5*%$&C7=t|C+ZKmf2MeE0@+`k#xU+>L7I03BC*Xfc8Fwcj;{fDb( zo-Kq<>#JY=@7e0xC)-fw8ZzSGNTlpm2=Z0o%B>9TsksY?Z90n6b zx}%{*RjkYykH#e`N*!UYd1N|Dfyqi&jJyRfRul!nb#+ypDBIU+B zVXM94Mb7Rn4(C6ota|gy7_)@GWzr00*L4$nz+@JyecRPHkI{uruWckg{NNx!|25GzCgvY81Q^W$;df z!8?gtyc3bFXt5)fpx-cEml^vl5F3WXOPusWv}d!3Ply1idiyM+?ZGNie1sS*NuR3G z$ok3L@o~)96P`Ut3y1+m}p-)`z z!ev+~@~>4wNt1%e;7iKmk6!!+CgsrxK7>h|1-)v2`AHk-X&hrD=0rZ#KR5Qp?#h`B zE~10z2h5WvH;4|ZAdo`$8BwoCw0i7}uGXYAN3APPE7!gK z!$h^|1&o`8PAJF)y^8^CjHvJ-`iV__@r{xV%41Y1Cr>mj0Dh-y)__4WtBZ z4@cglmp5J-j_RnGe%d$P$Z+r4O<>o(!3a{8QjYGs@W(#D&pb5Mieu(El9kWN=_lsH zJiXkI<1l8MQj;={-Xiqw%@Sl3?4$CXeKZ$F8ncA}x9YdU1aIlIOC#$dZ16~Ag}g6U zG65+{-LJsKd=E%T6O;n}Q3&{livcppOF$<1Y(a#8e`GEAhcw_HGU~7QgBWM;?H!2z zlIm0{;+3$JX%e$gj%Xmi(cP4=@^)(Gy81JGS!VX@kH*R`%e##YZ0-~B6-7zLgYjkB zhdaiK@q?x(*Eo6)knnnOY0(%#sZP`ad|E%{NXO8UXwM3~6G;`xjiz6Fj z`D~6egH)9FTA;7c5BR+{HBd7-1pb=yO`=57=-deN{#>3)IC}j^voMbIGb>UqmSDGi zTqKZw0X@|!;rD}mF<^Z%ikTpZ#21O#>TzTebCJSMzcn$X3Hd0)xV$r}9luJEPpWBE zFOfoXKiBldTw}>7<*;m#}GLb+<#bmmSF*829E&2gGV6XBej;>I==In6yzk-!$Hl zT6Cze>zX+S_md%~XLp)0+EH(#yD>qWm6(QZFJWtsmK%X%r@}iR$YZ^GKEwu=V;C54 zYzw32bx*Cavtlf1yi?}H*O5_95zhQtGHt5vP0bzV7n-O-!S)k@o>}c9GpBzV4jks;s^cf8Cf4gil z-q!=wvpw#*^Yv>o(W@cMxVSl}0~^V)6)^jE9LG2`59X-R;cpj9)IXs99JvSL+))BQ z*=O1oTj^yEBg_F~nyj3{u{mqwWa=A9Q-JR&>U$$M(&9n)8+8*J`>CQ;zW_PiG2jYNJSsO341CR8WECi`b5>ZO�gAHD1AB5AJ1ci4NFdy!V^V?6D_#NG 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 +x%b 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 Y5W`v!kJ1m1)??R*BFK8R0T3wvU&Nl|mjD0& diff --git a/assets/flash0/font/ltn3.pgf b/assets/flash0/font/ltn3.pgf index 97ce34458ce4f9a0f32e6c94daf89195ffbca857..2285f7703c56a4573a760cb7512381b3ff2d5613 100644 GIT binary patch literal 357772 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

PphkmsTc$WT4uFpGF#1j7T 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 V9<47Z2zx#p+2$}0-I9#k{{f@dIVJ!A diff --git a/assets/flash0/font/ltn4.pgf b/assets/flash0/font/ltn4.pgf index b67b3c1d2abe0f1cccac0ae9eeef4f4f6e879f71..af45492b29280bf0997b14635061a723aa3390e2 100644 GIT binary patch literal 255040 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%0Dc=ZPX=pwEb33ZBo890kwsU(nj zYhO>avjCU8CXJqI!*uexuwn{irtvJuWa=penfP8;!h=C1*GJ${>X&jw<3icDl^M4& zYJn=4s1iIEY?Bc!Tq&DkXpEcU-JAphYp&~Rs*s1 z7^V9kL#TmP!?a$tNk5L?qjggSV8f3-!50t!B_Cb69}D!R`?YU9&ycQ!mZ zd``nyxdB^~ls2EB8-iY7J8gs|N>@}TeD)-p6GkD0n9X;L7L!Y2iSYuRhsH2Z^TZ2C z6x59aNt+MYHR`D>L#EkiiPRNjG?wiXVujiQ^9JShF+gBbO9Fmvjm79d@jI z;6ggWQx%;ylRHPJ+Rw%k+ZLm5jtQfTz&Rwomf zK>7<5eMPGwwbsI3EP3M(S@4Az?+8FNQ5azkc%}*6~dBn>h15#+LG0vr=n!Ejxf&{DT9$F;j3ai*cKl zG7_jV8L5$$!vN$<#ry$@@h0hOxci^!UE3@~lN#CE1%MpBh z9|jMX_%MQPViVsrybhkZg5^Gfzz9a`TdEQyD<#5Y63qpb!U!`X848A1#H=04`BJ z|10c+55vz>EOa|WV1*3vl5SXuB#p0f82sz@BzRdof)UiLi~^Vkbi=zpL!X3y z7UgTNL<@(*i-;hCPELvf+8DaOOaffhjZWY@ZvlTR#NPBEIGBPGqp-|3`l^JN9o5jk07TLoOym!hj61MAB8QBAgKqnhaXaICbck` zZ~+>|iD2%F#wrQx=7mA8rn+F7Oz;o7q!r%|z zZ3Y7)Q_V-3^E0>zfZ8&bNwI_fV^0PFpD$1V+V{hLuATAaXIKMq>|w}?N+GgRZ^)%% zY_O_<<@v)@xAO<9%ECf5Pu+l;TLXAg{gghMGfT7!ifuCmt~2pS%9f11(kgXTe=t?> znb~hd(r?koS>c17_)7q}cl#0UDk8IUvEa0E3yunfr$z*)im^`(;EKGPVCy)M=j zGED-A4{vOq@f7M1Yes4cpF_~iRroc8`Uyu^3|@!JybdS`Ee^tI>!@cKSsb-GX&#&)H$RSC#=s2Bd8gA9EKF2~3Zb!qXE zIQAMVa-$XJm@ZmThC6@0UhyPX3eTNS-i9YPyq)L>@mdk$GE>qh|eq2J`LGQ^A)1SB@lhc^9wG4wlcAeXpjC|n0FoEjLs{eUp*JUz01 z%(-JekgK7bHy#L+{40$r|1@Yv68B^~lJLMJfxLlEn=s*5@RhIup)64L?H*u@=6*3e zli1X5BWc{g3eF|0ARP%qb!XZ;gXP&q1VuQ|jp)ZGPEqS)@QT$|zn-R?7W-onp-2cV zk=@0-23Tx9x>L0TZE!-`i}Q@Xo27DB*_b^6hv82$$au#){#+bQ5NITV%a&0D_yF-;sf@{ALUGB_s|P*H8V+xn~;jdW$(v;4_Asz?}?#pgYov zYV(?o&HQ*B{nNuOQQ0#kUi4kI4`LpK+{t4JQJAHd=L5qQNsB}9SqyWJRl@=Uq`M3}ZZ0}5B+Dx@8Rum(2WIKU( z!_15uvAr+O(F6+{Vjs**f1b>fd^?jOg2fc+Gzb&9r}+=V6czhU)-U>lqNqAsMJi={ zbceze28F3NA&G3-Z$H`(2@{Jla4*^txT0g7kmI#g!f0LZ0G95B56CjMm_b@V0@a>% z-B{(N^`M8ITtmwLVTE02U$`G=aTDRpI7A{<6c%DH>xB_L_qnfIk(-@*mxLw83nG!k zLu^`eVpwcNjpt`B4?T# zzNtP~vRi{YMru4IK40UFV}!1>THs*m3JfYnf-(0RVri|Pn@X2TKX{*YHx&4VStUCr z#KT;JBi$1rMyd9)>P=(|=Chxqg-Px}5^$py2BJUVQzY!6i%$l#r%w@t2A$@>XOhK4 zu#v3P_`!+rE3_XrMZs_GY2Jp7fqXmW7^!}fL7NvM&sp}5QI4Zb?FFtkWu%?hqEF=r z9?Z%MSNZiMb5--&AI{VgdeD7h!+okqF!bFX@$?xe*{MhnL$L`nQzfE$_o zc^3r?&Tk~J1#j%&9^weq1dO)aoivle3%^bagOO>F^o*C)EsGz0W*9t=2Onc<29tv1 z3g`XvBiPLP)&3NAZxBWmZoPcktl_pYFb=?jZC(5sN}%)wq? zBBly?cw6_#S+upolV0@kG4`QBDb!<*bia4Us}MMPB31Jhak!VU1_N$ZwZEjRoD6|f zj$$bZ#j>Kq(3}yEniNt-80{-kn{5jpNXc;c*7Q;mg{W}%U#RaV3sF3D|JUZ~;+^`k`? z(0T7^OJY0I-#n}cAVO^D*MB%yMWLs27pNd_>aVDQEY9(I@U(TM$vlB6vh)C(>E{D4 zHmh*iF9}fBg7{=HBs2^@D##>kGHQ))+0UWZ{IGF8>Gtj5<0I5UM_(8*n$s;hNcSX| z{7RLO*La6Sv@!{TDwr7Fvp-DOhi-$ZNCSL?vemtk!QUGcV++?2B%6jU9bN#fqd* zFJs^xOXk2XgR>cu5GL9WuPjN^P-OFVn3~u{j|G?h;J8DOX|VTENE0~195_sHlql3Y z<`4HF4$s4#nCGE}=W$*p`G(VEu zgZMRQ10-L$l6gLoPoWNB#ETSO*0~Y(8NC!#d-q9twt%CeXe8@XWe>s?k)+Q&@Mq>i zCgXw3r-P4+HSMao^cLif%QTG_WM|!wTN6diQ9g=p%pAGvs;I!zy_rmgh>sUJGMNlz zPX>%U_I=$7JA~L7>e~|7W2S~-f%>4n`MxYmJC%RKpug>cH^$B)&+C6HZduGUP2Tj?DT!Xw>Aa9J7 z%*Y$!tTB_IUzp`R14@BfBWub_y98-9a>q96R^SCj{iI?wSpYEXyBss3z=*z|E7I3r zvp*FUN~7%Ll1jmaIIvIhWS(LT3~t&EL)P9NdzQj>&5s8Qc7Ey>itsLlL7qctJXt0L z=4qp{H((kv-r?hx%YhzUjBI)e<$qtqw{Igoja`H|O~__7t*pXg$8G)>J`-4&_o{w< z9l`)X16RL8u?efiJ_=W?h5+o+B#IDsyFo6i8G8T#v+Jl3F0^ULjZlhMsfAfqr^P8u zp@FR;M8D;X;C<2jJ-lta0_~WgBo1I`L`Fs%kTVi)1}ilZdGfI54Oy?3L=#8M9Eeb~ z;425VP>*e7)$7=RqhOWJB)u*1g?B0YxkiV>kZjkeeUDnkVd_cr3N>qDnLU)NR~B*A zyOCOKi8fH^`_Gx!ogie^eJeg;gId+xoOt|1P{Uuw)^Kdto*B3Z# zWyxo;J9fEYSABsE3VPNp&N(Cfa}|?OcWB(34+)=L*w~Nc(R5N9sVG~kTKxl_D3kb< z7C)IucFw1daLSNXDAa}e2@dkU6zPT;*SLKL8oxyG4Bw-i#a={La9hf)aCy%KN%?Bk z>hDpQ6onvfFgXaYJ4}uM0i7JrnnIC5g%CXV?H9)59@MxG_EBR|ZmKB$Hq7~Z1{0T8 z!6n98xIyAf-85Dwh&J#J3uV}OYOIkg83q%J*fo$h_luVaX1$32;^FtQ;ls>SC5sZG z6lsu?$)hX-*a1Rffs9y1RP)Ac6tMR`vZZ4ct1ZW*O@9OPayudXC~S)bu`fv`N{Uw< zju(B)PUF#czQTAB?!;1|fQ9v2pFlIwKMKrdtXrxq#yu;kp5Nk)l z`;Oezwp2M2^V+CvLM#uMHs8=gjux%@#OOooPOt_YGkdWUjG_rjEAMDB$i-s8LI_oKdiTpEB! zOq$7ln6yjs)e=_c5+R|nU|G%=Hg7pXjUm}!!;AKFMdm-QRjrZqJCjxGMXar_DGKm~ z_v_1vve!f_xmy%7sIqmc!-|hcIh8>MgLO_%Wn*;ZzfiuAs-09DvODHs^UHtGM zn|=H;$5r?Y4;;4(d97z2jH;wUU?%TBK)VP(KMJcE_t|9%Yc)z)2jfDeDPe+cop?V- z(8p~^<0u*_>M^*bHt=>kMs3V^z<1z2$?+n3`4pJ-P_4{?!OaoJjGiha&#dr6MnUL0 zVjqAiqDDS!RZ5g(Jxp`F^*U4lT+dT1hw;1aQux6!n{vUea#dx(L|O9NWJ5pRlpBRVBtt z*lV02*X)zQDIm9?h|ZnxhWm{b>(0yt-jxS^KwV z>>ls7p$}nEp_Ds%8tJzCe~3-(i2^ z@zEUG3ti3`sOq;D{hZ(+n#%K*pkI^qb0xo6u+rBl9LP|74f9OcCnm2)SWF}LIRhG| z$O*;`*V{wc{0)p92`=y*YD{>`Oln-)Mz~MbSW#9_VVhaLzmQgI9v|k)dXt3g&j7&G zmzTh1uR?Z9{)uKih5Q@n92e}%BqMXeXAXS^d^Nm1$q8_YKf+vX zRDN0AUnB_mnA<=4zu5mhOs))e!w!vgBa6I6hcs*tS@&$ZE8Jz@SigaVbS14L$LTiV z%PmDtfYO+W_%ZsinUNu!eF3~HbGMtL_Lx&ADb^)7fOvFdaD*T5zo(48E5>>bNw`z7^i-~>xAp)}^tm2@G9bc{8VKCq23{S; zrX7;2^z@gD}?1z3^#gFRy<#@d-onnhb;yx*gU-7hYv^xOZx$R4$LKMwd?3c$v zac@`5v9AoA&mM5foNcEDD&E2`20LMn7TxxuyeAIq>40A8N0-ltw`0n<@iS;;s+1GLgXvxI>bLle+XB( zi=1kKzwk*0_y?f+7ExFTc-^&ZFr=WH6t>v%JcZAUI?Mx|gt6d|u`_Uf8~ha}#$?UN zto?WWeA(L}{M&7A+y;GV);zjW27AE70sjmC6j$~RbeFupg+do$xvS`; zMm@Rm&8c`vuH9ah!wTlvQ3r_?HG1ZYO5@bw&m7`a~T^)y#n_XD{u@it2bQo{yta^`p4zu&EF@fyhgl-HIOHk3Ev)q+$5Rb zOgF?`3qKVnT8>3b7*L*e2pg~*)59~PoS-xfiH(i9qqdM)58(RTu#gCq&AnkOtjJ}D zY-qk}Nu+FO86c=`$6*UU7Ox;mGw^iR=b`vU{WR>V5yuMOU8lqvSz+mPKTCz1R8w9V zT;-$TgCY&(*P94qf#PZHtl-$a8%gteVN6}YRcw;i&}){T?+$WPdGpEG_!SKbjQeyR z3tTKHHzU9cGUD4ZTsVK3bBbS8hNH!5hJz^AzRAy)a@HQC{jLzR$t)f4LN#`H&^J*T z>0@Rii7o}X4BhVXV)l#cPkQwWFU{mn89szWOn8{qJxg$GETbgHKuKQ28-I|EqUTda zG?Dkq(X;wJWp^sq<# zeqscpoSCifbfouj{aK(hr55}tLx<6b2{mcm)`G+_FLWknR4(Xr)aa$SrRGaehFpq4 zPH;5a3~OOFDNA1(Cu-9fHi>J4js4?VWcxVBSjQ$bmJG+;;h#o(1a+~dn8SHE*`(`% zFavjhK|Y51_WuE|)O*GTUMZ~f2nj$Y@?UEv;|21xeUhse3|6P|!h4L>X(4y4rN0hs zYV3-5Pd9_^p>yUFjt0Z)4vKT)g?vm=qgUXR;+`Dglv>=#vSuyv6z-ru8rG55IxO*$ zAapOi-4+SYWe#}BJz6U+jn0a@lXIL6hPXNnTXkw&*aRC2_elfMfPX)tJItNLtmA*= zljyX5j0M_ljB(wmL|6-I{ z9J^0aaEhn`?GfIZ9@wa7j@6FWj6Qc`j@6mrYB*Mn0ZWDM%#K+mhOy~O+!yP5v1hO@ z2ZraWDr?Feu_dtTojqtym#$wbx-;Y=J9n6dZi@1i$Sq=nRgaCN8z4hPv=z;}uW#lsrI-V z$`Vkedue9)A{L|7OPS-&%`E6ZQmgR-}7vou_>oL*$`V_X{jP&OeI$q9F zY+MZyTj!kQ>HPX>yy5;~d76H{p#OG+hrs?5;{=YZ=}j<2`@%N8=}r$^{DnOIZXgW6 zYanZ{9sO{)95LS)w(NM+;QO~*^phX*XNFBEIbusp$C*VL?r`A0|C4^#;u-@dSYZr) zrz%gLX2y2IQgiH(E*r@(pBYXHXtq?h{?h7qEQys?m3aMPK|+RLG2Ne2Bj1Qr5)n5K zn${R!rO>}2D&Q{t)0!G_%^&2%@X*n~L+5w6)>ZE%JLbYKn*WxY(O2d3^~-6^tYXxp zkJxaV_NKcFEA<6P_wA|lhqq#Zr17ml@^sNwKn}7zUH$2Psg}Hc&tNX2PE8$gd!qIm zWetCRI(vA^;3f0035`t=vjnS1MpoOH4FryiKdq}4R~uv{hxsyMOCY237xV)grD_sX z5)+2EAEZCi?-59eg{|_bSb;J7Cwb9oy5=+e3Rc!Qt+aO)-7+m~4rZUZG3sXz0*E@} zB(=8;Mj$`+y~J9^^?36nxE^&S4RJT*r_dhZ?OZ!-+75$h+RvQ77o2y0&~y7yJ-=JU z=()8inq9hnmf}-Q25x_1YX2$Qvu@maD`&kYt??*E$7$TKMfYeQl_US!@bvip(n06r zwP_z3k9{X*wXAU`T>g8*g4P26Tj{T4;m6CFn?-PKn!!uk7q*TSGxRA~@X61`V8JUQ z{Dn&mM=&Xj;hz1IoM8V9>jIv+J5`o1NaqJG| zgQ}CTpYoCblylxFYyy;nlR&`=M%Opu*B<@JLuRN?P*g7)v|PGBpZG7j#0FD*B@ zcpiPmmwO_?ib$1*B0miJ&_C=`nN=5?A>R+$)4qKqXZMgJw#WE2dEPAgM<>KD!j_x= zX*~XFl0&VL_y6J=T}Ss;-pm&h?Ai)~ck;Oz;a6hC*3M)vqq`@SVa947;j^*OzSOL& z<15E@-)<0F7i2X#A&IGz|IQ*^3txJT#o~F;yqKJ7_UX`23LQ1PNO7jZ2T7=sSGoXc z>DlgKx#8ubiTD6qOPy?$hhvja*^vW=_E$0u(uLoGu!&O;sl+GSX^NJ#@D4mw1SBGN0 zt1$c898{=PN(nDt(H0prvOZ)-A}$#~;;uQ>qzh5aF0PNYStaw>3Z@N7=Z&lffnc9m z5A-%r_LtjB!xdj?+Vv}Gb-5j4(GDHStg;}*bHceNSlIVwji!}*qD|A9Ghd>qi#1~< zglrRiaXVZzmE!|{r5hh4O`3^p6P1IamiX9MZKp_Q9&Y=?V4$S`W{(o6>!k;~AAy?h{z%!+!SsOb>gr)1BBQ%w1Ld{O z=5pI&Rt);IthJulWvOstucU8sLlN&tqQa!--I@Aem8Z1O)0$;(%E_D&B1vl0JW3<3 z>T~8(#yv?qDE+aD(o~Gx;~-B(!}H&ogqgGKFLzvWSDaBdwU^_~#d9HPa>SQa0 zJ6KtW3OoV!Vi|=oSrzmu+D{^ z{AHrGM|Bz%RxFE{u!V2TbBnB)?#l-DJ55jbYyF7k{mHbtzc#-A-Cp%%dTY&GLG|FT zEec6b$=;tDbmklwfUU8a4*f}8MA-PY%Na0c5Bc~jt2UT|%`U#TQtXEpjHB~vf0p0C ztBus;d$;=|@qY40(F55RVuxY~y1RQVlG#z~uTwsjeHa!0d6szGEt);YziBjN}COmk#BZv1xdP zzA)en_r$ORy@!+1*wq9h{i=2HoSsBUyr%*0m?IgHX}E;}mtt}Rx3gmD>{M&@D`XlE z_LJU;tSxbh1|qOi-?>O}jj&(avGxNtc7)P-i)vKcWg2fmp$7Uv`+bD_dUvvvUDyoY z8Zv@!h5U0uA=$7p6!~WSK31w**BH^wE`Pe)NM^}*G?VzBjYGf5y1rooJt=OBu;AkT<{Vao z%BbO&zTxcKT>)iA$_%Uelj)jjO@H6f&`EC-HzM{G1?jChZxI!hg9GCqIPy)t%;n!O z`t{n4Y|*3syIHb_)UX#_t6JteNJIi~Nc~-o#={MXC=bghkCqNYKjA?3xa!SyEK3h| z7keV;Z3%Oaz&Z_>^p#i=xiu77?I;N}5Yr?bLZk60FCB_G|mb1VWAY{r~;*0>`wX{oGwu`m;H!o3dB zPV~w2UuL8G7Uoo=m$xtv=--Zzm{do=l&2haT%S8Y(gBz2<8FKZV(C0vjE1w#*lK65v8&eEC_ZPJX^SbNt;0tW6d$VNDD$7hYxUddfjo?-+s?Mi zy;Undwa<=D0sH$zt%OK$7Guj0ux0Rk=KhFh?hwp|8XI2WEb_Y&tanm5GM=cc=MYEM zw^cO@_)`3?z2CZgWTMB49Ve%aMUITVFK6_9O)(>iwRsn`(tWO9Oj>-SE+_53(eL`@G3%mo zIc8DD+VYy@nFSR8Th+y+SBrA_&tg`A+zWZowpKBZaBhH3Ja{%W?I-yZYWZMQC~4m! zCY}O~igf;@XOX0`PyKi$ZSB9~K;AS*S-cya#2c~Q8Ph?~%!`5tKP)c|z&@77CMo)H z$iHJ3`L*i%vDiXoni-iMDv7>|6=YQCNgP|wGu|=99{7h+2I@4c@+tmf0 z$n)YoW}`9yfeeE{Y=CphfgV`-j?#Sa-A;Rc9(v~5E|de;4DkPq?D=X2#B6`1qcohp ztG`{VTPf+{Qxd}*l1vjw(_Lc)aVAw% zp#G*@)|E>4wwIyaTc}F_W2sMv0&YsYivD89e#wZf6M*euY@G=<>BaH*E4GeeEy-LY zT6)D>y0-?#5SXgUOHaD7n1d0n0A>9BOK%I7E|sg`Q#kAc=)y_B@Gv%3HfreXFus)}Gk&Cr zG4#i6-bFH|7iUZ_K4N;Y5z~tqOfSh;UVOyzVk4G!mIBHsfEY!&<|6jzuEpbeS+n`| zb#a zlX(#fd<DKx`h$uX00JoN0l>cVG8m4;vd-F!h0*}p*6?;-5-7ZX*X!U0A3*(H*dvbyk2Ty}EQ z{`?*z!JVUSJrrG|sneTd)sVHM2jp)+zsK~U{Z9HI$;1$|h+2?C1lF_ft9Y5%5&2MAvi`MSZruPj&F75?B1xM){Rzey zEUm%<%iHDCr}A0@>X|t9Baaj2nh}K#7%idOa@Gtvh0$0)VjsD8@_l!9P*$F>zNM$L|7-ZJ`!2w55);=z??6Fembx}Z!`Gc`?>DIJ6@_{_U{X`po{Ghb4tL@ri z6tu(?8FW#Y;hUeUtCrHg$_Fm$oayh2u_m;^I9@u59>BCjE+4B1jf$f+W4OaW6^-;C zY?f|Q*(o=Vh8kmcywC~ffUFdH!ke(PGA2}w+ zqKb`r$FYknkbVc?se)HKKZimy|H~cyGQJ_piscFrktVo8K?LC=B3Lpa zg2&EupEELGF9=0iMrFV)M!wV8f*;?1aLAd8RM$gCntK8#tma2-KLWl2?2QEWg^2~A zzlKO(Az6B!_;^YFl5!JX1&k!IMP|5l&L8}1}VM}<(B zH#Ih4*=N@I{o2@F<;aX%3DX^d*n@t5JUjX7aFM*b;m~*Wt)77AOs?dfsMOWRUIkMI zCKdO}zmSmyA^C!Vs+hU5K6g6&d}~UPGyhVzGG_~9+~FP`z5f{f8@d0$Eqb;4kC?e5 z5UM1@(qarMr_k`#zf`t*4*h&}$?$L)7O95J8nM}zu-J~3xJK7l>VZ6;8N>rOARA%u zXK2LeIY8i@Crz73np1EKRxE!EObl}3m*%#mz%?(8V}K*@Dv^S>8k=2lPRXGk(K@WAn3 z2unD{4S4FfY}q?uCS9}XY#He`rUYq(I)Ja5zG1|RGwQOnI$?5tA=LBFE(&;;JdLnM z^c41x(NzlzA7CXqKr=oBY49Op4L$^E@F8LhK18&^hae3;MC^zU0e>g;fA~9rGTYhw z()IW^V}3SUjN32Yb>~Dfcpv=-U*DWP57gVsUcasndM;H+7ISt-{VB$;FoFKNgLy>fH)G#Dhg4wl8+5J*umE&eTT72ab&3+VrK$CSs_qz&_Vfu_*fhO z)r1xRYSjkQ+FBh%rG%q2B3wvywcv0j-VtcES6%qm_s?#2XwJ67H$M7~f;J5vdoy&D zGyWx`)69O1pF9ivoArkGBMdTGZjcFKkV&9HCjJJQ5C)knq?a=9Wwbz%EIbnxLM@tF zm@Iq}ynu1r8LW)qJwcBeO`sp}rQ=sO0-$&hRuU17`r9pbtU~^3)lz7EUkaH7B3EuW zDo(|AggFPf2#lJQonMXV?QaI-oiuk^>c7Ow)i7b>@oPUur`fOPGd;vACZw|%E zn!wE*d_xituW8SjN8b(M@O`$@ebWJ}Xr7$SY2SjU%5};w_m{7tPkN$vJ5zYfH$R6I zQhVb*S?gxHZ$tT@GuMZ{yCvRu>^`n5^X&@s+U7c}YQCt?-bN1{>^dSGY9Cfq5%^oo zdPJ}mCeE<1fDjja8wSCmf0VY}pqscsH}{O_=9>oH8=NS z)#3nuw{_B@%r9GCcXx?5(n^fj0V1xPZA|% z&7$*9qIUY^EU_0a+4&%#^tH)LH6-X}I?11L_#w{jJd$%xG-oT~QdEt-mG*2O~R~;6zFXcfmgWs>kkAqQLz$bXLN3d;IXSJDd zQc8vk1CEO1Y5gOq26uXE8FIH8Nfl|6Gj^bNG!6Hq%2NazySrHcXU`WC%EQ-NhTLQ)sZ)NN|6d4(S z?ir@`0=9$Uqx!Sr* zPh54;r_rsa?GP9Or^WoPG|6Y8;lr^^Fq~UFmAFpKua;+#pMQ@n`bft&;DH3_j9FqvuuvXO_pDTgvDE_oc1thvVb% zCCwh!J>YKiOm0p`O=wPA2V&YgDbolSr0HY-DFCtQ}VLf_h#S`^&I1`5it>~hLR2{aFS6Heb+*|sD$62${Q9rmu-)OgNca?o*04|)>P z!#DaxZ*=Tou(Y8ci!ZW*p5CZ3CDt(h#&szguSw{tMh5aEqH>Zsqs;roGy4GNW0Enb z$gBD0ENjvp4bywk@Z=93V1e=mHyLnsYZ0~4$cuI$b=b#Nh!>3T=#wIYoq@8!Lu}Eb z(4^5=Bn;Ld1j7M!R>P~FYy|fR>I42zAF$7?)wa~ag`_F_)eMIzZ_!t^Ct>R4>2qMX zfdS|2BII%b)+6n5;g6r#+7}TYiTqgR3b~tx=U4?_dqH}Tt8SUAH=&cJAkm>Da)8N+ zf?UH*z#V**!cUUSCLxT+ufKL`XDD{?YF$T7%b{SPmG2jX4V5RsEZV#T;ivjd z6xLM)m2BwPg5vUsJ)+@V8GAGdJouNW`v5W+%Gj@~{Z#2z{KwNh)@(gkFrcKy{-|6p zJg48p+BH<}FF319UnLrprbrYHhB|iUXdaX~Yi#&fVBovIQtb!wpe!rGP)JXJ704eu zGBuu)7jEj)xuPGHsRFK6x?d2*ygMu+K`4TE$2*u+0M!BX%fP#X%zt2H{z^3eY%j-uY}5sd@5A$#jgnxbj3@dFtwNJDg%-nV7=WxYJY#v#lKvf zPvHr>UpJ*D^z}c!WyBOvuHJ0cr*lM~>JI{rE^n*w19-(d%!;;o!w@G&z zmPEjkPJaMP!dmoIO(7tZ(-%_LRkX`vm{rXom{lbURpQw|&_PkhM|Go#*`rrF2aIG+ zKCE>K;orZhQ%1}~d6mPLZ0W>7@oYS6xGLiE`J4BOwyn^Af$;@!|!@l@c zJ?!A^1r#P=&IQC?KmPPF zP!@E$2jWtGv93eif^^=_J_XKpIUsj*m*&x{9_n|yk!_5&>`UYdv;I4o{8qng(RbdT zIcQB=&t3Clmm8$~_Tcu&zlx77y)vBF)ljRiYM9Rf?CmOg9>}He@5m*MH{v@tOs70v zS|H@Ul`40k2as%eJydommH6UzFWmb!b_6;Uy)!8DW~6@`{jCz|Epr!sSl$jPtVg=4 zg~FAh)vrUj0(w73?BkEqF^}K%q9mYNSD)ia81l3DXns}{H5@BE+Bp?7$3Ku~LV8wN zp}#&{UKO!}$A4^k+Av%kcL3`*K^CW6lMfmB^#aT(-J<}_z-zy^=72jCG1 z!^_9`sq1eg#=Fs<% zXZrU#%JB?M-@-P)#!B;(YL7X~&zDSOui1=ypssriE?rS8_+ui$*vEk2)n2wSbM6A==*3_ z(YODMP+Vg{4{$E4-bwU{(3!sBCqCbRYYv?XM&63WoeO3oZza(qI%KFpzg%Jp0w=F8 zhO5FA->KV%rG%q?xwYbVB;k@?KoTBk)HM2?4=M&UKFn{Ah?eX$g9+M2^mfB}4g+~I zz6EfPkoG5E&aFt$MkCo)u@k;sUYadXji?_=B{Af=kyyRo^ z-nH~OUE#^W^`XQbzK!s#oX^VQ=MPD%ra}V}GqRp-=n>pKs@oY*i(zm9x9t?~!=Ur$ zaiZSzaMAtlRGHB7FkA9Gk3#S0QibtxRa6UKAdgUZVOgcfw#xSUdBT54V^=-Eg7|*G zcVDzw)@x5|m!%ALE)d+%)lZuY%*J}a%S?hfxy%_J)n~@G0S_#L&#YRl_)6W>EF~7} zy>KYAYr_?{h$2_v(l3;_MgJXuW*%>2pqW?=)Oqmf(O3N#EKvFQ_(n}d1ooU(UGnU9 z!#^IcVjvkXRFSFt;&)Kc#~wSn$4EBL=sRUryA;b(>Vhnkdx%Y`Nh)R*kipNS0TW`t zL##L8Ax;l@iL`rG0csIKKogip4o%3n7}b8?TGl%ou&IHOnS*)=3IG?u05i;=vsNXl zW=Z@_$-U`Vxu)TIs!nGsI$jy9OsCKlL;M5*@5MjZB5g4cX=@=@%H^i~PxdT`Ul@Q& zx|*`ZREQ0OGGZoYGAJYBlDr4vQ;i{vhjR0x0p%KcF;9O@7Yu|9k1&%);(~G4Y{hjb zKB@^>_iJ?PYH?eak_hdtJGhgzWF2G5ke$2_(bUmBK$txk2kk(X2ZZe8Q-&hk>8p+U z4k+W5RM;UKRLfOqT-6HIdetJ?nE)D+vsaB6FhkDy0cqjq?y?U(R2$&i8&nGw@3Rh) zoM6^;>2Rv#EiVe$M&pLPW_)R8ugxgVZ)Ur@GP+WzhDs(fQ#^i0lI-;as5}Q55LO|o z4S+c%F6be4kf{&wpx=*G7R+QTKhCJ|(TAvZGD*xEr2!uBF7czfdvrR0rbeB0m-4EU z?cGOAvAVS5>U(c^2yT>L@hKnoYzuCFyh%H_RaD)!U!+Kf-yR(ZPjwLoUGe5a5UsC% zSDy|YWoVRq3BQ!QQHkC2&N?{jLlFCIuUY zHzbvs=l3tV)7Go^59ty`|0<8Be=Nq>fhUeCv$g}asz4{#*XPW~o)>y1#D@uu+INrY z%kR0Pm-Lsx)z5PhM%V1co!Xmvnvo!WX#m=a-p{#1LOQ;7Bu3>hXDAEY?b_1J^7y>2>}a*&Pc9gEzWP# z$RVi<&t>hA0^3IKRv-d=jxj`r5^ZyLJ*2h4T8!ko&Pleb&x6kM!2U9K+kC*OL;w4< z=$bszDYH%8-sCE~?9DIqM8h($o23EPg6ON+2{gM!ez8Nne)87QTHU0Jlt{Ir()fO$Ny=F8s&(qi)0@`2uXCo0ioXEWA_9XElU|SGek9 zR2!vW$Xg-J%w$Iibo=Og)1&9ZoSIGjzuud0J;amshR}_H$a}*f@aETaGf3}mG(}00 z@01!Tt3YoQ)}|y1<^GCQL|H0~4`D-|Z^Yg*cMo$0;qDnZgCjZEm#Gg>>VKy1yvt6Oo<07t#olEPa2hAuGTSI*RB3H)fKM(W(YRU$@JcA}wW=;M{c|F#& z4a@Z^1@|1iHUfZl*0BNB(V{lfhgfcRTtyIJ{kQEKXBu4xaxYUS@q+lfi;R^NM(;C zkSojEoPmpBY|4o>6&-~!(Y5mCI6t}^UX=NMD_N8G&Fi0GR7hXL*! zW&NjanBVFg-App3eIarzg*R|0;>vL8$zi4P;=Z|}i_l%iWg9R@pof3NfP(*fqFvus zY=`&n!C!#ZI_(v`_Y9iutTw$WuF4II=_5p#zyEG)A|hnw@ARcscefc z%?1wk{^;lW27rHh(c2ad%i|~p$$@O5w|B+CGn=Ox8-d;Odc^vKAHo}U>8jSF@p&+$ zj2ia~3?DTXl)BN{=HmW_u@Ce!ALyJFHn?j-7`?iLlU(MlEYh@G^o*CUTm=-M&~#x^ zOHD|iChVn0Vvm6P)?JP-E9_}Ue zAAEYBDAw$XmoJp$PsK7GP{i_e^CpqyeUF{!rEB(=bSbF~gOI2>r-K{@up8Rl|IE) zZBfBid7db5d_h?N+7~2xDp;xbhFCeil1Me?=HK(J#GF2pch{aR4FaoYO=}tWrtw@L zY8$`Lz~KP<%V6qXg;Rn;S7yzoT+FB$+iTRJ*kYy)=}XHWyPw3EAy4VnG`o1IVIk>; zRngxdtE-33If<4I2A4ZOtm$sbw!;eaRk2ADu9=}%7`O@yJ(MHs0k%%oj8J!c%Q{il z+c55XBds}SEb5ZN#VasAouTzwU7#Z$-im{f$w7!V4&Qjd4!;C|J}0wDtpA$@!K^yN zdJKFkf06xRNufluPMeX{Uo`I6=^fWb13?mDM01)hqY zGfuMJrNVz3S7Kgb%FzxX_Xf}DP#YHFu)Fs@JWpKK+PFv<|X+g>JM<(n#6bk)CB$E zLfB+=7aXCM9J^;K2XW!$Adt$;-=u<1?>oCv_!EG&11rNTg3Aj%1JI+4cX7Qz4griD#1a1~2aZ7wGd`7eKRkP>P16P# z_F|}hnNr@MuDO5GjaTB3Kp74R7|H|uGRdGK(UqVgnc$+vt_Bq;y~3!7^KZf!QIX9R zpdvGpYr7lMh~*HZhYKMq1EKvRqs&ox7Od~uE-43GY8drWH+TI2sr!AfZckuD^b+;Cd znTUK1p?al$lCZzrj`h&$K?W5uO!hCK{l3sIMnlz4H23Ea=9#C~+kkMGGZg&aogrsI z^uW2rqO)be<>wC97*K6+!XlC+J4_){YnVR=XNQr?%koA5s0~krWW_4k(uv{!uhY|W z2J{r{e_$mibI_-}D)vlIU78tj0pbjZl@YF8#q z8nct@d@J$A&)YSv=W;=JA>&fa1pHL69mV<+|H%l4#cx~#ugDc)g*zRX%yLRu#F~*@ z)4h=CNNveU8NX0m*yJvFDhQsX_y%+M2$nRX6~0|#`1X7RzP)U#Bn4*Y{WmiDTRag8 zdx%odzagU+ycI9>`0sK=Y`A%Ft^z0`{)UKtrg^6?MnW9iNUckS7gq87L{&IMfwF1{XsE`&Q_nh1PG^n)M12kx}4QSA`b8eMHP97|@25e7Fni(uK z+m755o5W*$su#Q-zpthH?{Y(YTASt}0&0j?HbDQmroYPzAuoHK{`%4N2zw;_%4+Zf zgNkvu&;gn8t3Xp%X~AroEwgFij7>aK6jXd}kKx-md^^^R+!T<=LoP~2?#`JO=-mH1 zPKYWyg@F?S`8IhLdm@<2C48IyAVwJ|ejDc0ZPgD9Lb!Uy3egqD3AFpHr$b7!@>z1`jod90_jwm$aQh>MzP z9A1(aT8a3jZz?W5Tjc{6$Xr^>WIHCn$Pe3c?-x7X$Elh2`=3&i_Sy`+a@?8wbSmoM-a|Kmp+{v|l<0%-1W44S6w(@2|^EF1Dp>HXzAI z3rnC)c*vttso@h|ZmqGJi7SCWqY^JEJ~=2h60D>f>Ua4cKD)wj3`}4881RZ;Wlznv zpG?JgC(X6a{EH8*kch$4@_8_wtC=+Jbr*hR{3{+&exQ**J*qqcjcB?aaC{E$U1IF3 zom29~Iei(~t)VCJP6k*J4h_D^r2S9Qsfrrh;V1bVyudhdsKcIow_fhWvQIvnYxAns z19`Qx@JsCVyJI^k%=)*$bKebHY+1 z;4r+3eH$x$>9fG-T=ECU$Vm94#ga;FT3z>H@dO2hD!s$ceSpcLfBtc5?P^hfiS3Qw&FV`q*!{g5ob@D z5na<`y@|P(VpflbnCf6Hv0{9U2V@AAe!*l2+y{b+T^?3|6^?~a8Vp?mGw4iE0GJD= z-$(>`Kqil4;XaoliYY5HWPv0hhjd*itVO$tB2PLy>f<>+Q-g)s1zb&;pKM@`%+Cg< z60Cz6p@c6EgkHtC)9FTt<=(+hL6)7^Vxw9GnMVs>0ER<}Bh`p~QCD9xSCNR_H^Yhv zM|)%iJtn$RmxYWChnAG<0p`dP{e7knb}_`joyj3$tlE(&MDI@Q6$pF$(XxP@aa|*u8hzJdTqdwFZU_useH_s3b(r^mo91)*ZGw?3Kxd}yF=du9X~a}SQp1x=eP*l6bZ zQ28uVZO;eDXQ|i_a=jn#CU2&rVyE0cqKjcG0g0v-Zb1fWW?FxBb&0T_c(!(XDs4X> zo!81csSFQt?Wgjv zKHGSWF&99Y)9OO`6Y^>vKSchHvp(@{fuMWwD%!k9q5EOREUJl2o`o)x4a4L*GPv@H zzkCRw1Zd4_ebbV=7n|023!18QV*UdUm_H{`M0l+D0}MY9t39DBj7j;W)4~@V~Z$`VQF%{2kDs z0vm%9=lMOL!nl%-f3IO;UbMFF1 zuf9u>f#ao}X-Vlz25BaUOYdvWYxCjeuvpfa=(e(Rx{O9l;y>R zSUYpd_rC;Sg3(3B&#mPEbK*01xY~Qr-7?LzYfltCQrOXRpKSm>5Xelc48`}^8uJEY zqLB8Xs7(UIgnP-5IW`;}N%rGxLC_JxM?^m8=4yq~ftvr}t7PEP{!fnasnkDg9{QPo zK@swHcDpm}bZM;gYn1p|7#&tk6}eT$BMmul(EWJh-JHGqWYE3 zsShZJ5cDeP<-x`kN;emo-~AWVrYbTTZG{-qA=E(S$D@vec@O-|i^?Vfx%xlR!G;ZC z!n&ByqRG zR7FuPQTpC~_`ZH7fAlxs zHhK!ztgc0;)RB%=QDksmKRW0K&jqPuU)iB$s%HItu`fIees6gU+b-9neYZd^F6v>mGH&RJ+m3&u# z_}(P4BuxAum<)?28wR@y4^#$qV9gzm%GO!v$sH?AevSb}_R*sGgC_;ySOsMfs;3^7 zWLHz$95waB=2&rS2j#k~O(7f$*Ic?%mMUGF#>ZF&go^K#P#aPs5E_PN69!lt7GTK$ zeL4AivJQvPW^imJbh{WoV$KyJ5B-jw-)KMwW%!M=|7eb^=PoYG;44(9y)_v<@qs0% zO6G{U(SKUw33!du?zox@nUTRMFF0@uDze23_FQpAw)FE7s6v+u^%bD7%hD16_r8Qb zK)EXXK{b!C`f`}~F-n5@7oZmtDs+=d zc_;Mu&VC6=t2OhU*QbXV$JYvgjB|qMC(6U08IoMP+%gu#>$=Km{|~RmpNIw<|=0mOnk-)JbgRuJ{+5g|fxwtWOr1ja9j3c}0O~vwjwnq||l4bdh(G z#dC8lC<^uR3ABM@8xlbyc9)^RO%GZf%Ps+~mOa`qBS+d$$oD+U;oo-(O$O(DCh7%! zt)lGft}xR6V#~JCXi^`K)2)@(#KPTBr6q;gK|%q)Rp=q>P8mYwG`c$E#+&q+;M+cQ z%VX4U=ox_3qMVNz!MoVpR}b z{NX_16`#I$QUd4-?pv#bz+RY&DF@1U9JjX?QUl6UM~NRpIjL~imj)uRzpyUwy25sR zuu{z_fAoai_HvFKlP~b+(+~!csbCIvLF|xLguoVCNQ8?MdgnUHP6@$P|2aT|zwogg z+Q`IHXP_9%?Nlzvsw0$XB<-KMS;=nnq?bX9xe^DcH?uoiW68&Rf^n!ksAt+hjZkW0lsh z3|BnZJ{AD24|a!>b(wUTt-*=i!>G8>q&zeKVUDPQQY^(E63~XL| zuRGfKdH3F2$cSEAFc!$Af!nZuyi6TIA} zU^;>S-{+oD+V+U`&*tL?h**xAK^mr7f@OcEp2~QQt_SeMhNR_D=(;ZbUd@dQw6EIe9pW+5?Ww8VJGco*RMb0zJHAt#qn{ zlV@g*V0zvKMZSl((ws>!jC9v|$*69NYhpAPU z0oty3U81;R0ULVob#v0T9H|gcMi%SP8~@SoASL9{!roZ=Am5a*WeXc+{c-DPcyT1{ zs3#uHGyhsrXyTtca>3Crr^#QCrHx}zdyMg1&4?oN=7ZUy0kGPZLDd*Ke{3JmcrGx{ za8vZ@^L*pTgq8{NMyj-F(*r=&zP>$j1znQQ%X2xK&!8fY2WN8-$b$8@2s0gldgpVk zmC}x=*>#YU$D2B+6?8^C7dwlCpnR|OoT`rNcL;zrIGcOE#zE-LSW`bk{6P0pXvx#T zSZ*PDI6K4IDyJC*HIRB#j?S@}^W*~d%p6(GIA_Yo*pj*OJoajuWubhXO`XrD%TSBC z=|(*n6^+mNpzj7ObFfu#&QC2gh-abrcO9HwD&WMD0#H$54G{Tu1xi2OgSxSuc~Duo zz#!gmgt|lc%V&!WGK)|UrUP_foswZV&bv5EzRq!;w#yR4>upd7Y1REUjELJ>o-`nQ z(+PYZYU&A1gj+kg>Js$z=(OgwiB|Hom*Y{Ca0pJG_v}c|Qd8>|PloN1&s<_=nK14rHSoq=o>yuenkj z;P(Bg0qvLX4JVWA{ZV_g{63vc@0}=bqDoSQw(`4PtjE_g@TyUoYsE^{@(k3rq?wEfTZe=750S3QM@3~}5TTFTMG9~pggMc`2RyddAR5lUL%zHE zj&QT0DxOxwQJGQlYC0}TeuoBtn{W6zpmw@d-i_O0U2t@cnM%yjAmraSzSuXugM$a* zls8nkIlV;FNgH12^xoHbHu}6g4M6V$m5&P7s?fX1h6=JvNF{3? z=CAB0t{bGWHL3OiB9~)2eNxkJHRZZ44pl&INH9?VU@dt2FHO|<${nA*&vZ+qynzn%$h}ml*n~O&tm=JU%|DC~IXJ1HVDNe1ybm+95uuHP){mpZDgfW@ zEF#j%t^td0LxY0~QVTT%F79g0_M!xs( z48R^Q3>Sd) z3*=?#(=Vliim<=fKnXXtS9t@R%;cm!;jVpE86NI3RE=s34L6rkuw8FuAMDC+(pxLdD z&wiksz$XWMCij5r-1QSFcP5do%w}SnST&e4*pK$|hsVOQg|XHFx^tw1^S$9itn2s%hy-s1!7(IaT*-~{*IkOS;6rS?-N-mUU*{?dKh zW9Sk$*`7W#OtvRgyZ#P6vjI8)E2u05Wnh!oE8IvY2_z_F!_|o^f&% z)KLa{gM?lgB>|nW9mcS9lj- zUA29^l-fG*=oP|4xJPQxc5k}En=TDUw9r8%aOt!9-@KXif%CupnF0ve0z9jUajZRr zw>+IDBo=+YHt7p;#rKC^WeZ2gKy|TUt{hvPV}M$FFxKoIzchk&0@xL24#E{6Z8Z-E z4MXfMnzH6n^V;FehZrsa!d3AeGN8|Q`lqotwgmdK&(WJdGi5{BArE69N=rHl*U5pW z%O~D-##O14{LwLFfcFKaPXpui_a1^{t`>o+fs zjP(O~{MB87y?%$q2iDofzlC`+rT<7^R_BrqpViSL#T`9(YepCYVOd!DVmJ~C2ej4Y zGcOwM_%SWH8aWPcBsG>?yiXYgZPGz6|7c_H3&t0=g|(3DP$)$FY|RG(hW*-rn{cEX z3+Q1y$O`R1uFyt;_A)#}!vZshL-AYTu`?P6V621T?|2?JIt}r(I=QoZeOFVb7nLf6 z>#z6t%&kaTVH+XPVt(z38eQG_oD6XRPbH}n&Rn_d&fCe}Oi8kIEm1CD;$})`6Xg)5 zdJYtbCd0tzl@4;m{x=IeB*k(>JZXQNy0vcabA_phOre~9njxsw%6mWAc^-1 z*yk;QJh2@f3_mW+yW|P?K7sYq3E@i}b(Y?2qdVN?CjAs7ROIU)%wmh~S8_Hl@^qHP zpfO;Vu&n`E{H7eHVqDSNtIF&7ZK?gKZpJ%B-bdz-yZn4tN6}DUu3{@W7S;{sPv6HM z~a7&7(KY689n^r#jx@6OE#sMajKpn&M$zP>XWIp0o}f4!W;?Xh4;xw z^Sg{}6v`ceOl&;+j660}sJy%|CcWk?ySp)SH|ZgM%^Y@McCgj+9?P)>{@Q;I`4orDrd00r~JW&`GGMB+aUSYUNz&Bu;kRV5^na zFi}fU(z$O(i(lZnwf6||%MvCZ#oX;$0%!VqsHdEcZDgSSEh4LLeiGobQo}IzBtNtC zzB8(7_~SHij!jY$!peQ87aE?=8=&Qg7@^m z932~?YNSiw{#W|R7XhSq2%w@7Kc8%^^k;`m?q33h%Ci$Jc|0QF@Y92*5TGDIn6m*U zvXF}Ppq9om7ZrxXT8ma#a3^GcAPQdDTt8HJ#&k5F(Fz||q77DgY4=(~n7iF@Zp_Tb zs)NSjzF>X$lO#)c?g8-nx6EzYsX}8brSt5ZXnxk2V-CL^Wp14}O#D2aI{4e;@n$hO6Thw`R)R{uP{4q`>&>@%~;AexgTxM*#N;-^XVzS3{* zrYF-v$mK-REc7%^x;2^~C0&Fnv|9m4ax$D>A?iBYVhR^}{TUW&fRclfUxOCC9B91O z^dx})F)Ks5Hb>sV#x7$VW5en1=}S~Co8TjvMwr^^WcpKFEIKY4j}5wsWvIb2q)8%z zi*4ju@&vVJUY6Cv6EDh5U70%$pylP#d0+FJ$0DRL$#NSPw^aU?^r76YK2X!1qqM+B zNZ*{cQKXWirZ3!O{$p{s+1&$~&@)qIU~doeHG@&G*9SoR+Wn!v5!xCjp4`hV+G zfWp&;n$0;@YUsk6XMv{Fjb7whg*@DJgSbGQ`sK!O6M*cJZnVaSz4|skSN@6x`?ix? zhy^(bua`bv%$S$KEXOUar)QoXM9#1Cp^65#b4mT!tTn42ytHxMc8r7cyfN&UW&B*J z?Jc>S&0HWIn{COn04smY$xM=FIckW)lp{cy%s1%+OpgBPFzLt$@xB|Gl1i6)XfBU4 zk_pe#O}AU^xqjQ=rei$TOP~Ym2i8m4PC=-ln)Q)G4?Lu70LUd6-^I0Kp6;!TnyBHs z66ND;!!&RPR8N_RN z5)S$yxW!yhlaqk`I3vQaZh|hmlL`eD&pJIwlrOOB=gRX*AM(z0w@VdWWd#PWpRf~R zJ_8PA{MMcVZ|&51mORY2uYPRL`wY{Lb%O4%Ahbm4YsU67r-tzm`ka*@kO6767vnpM z?5^XCc!b9M-*s@bR6AgX_(aV(bhxL^=YSN|rLVgF2z z1_g@1JFIJCAMdQqD_nJ=bZngPks~5Q@A{iNDkG%j*;$e%+kCDl&Gd739OE^C3=@0L zwK`T@{aUmj$Cj$nwlo|t`h-%kM&bAnCIBg zx@_q}HVU+;&Ix+j1S7 zNS*1XM`0O)46qFKK$BXlBh<{Bb>pO`6J$RqU;o1dsbf5x0>oc}D9`7UBoKa*eg2) zeP*$&p-PrX#u5DsW}wsm}V?55gz3L2JSV3qUW3@ zx9okAEVWIMZ$g1Jqr2(Rzm`!UWH{r!5N!Ox{JXBEkNtzl2(YhsO?i+cNd(g?f{fSe zHv@P(cwyW|rr)zQ)Ytn%g)DM?v7FkctmVDR3L0Ag@fB3um~kS}^X|m+EaJ7I&_OsZ z8O1L0U463E(Qp8@H~%A&(0oRfM2I`#dX<5Mw`R!eYi)&UJ5mz97zr0a_VB)JX9w^c znOYzwtYbYcI#4UFtWOlLrI5}Ogt35(6s5n~aKP`;2sxNaN#$(5&XK-Z%v-?m5Q^sx zmTJv|Fk2AjaRb!g@`O+LoQv@8tUQ6iZ z`5}JK6aTc*a*F!10ZjTrUDqhUnYZ{#w{k_ni&JgoY>wwjpDp2GcL41)5MPFKB=P@w z7~hHUB;tk(Y&F_C$&s(%?BU#p{nZ=sAMABoY6X+>y`3e0d5-<7^X>n9k7wzx&;S1; zpZ{L+3Dx(;fjtTs3P7rbEN!; zadL^5&O5~lVUoh^D&=*pU57Tl8atQtL^n|q^o93;0<2$v9a^?#RotTSH|N4xa8ZJ# z*kD0Qk*9R_|f8R=;%D zt)U=5_8B*Aim4T#nZe1${Z7B3kA8*H#%gyo`lJx;Av0ey-9|^KKp!I|L_A8G9H@Ew zit`gcsl#9MYv&XP-S|^u)f5DTrLd}as60mhmEQmE%fmLQ*OwReZ(m+R=^*UO19|{M z0>J7u@=#o3&l~(Q*w-RM8*EDl+o-8o%;9j->BVsIdSg!9%*Mf86U2u;bPBlR{81R{ zy#srq?58H-Dv5DwiNL#O+UmuCw5Opp4fbaB7)V$11^D~I;SdYdy2v0thAIf&OY~S< zef|&QEoABz((YaK@cqwyQo4s9xe-r>wv3d1284dA@pwFJYk@W_XJtPXL`8YP=A}E= zAU=c){J>53ySuaymJD@RyXoV&LQPgBE7V1*p|&548w7D%WDk${9c_kwloUe@BAOq2 z8(KAwPbWOyE@_VMd&*hk-5N&4`cYYbH6Q;SzyDvv$@g^t literal 53760 zcmeFa2Ut|sx<9KL_x3$*0 z-u1Ti?vY`hXH&6T)8xJ`TzL7yEmAa$IwrPK}YX??tM?^878j1z5N8vy(chC|JL?)9ll3l zfMZZEQ8CPyKwrk25t#O0(hBZAK~yHeuDaX;D4axQC-0$MjO*m{3YIHa1>8*60BQYF{|J|&z7@C}?Q8>HL?N^*cn;^c<2&_dC(07gH5w_fe=_Lb{Le7|s(CeF(n?(p-EBB-+yW2_*&RE5}bL zcvivlK%&hi1^=$#X7rc(O7tasRH?569z&h(v7-3nJk24k&#&n?>NX&?O-S>37D)3? zeg7DRkd715dcO>$^Mo`XgtXrNP>x>#Qojg^K39SCdC%yb*4h0 z>pKCd9SsW2vzJo$2L1;MA)P0r=lP(}IC}u;dO|wyhw=tWPZYY2@PLA^qThOaCwlb) zmZ1<5fAm42`Ra#4&mpWp303NZ^gO~fxS#MDU>J~O2cZW_I11fQcpN1Xh58u{yrAGw ze5X3i2jSaz&LAM&H(0?TzE3-tzB9zBb=(x;V3jR~UckmpNfyBqlQU1WVp91#B@ijnt{yG#o zPe}I>K8y2&+Z3en=A-Tpv;gV8XHkew+m$*YJ!dD%KwMVbW>ib(#