From a54a3ec74ea95326096feb46317fb9c6cd277742 Mon Sep 17 00:00:00 2001 From: Jun Bo Bi <21069675+jambonmcyeah@users.noreply.github.com> Date: Sun, 4 Sep 2022 17:15:40 -0400 Subject: [PATCH] Fix build using clang-cl on windows and improve driver detection (#129) --- CMakeLists.txt | 10 +++++++++- dependencies/DirectX_2010/XAudio2.h | 7 ++++++- .../ih264d/common/x86/ih264_platform_macros.h | 5 ++++- src/Cafe/HW/Espresso/PPCTimer.cpp | 5 +++-- src/Cafe/HW/Latte/Core/LatteTextureCache.cpp | 6 +++++- .../Latte/Renderer/OpenGL/OpenGLRenderer.cpp | 2 +- .../Latte/Renderer/Vulkan/VulkanRenderer.cpp | 6 ++++-- src/resource/cemu.rc | Bin 9690 -> 4689 bytes 8 files changed, 32 insertions(+), 9 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index a47fe8af..b001421d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -39,7 +39,15 @@ set_property(GLOBAL PROPERTY USE_FOLDERS ON) if (MSVC) set_property(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} PROPERTY VS_STARTUP_PROJECT CemuBin) # floating point model: precise, fiber safe optimizations - add_compile_options(/EHsc /fp:precise /GT) + add_compile_options(/EHsc /fp:precise) + if (CMAKE_CXX_COMPILER_ID STREQUAL "Clang") + # Speeds up static linking (especially helpful in incremental compilation) + if((CMAKE_LINKER MATCHES ".*lld-link.*") AND (CMAKE_AR MATCHES ".*llvm-lib.*")) + set_property(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} PROPERTY STATIC_LIBRARY_OPTIONS /llvmlibthin) + endif() + else() + add_compile_options(/GT) + endif() if (PUBLIC_RELEASE) message(STATUS "Using additional optimization flags for MSVC") add_compile_options(/Oi /Ot) # enable intrinsic functions, favor speed diff --git a/dependencies/DirectX_2010/XAudio2.h b/dependencies/DirectX_2010/XAudio2.h index db0ebd8f..a42c0afc 100644 --- a/dependencies/DirectX_2010/XAudio2.h +++ b/dependencies/DirectX_2010/XAudio2.h @@ -48,10 +48,15 @@ //DEFINE_CLSID(XAudio2_Debug, 47199894, 7cc2, 444d, 98, 73, ce, d2, 56, 2c, c6, 0e); // XAudio 2.7 (June 2010 SDK) +#ifdef __clang__ +class __declspec(uuid("5a508685-a254-4fba-9b82-9a24b00306af")) XAudio2; extern "C" const GUID CLSID_XAudio2; +class __declspec(uuid("db05ea35-0329-4d4b-a53a-6dead03d3852")) XAudio2_Debug; extern "C" const GUID CLSID_XAudio2_Debug; +struct __declspec(uuid("8bcf1f58-9fe7-4583-8ac6-e2adc465c8bb")) IXAudio2; extern "C" const GUID IID_IXAudio2; +#else DEFINE_CLSID(XAudio2, 5a508685, a254, 4fba, 9b, 82, 9a, 24, b0, 03, 06, af); DEFINE_CLSID(XAudio2_Debug, db05ea35, 0329, 4d4b, a5, 3a, 6d, ea, d0, 3d, 38, 52); DEFINE_IID(IXAudio2, 8bcf1f58, 9fe7, 4583, 8a, c6, e2, ad, c4, 65, c8, bb); - +#endif // Ignore the rest of this header if only the GUID definitions were requested #ifndef GUID_DEFS_ONLY diff --git a/dependencies/ih264d/common/x86/ih264_platform_macros.h b/dependencies/ih264d/common/x86/ih264_platform_macros.h index 0b15cf5a..ebc1b106 100644 --- a/dependencies/ih264d/common/x86/ih264_platform_macros.h +++ b/dependencies/ih264d/common/x86/ih264_platform_macros.h @@ -40,6 +40,9 @@ #include #include +#if defined(_MSC_VER) && defined(__clang__) +#include +#endif #define CLIP_U8(x) CLIP3(0, UINT8_MAX, (x)) #define CLIP_S8(x) CLIP3(INT8_MIN, INT8_MAX, (x)) @@ -71,7 +74,7 @@ /* For MSVC x64 */ -#ifdef _MSC_VER +#if defined(_MSC_VER) && !defined(__clang__) static inline int __builtin_clz(unsigned x) { diff --git a/src/Cafe/HW/Espresso/PPCTimer.cpp b/src/Cafe/HW/Espresso/PPCTimer.cpp index bcf1a58d..2a1a7669 100644 --- a/src/Cafe/HW/Espresso/PPCTimer.cpp +++ b/src/Cafe/HW/Espresso/PPCTimer.cpp @@ -110,7 +110,8 @@ uint64 PPCTimer_tscToMicroseconds(uint64 us) uint64 remainder; -#if _MSC_VER < 1923 + +#if _MSC_VER < 1923 || defined(__clang__) const uint64 microseconds = udiv128(r.low, r.high, _rdtscFrequency, &remainder); #else const uint64 microseconds = _udiv128(r.high, r.low, _rdtscFrequency, &remainder); @@ -158,7 +159,7 @@ uint64 PPCTimer_getFromRDTSC() #endif uint64 remainder; -#if _MSC_VER < 1923 +#if _MSC_VER < 1923 || defined(__clang__) uint64 elapsedTick = udiv128(_rdtscAcc.low, _rdtscAcc.high, _rdtscFrequency, &remainder); #else uint64 elapsedTick = _udiv128(_rdtscAcc.high, _rdtscAcc.low, _rdtscFrequency, &remainder); diff --git a/src/Cafe/HW/Latte/Core/LatteTextureCache.cpp b/src/Cafe/HW/Latte/Core/LatteTextureCache.cpp index 151f0661..2caa2cd0 100644 --- a/src/Cafe/HW/Latte/Core/LatteTextureCache.cpp +++ b/src/Cafe/HW/Latte/Core/LatteTextureCache.cpp @@ -145,7 +145,7 @@ uint32 LatteTexture_CalculateTextureDataHash(LatteTexture* hostTexture) bool isCompressedFormat = hostTexture->IsCompressedFormat(); if( isCompressedFormat == false ) { - #if BOOST_OS_WINDOWS +#if BOOST_OS_WINDOWS if (_cpuExtension_AVX2) { __m256i h256 = { 0 }; @@ -157,7 +157,11 @@ uint32 LatteTexture_CalculateTextureDataHash(LatteTexture* hostTexture) readPtr += (288 / 32); h256 = _mm256_xor_si256(h256, temp); } +#ifdef __clang__ + hashVal = h256[0] + h256[1] + h256[2] + h256[3] + h256[4] + h256[5] + h256[6] + h256[7]; +#else hashVal = h256.m256i_u32[0] + h256.m256i_u32[1] + h256.m256i_u32[2] + h256.m256i_u32[3] + h256.m256i_u32[4] + h256.m256i_u32[5] + h256.m256i_u32[6] + h256.m256i_u32[7]; +#endif } #else if( false ) {} diff --git a/src/Cafe/HW/Latte/Renderer/OpenGL/OpenGLRenderer.cpp b/src/Cafe/HW/Latte/Renderer/OpenGL/OpenGLRenderer.cpp index 80c72918..269f30e8 100644 --- a/src/Cafe/HW/Latte/Renderer/OpenGL/OpenGLRenderer.cpp +++ b/src/Cafe/HW/Latte/Renderer/OpenGL/OpenGLRenderer.cpp @@ -378,7 +378,7 @@ void OpenGLRenderer::GetVendorInformation() forceLog_printf("GL_RENDERER: %s", glRendererString ? glRendererString : "unknown"); forceLog_printf("GL_VERSION: %s", glVersionString ? glVersionString : "unknown"); - if(boost::icontains(glVersionString, "Mesa") || IsRunningInWine()) + if(boost::icontains(glVersionString, "Mesa")) { m_vendor = GfxVendor::Mesa; return; diff --git a/src/Cafe/HW/Latte/Renderer/Vulkan/VulkanRenderer.cpp b/src/Cafe/HW/Latte/Renderer/Vulkan/VulkanRenderer.cpp index e033d954..7c81a3c9 100644 --- a/src/Cafe/HW/Latte/Renderer/Vulkan/VulkanRenderer.cpp +++ b/src/Cafe/HW/Latte/Renderer/Vulkan/VulkanRenderer.cpp @@ -197,7 +197,9 @@ void VulkanRenderer::DetermineVendor() break; } - if (IsRunningInWine()) + VkDriverId driverId = driverProperties.driverID; + + if(driverId == VK_DRIVER_ID_MESA_RADV || driverId == VK_DRIVER_ID_INTEL_OPEN_SOURCE_MESA) m_vendor = GfxVendor::Mesa; forceLog_printf("Using GPU: %s", properties.properties.deviceName); @@ -216,7 +218,7 @@ void VulkanRenderer::DetermineVendor() else { forceLog_printf("Driver version (as stored in device info): %08X", properties.properties.driverVersion); - + if(m_vendor == GfxVendor::Nvidia) { // if the driver does not support the extension, diff --git a/src/resource/cemu.rc b/src/resource/cemu.rc index 4781111df8a49cd45832f9e3529faf50f585f3e2..aaa2a850d9a44b4ac6a95a0c75646763b26e983b 100644 GIT binary patch literal 4689 zcmaFAd%wQEf^TMWQGRiLT8TnfW^rj^j)JqcwnBPpUTRTdNotBhQEG91X;E^jLUD3Y zWxT!oU1RD}@Nh!9UdXP;0PR|O-uSJ3=Wo|#va zS`2nLHC?68rCgeqlA4Am6sR5y3Vx}jB}Iuj3K}k{X^EvdC7KEvrFq$T`Q>>E#idEQ zIf;4cRtg3c7Mk$DDCXi)&P-EKghW}2hND|Ve2{Cfe`t`iYrKn(kETLRjRLY{h+~j@ zd{k7FCYO(+pL?jIyQ>0-5%1?38WQB_qXROYi|Rh(($`n;OwP{(#WjqrP@Y+mp^%eb zo?2X@;OU}JmY7qTs!))Vn4FrTkd|3gT%u5tuaKHoTw0W>kXTTVlbM`Yl9`{UkO?tJ zp(r&sF*C1NAvr&UvbZEQw^)zMH$L3YCEnB7-_OvYAeQA&JLenos*W=>9O3f%Bu*N_lTKlfl1vxx}{h`ZwxOH1-|6H79aJAm70gonA(affARip9>e45l+R3(pxDptpZZ?Da91U zVVvdzORVuO zu1=xuTnHr!1{H=rT*|3A#i^*G1|U&TG(v>^gB1)a416G*kjMa6h(@qM!J$r25d$Bj zr0C@1@9eFh6kJl2nV0UCnUm_7mzEDnScvor3RS2=0}}&F1Ct~Jh!U^_JXwQyAROlC z6Y8p<1TxJf719jJ%+FKOQBVrc%v1K9-J2ODgY%)P0U0b9O~xg8KIyADg;2G z2*RN91eu0LU07lf$nUr!80w*rqQt!79B{p>1Zo?Y7+C5k7#bNEfD0Rt(I8Bl;vvY{ z#WBPYTy}!9fV*o@yi)+kD{u@^0_VaR@FF!PCM7kgG(A1F2wr8TmFDE==H}<;Ayp3r zdFe`ATu8RW2f4byO{0=6x<#oedT2HUIEDrzRdM9lRFGJTQq`f`;Nutx_lbf6SvKS( zR^kq<;1JhFT5=%-_iz;=E4WQX7 zz|TG2!_^11j8MRt=#feZNV8NoBQ>W0)P{znL6C7lu5LlD!5-k~gAq6!i)ma@YFbfh zafYt35t0L4gM$2_&3%}GxKcHyiK#_J`9-MaIeWM|d&ft*BDckfc42ZxYI1gNVo|nk zWoj|PTu+yvcsGB)5XW%WV1Hjk0foa{#7II+Oj>?kNn&|waei*9Zh2}Fh^tppk_H-A zKyG4^)77PJ|DFrnbw=&u!`i#lwMkze)aNBIz+nvU(}M>%s9mL^wD0rsOR%)@0qFz2 A!vFvP literal 9690 zcmezWPoF`bL4m=SA(J7Qp@<=$p_n0`A&sGgL4hHRA(Nq)p_Cz!A%{VM!I?puL7PE= zA)O(WA&()Ip@<=op@booA%#JKp@<92o)_f*C>>LK$2b zJQ@5M;u(S%Tp1i0Tp0Wr{1|)~A{pWtf*B$id>Nb={26>0g25(%Tr@Z_$d4eG!Ds~r zcPycv29B>>1_g!^h752>hA_A?L@x6@$Y#i6$Y&^L$OGrjQidc3U4|TnM20+ubOtL11qK6#3I+?X zdPt1tGr)3lF*vt?>;&aqP?#!0Ll=~jK_!3&gCm0*Lj*M61vB_Fgfav%I5W61#51@s z_%Qf@&8=amVNk%SGlapBA&9}9A)X-$3^l>F`Y<>$_%XOMgfciXxHEv#GE5|%!H>a} zA(SD6A&9||!G}Qy?gx-dK^PQLgA>DC2cs1jJQbMS+(+j{Q4JZ^rsRR_m#S9h zhwFnGTp2>3wXHitFkXMq!u6ms9+a0sxv>PCisKoK7|a;r87de88NBhPaZoC9XK-Zj z1((qQ3_%S33~mgb450LbE&QqPen@J`Whel*IYFrhImC4tOc@NYggdBAgw#Ti79h6z z9h5u582lN$8C)4$;3X=kBprMhFdjDb$npvd$_$7WWf(&+Lp(zm zxYh~=_uc%!?EyaqHwJ%j9~4xd!DK)=8zc_016Eq0>V?D=f^=o@We8;ewHZSg{279< z*aa%_Ks`lJ`;o9}Uj|18FR)3(st36lWHU&;0Rzb8kkZzLA(X+HAq36ugWKf_@H)Z` z9HyXJ4-_K74BpVzw=qK+gAdr3pi&?Wnr;-p{Qy@6Cx%c4cd#rrlOTN%L%9A_h8%`s zhExLT4Up7>dVQcg3kqd~4gTP|8PvalsYS?zFhnv0fcq67d6?Y@`Cx`n1}6qoRWMVq zm$6O^J`Da0&fpMHVh9HJ%|NZEbOtwuOokkWR0dCmJccxee6&&zyJ@iWfNH7%g9(EH zgCzrqPJ)--FtsomzlktaVc_0VC^!t1;BExPLdNtiv(44@uEDM@DfFrge13@~#;7*fGDfkw4Rx4|E3A}CftV`H#*1^EHg4u;tRbG;rz zDnkWBDoMTw0FUjYFqASRGn6op7A~9&sG*E%Rv38f4p!1b+=?jA373Gd@)9(%pv0iZ zpu~V&9}w0LDlZ@nS{<2_KEw zMh5kGLA{M6hEj%f@c1{V)fxltae-n7)R)v{NCTIGISjfCxeWQ>(G!pusKf`A`6&#r z9!&vw#0@dpfZack5p2+y4!TebU%Uk^zv5$cx)8Z zt{^vl0>EvbNE~U7e*OTB-c~Y@>kH6)i7P_@w6zUt9fM*4hUw)CP|qNhp@2abJe~*| z%^*IXAbbECZw^6=5BmE6G-6&tLOw@!Kcp7}3w;nh5biGnw+)Do0e1#}2K1Bzaytam z%Lggowh|}}rGUr8^KixisNH}%ZVH-10QJH^BSjEbBa_te0jQmbYwQ#<8VQH|<8DV!mm!3kW;gGQNx7|=^p+WP=9 zhoZ}n1fI)=^h7`f`!&k)Jr3LZ;9b{mXMeK#h9XZ4dAvKc@l{6!4e z47v=J;FT7*!WA?N2x<|7#>o7@t>