From 49ebeb07641a03cf1f551680733c2b2d072d20f3 Mon Sep 17 00:00:00 2001 From: emiyl Date: Mon, 20 Apr 2026 22:46:57 +0100 Subject: [PATCH] remove vulkan/opengl code if ENABLE_VULKAN or ENABLE_OPENGL is not defined --- CMakeLists.txt | 7 ++ src/CMakeLists.txt | 94 +++++++------- src/Cafe/CMakeLists.txt | 108 +++++++++------- src/Cafe/HW/Latte/Core/LatteBufferData.cpp | 4 + src/Cafe/HW/Latte/Core/LatteShader.cpp | 105 +++++++++++----- src/Cafe/HW/Latte/Core/LatteShaderCache.cpp | 115 ++++++++++++++---- src/Cafe/HW/Latte/Core/LatteTextureLegacy.cpp | 4 + .../HW/Latte/Core/LatteTextureReadback.cpp | 2 + src/Cafe/HW/Latte/Core/LatteTiming.cpp | 4 + .../HW/Latte/Renderer/RendererOuputShader.cpp | 4 + src/config/ActiveSettings.cpp | 5 + src/gui/wxgui/CMakeLists.txt | 18 ++- src/gui/wxgui/CemuApp.cpp | 4 + src/gui/wxgui/MainWindow.cpp | 22 +++- src/gui/wxgui/PadViewFrame.cpp | 13 ++ src/imgui/CMakeLists.txt | 18 ++- src/imgui/imgui_extension.cpp | 6 +- src/main.cpp | 9 +- 18 files changed, 381 insertions(+), 161 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index a00879fe..10fd422c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -115,6 +115,13 @@ option(ENABLE_VULKAN "Enables the Vulkan backend" ON) option(ENABLE_METAL "Enables the Metal backend" ${ENABLE_METAL_DEFAULT}) option(ENABLE_DISCORD_RPC "Enables the Discord Rich Presence feature" ON) +if (ENABLE_OPENGL) + set_compile_definitions(ENABLE_OPENGL) +else() +if (ENABLE_VULKAN) + add_compile_definitions(ENABLE_VULKAN) +else() + if (ENABLE_METAL AND NOT APPLE) message(FATAL_ERROR "Metal backend is only supported on Apple platforms") endif() diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index b7fd67fe..271bf00a 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -13,18 +13,24 @@ if(MSVC) add_compile_definitions(WIN32_LEAN_AND_MEAN CURL_STATICLIB) elseif(UNIX) if(APPLE) - add_compile_definitions( - _XOPEN_SOURCE - VK_USE_PLATFORM_MACOS_MVK - VK_USE_PLATFORM_METAL_EXT - ) + if (ENABLE_VULKAN) + add_compile_definitions( + _XOPEN_SOURCE + VK_USE_PLATFORM_MACOS_MVK + VK_USE_PLATFORM_METAL_EXT + ) + else() + add_compile_definitions(_XOPEN_SOURCE) + endif() else() - add_compile_definitions( - VK_USE_PLATFORM_XLIB_KHR # legacy. Do we need to support XLIB surfaces? - VK_USE_PLATFORM_XCB_KHR - ) - if (ENABLE_WAYLAND) - add_compile_definitions(VK_USE_PLATFORM_WAYLAND_KHR) + if (ENABLE_VULKAN) + add_compile_definitions( + VK_USE_PLATFORM_XLIB_KHR # legacy. Do we need to support XLIB surfaces? + VK_USE_PLATFORM_XCB_KHR + ) + if (ENABLE_WAYLAND) + add_compile_definitions(VK_USE_PLATFORM_WAYLAND_KHR) + endif() endif() endif() # warnings @@ -35,7 +41,9 @@ elseif(UNIX) add_compile_options(-Wno-multichar -Wno-invalid-offsetof -Wno-switch -Wno-ignored-attributes -Wno-deprecated-enum-enum-conversion) endif() -add_compile_definitions(VK_NO_PROTOTYPES) +if (ENABLE_VULKAN) + add_compile_definitions(VK_NO_PROTOTYPES) +endif() set(CMAKE_INCLUDE_CURRENT_DIR ON) @@ -113,42 +121,38 @@ if (MACOS_BUNDLE) COMMAND ${CMAKE_COMMAND} ARGS -E copy_directory "${CMAKE_SOURCE_DIR}/bin/${folder}" "${CMAKE_SOURCE_DIR}/bin/${OUTPUT_NAME}.app/Contents/SharedSupport/${folder}") endforeach(folder) - if(CMAKE_BUILD_TYPE STREQUAL "Debug") - set(LIBUSB_PATH "${CMAKE_BINARY_DIR}/vcpkg_installed/${VCPKG_TARGET_TRIPLET}/debug/lib/libusb-1.0.0.dylib") - else() - set(LIBUSB_PATH "${CMAKE_BINARY_DIR}/vcpkg_installed/${VCPKG_TARGET_TRIPLET}/lib/libusb-1.0.0.dylib") + if (ENABLE_VULKAN) + if (EXISTS "/usr/local/lib/libMoltenVK.dylib") + set(MOLTENVK_PATH "/usr/local/lib/libMoltenVK.dylib") + elseif (EXISTS "/opt/homebrew/lib/libMoltenVK.dylib") + set(MOLTENVK_PATH "/opt/homebrew/lib/libMoltenVK.dylib") + else() + message(FATAL_ERROR "failed to find libMoltenVK.dylib") + endif () + + add_custom_command (TARGET CemuBin POST_BUILD + COMMAND ${CMAKE_COMMAND} ARGS -E copy "${MOLTENVK_PATH}" "${CMAKE_SOURCE_DIR}/bin/${OUTPUT_NAME}.app/Contents/Frameworks/libMoltenVK.dylib" + COMMAND ${CMAKE_COMMAND} ARGS -E copy "${CMAKE_SOURCE_DIR}/src/resource/update.sh" "${CMAKE_SOURCE_DIR}/bin/${OUTPUT_NAME}.app/Contents/MacOS/update.sh" + COMMAND bash -c "install_name_tool -add_rpath @executable_path/../Frameworks ${CMAKE_SOURCE_DIR}/bin/${OUTPUT_NAME}.app/Contents/MacOS/${OUTPUT_NAME}") endif() - - if (EXISTS "/usr/local/lib/libMoltenVK.dylib") - set(MOLTENVK_PATH "/usr/local/lib/libMoltenVK.dylib") - elseif (EXISTS "/opt/homebrew/lib/libMoltenVK.dylib") - set(MOLTENVK_PATH "/opt/homebrew/lib/libMoltenVK.dylib") - else() - message(FATAL_ERROR "failed to find libMoltenVK.dylib") - endif () - - add_custom_command (TARGET CemuBin POST_BUILD - COMMAND ${CMAKE_COMMAND} ARGS -E copy "${MOLTENVK_PATH}" "${CMAKE_SOURCE_DIR}/bin/${OUTPUT_NAME}.app/Contents/Frameworks/libMoltenVK.dylib" - COMMAND ${CMAKE_COMMAND} ARGS -E copy "${LIBUSB_PATH}" "${CMAKE_SOURCE_DIR}/bin/${OUTPUT_NAME}.app/Contents/Frameworks/libusb-1.0.0.dylib" - COMMAND ${CMAKE_COMMAND} ARGS -E copy "${CMAKE_SOURCE_DIR}/src/resource/update.sh" "${CMAKE_SOURCE_DIR}/bin/${OUTPUT_NAME}.app/Contents/MacOS/update.sh" - COMMAND bash -c "install_name_tool -add_rpath @executable_path/../Frameworks ${CMAKE_SOURCE_DIR}/bin/${OUTPUT_NAME}.app/Contents/MacOS/${OUTPUT_NAME}" - COMMAND install_name_tool -change @rpath/libusb-1.0.0.dylib @executable_path/../Frameworks/libusb-1.0.0.dylib ${CMAKE_SOURCE_DIR}/bin/${OUTPUT_NAME}.app/Contents/MacOS/${OUTPUT_NAME}) else() if(APPLE) - find_library(MOLTENVK_LIBRARY - NAMES MoltenVK moltenvk libMoltenVK.dylib - PATHS /usr/local/lib /opt/homebrew/lib - ) - if(MOLTENVK_LIBRARY) - message(STATUS "Found MoltenVK: ${MOLTENVK_LIBRARY}") - target_link_libraries(CemuBin PRIVATE ${MOLTENVK_LIBRARY}) - else() - message(WARNING "libMoltenVK.dylib not found") - endif() - set_target_properties(CemuBin PROPERTIES - BUILD_WITH_INSTALL_RPATH TRUE - INSTALL_RPATH "/usr/local/lib;/opt/homebrew/lib" - ) + if (ENABLE_VULKAN) + find_library(MOLTENVK_LIBRARY + NAMES MoltenVK moltenvk libMoltenVK.dylib + PATHS /usr/local/lib /opt/homebrew/lib + ) + if(MOLTENVK_LIBRARY) + message(STATUS "Found MoltenVK: ${MOLTENVK_LIBRARY}") + target_link_libraries(CemuBin PRIVATE ${MOLTENVK_LIBRARY}) + else() + message(WARNING "libMoltenVK.dylib not found") + endif() + set_target_properties(CemuBin PROPERTIES + BUILD_WITH_INSTALL_RPATH TRUE + INSTALL_RPATH "/usr/local/lib;/opt/homebrew/lib" + ) + endif() endif() endif() diff --git a/src/Cafe/CMakeLists.txt b/src/Cafe/CMakeLists.txt index 78a8cce0..2b9d8e28 100644 --- a/src/Cafe/CMakeLists.txt +++ b/src/Cafe/CMakeLists.txt @@ -162,58 +162,12 @@ add_library(CemuCafe HW/Latte/LegacyShaderDecompiler/LatteDecompilerInstructions.h HW/Latte/LegacyShaderDecompiler/LatteDecompilerInternal.h HW/Latte/LegacyShaderDecompiler/LatteDecompilerRegisterDataTypeTracker.cpp - HW/Latte/Renderer/OpenGL/CachedFBOGL.h - HW/Latte/Renderer/OpenGL/LatteTextureGL.cpp - HW/Latte/Renderer/OpenGL/LatteTextureGL.h - HW/Latte/Renderer/OpenGL/LatteTextureViewGL.cpp - HW/Latte/Renderer/OpenGL/LatteTextureViewGL.h - HW/Latte/Renderer/OpenGL/OpenGLQuery.cpp - HW/Latte/Renderer/OpenGL/OpenGLRendererCore.cpp - HW/Latte/Renderer/OpenGL/OpenGLRenderer.cpp - HW/Latte/Renderer/OpenGL/OpenGLRenderer.h - HW/Latte/Renderer/OpenGL/OpenGLRendererStreamout.cpp - HW/Latte/Renderer/OpenGL/OpenGLRendererUniformData.cpp - HW/Latte/Renderer/OpenGL/OpenGLSurfaceCopy.cpp - HW/Latte/Renderer/OpenGL/OpenGLTextureReadback.h - HW/Latte/Renderer/OpenGL/RendererShaderGL.cpp - HW/Latte/Renderer/OpenGL/RendererShaderGL.h - HW/Latte/Renderer/OpenGL/TextureReadbackGL.cpp HW/Latte/Renderer/Renderer.cpp HW/Latte/Renderer/Renderer.h HW/Latte/Renderer/RendererOuputShader.cpp HW/Latte/Renderer/RendererOuputShader.h HW/Latte/Renderer/RendererShader.cpp HW/Latte/Renderer/RendererShader.h - HW/Latte/Renderer/Vulkan/CachedFBOVk.cpp - HW/Latte/Renderer/Vulkan/CachedFBOVk.h - HW/Latte/Renderer/Vulkan/CocoaSurface.h - HW/Latte/Renderer/Vulkan/LatteTextureViewVk.cpp - HW/Latte/Renderer/Vulkan/LatteTextureViewVk.h - HW/Latte/Renderer/Vulkan/LatteTextureVk.cpp - HW/Latte/Renderer/Vulkan/LatteTextureVk.h - HW/Latte/Renderer/Vulkan/RendererShaderVk.cpp - HW/Latte/Renderer/Vulkan/RendererShaderVk.h - HW/Latte/Renderer/Vulkan/SwapchainInfoVk.cpp - HW/Latte/Renderer/Vulkan/SwapchainInfoVk.h - HW/Latte/Renderer/Vulkan/TextureReadbackVk.cpp - HW/Latte/Renderer/Vulkan/VKRBase.h - HW/Latte/Renderer/Vulkan/VKRMemoryManager.cpp - HW/Latte/Renderer/Vulkan/VKRMemoryManager.h - HW/Latte/Renderer/Vulkan/VKRPipelineInfo.cpp - HW/Latte/Renderer/Vulkan/VsyncDriver.cpp - HW/Latte/Renderer/Vulkan/VsyncDriver.h - HW/Latte/Renderer/Vulkan/VulkanAPI.cpp - HW/Latte/Renderer/Vulkan/VulkanAPI.h - HW/Latte/Renderer/Vulkan/VulkanPipelineCompiler.cpp - HW/Latte/Renderer/Vulkan/VulkanPipelineCompiler.h - HW/Latte/Renderer/Vulkan/VulkanPipelineStableCache.cpp - HW/Latte/Renderer/Vulkan/VulkanPipelineStableCache.h - HW/Latte/Renderer/Vulkan/VulkanQuery.cpp - HW/Latte/Renderer/Vulkan/VulkanRendererCore.cpp - HW/Latte/Renderer/Vulkan/VulkanRenderer.cpp - HW/Latte/Renderer/Vulkan/VulkanRenderer.h - HW/Latte/Renderer/Vulkan/VulkanSurfaceCopy.cpp - HW/Latte/Renderer/Vulkan/VulkanTextureReadback.h HW/Latte/ShaderInfo/ShaderDescription.cpp HW/Latte/ShaderInfo/ShaderInfo.h HW/Latte/ShaderInfo/ShaderInstanceInfo.cpp @@ -539,12 +493,72 @@ add_library(CemuCafe TitleList/TitleList.h ) +if (ENABLE_OPENGL) + target_sources(CemuCafe PRIVATE + HW/Latte/Renderer/OpenGL/CachedFBOGL.h + HW/Latte/Renderer/OpenGL/LatteTextureGL.cpp + HW/Latte/Renderer/OpenGL/LatteTextureGL.h + HW/Latte/Renderer/OpenGL/LatteTextureViewGL.cpp + HW/Latte/Renderer/OpenGL/LatteTextureViewGL.h + HW/Latte/Renderer/OpenGL/OpenGLQuery.cpp + HW/Latte/Renderer/OpenGL/OpenGLRendererCore.cpp + HW/Latte/Renderer/OpenGL/OpenGLRenderer.cpp + HW/Latte/Renderer/OpenGL/OpenGLRenderer.h + HW/Latte/Renderer/OpenGL/OpenGLRendererStreamout.cpp + HW/Latte/Renderer/OpenGL/OpenGLRendererUniformData.cpp + HW/Latte/Renderer/OpenGL/OpenGLSurfaceCopy.cpp + HW/Latte/Renderer/OpenGL/OpenGLTextureReadback.h + HW/Latte/Renderer/OpenGL/RendererShaderGL.cpp + HW/Latte/Renderer/OpenGL/RendererShaderGL.h + HW/Latte/Renderer/OpenGL/TextureReadbackGL.cpp + ) +endif() + +if (ENABLE_VULKAN) + target_sources(CemuCafe PRIVATE + HW/Latte/Renderer/Vulkan/CachedFBOVk.cpp + HW/Latte/Renderer/Vulkan/CachedFBOVk.h + HW/Latte/Renderer/Vulkan/CocoaSurface.h + HW/Latte/Renderer/Vulkan/LatteTextureViewVk.cpp + HW/Latte/Renderer/Vulkan/LatteTextureViewVk.h + HW/Latte/Renderer/Vulkan/LatteTextureVk.cpp + HW/Latte/Renderer/Vulkan/LatteTextureVk.h + HW/Latte/Renderer/Vulkan/RendererShaderVk.cpp + HW/Latte/Renderer/Vulkan/RendererShaderVk.h + HW/Latte/Renderer/Vulkan/SwapchainInfoVk.cpp + HW/Latte/Renderer/Vulkan/SwapchainInfoVk.h + HW/Latte/Renderer/Vulkan/TextureReadbackVk.cpp + HW/Latte/Renderer/Vulkan/VKRBase.h + HW/Latte/Renderer/Vulkan/VKRMemoryManager.cpp + HW/Latte/Renderer/Vulkan/VKRMemoryManager.h + HW/Latte/Renderer/Vulkan/VKRPipelineInfo.cpp + HW/Latte/Renderer/Vulkan/VsyncDriver.cpp + HW/Latte/Renderer/Vulkan/VsyncDriver.h + HW/Latte/Renderer/Vulkan/VulkanAPI.cpp + HW/Latte/Renderer/Vulkan/VulkanAPI.h + HW/Latte/Renderer/Vulkan/VulkanPipelineCompiler.cpp + HW/Latte/Renderer/Vulkan/VulkanPipelineCompiler.h + HW/Latte/Renderer/Vulkan/VulkanPipelineStableCache.cpp + HW/Latte/Renderer/Vulkan/VulkanPipelineStableCache.h + HW/Latte/Renderer/Vulkan/VulkanQuery.cpp + HW/Latte/Renderer/Vulkan/VulkanRendererCore.cpp + HW/Latte/Renderer/Vulkan/VulkanRenderer.cpp + HW/Latte/Renderer/Vulkan/VulkanRenderer.h + HW/Latte/Renderer/Vulkan/VulkanSurfaceCopy.cpp + HW/Latte/Renderer/Vulkan/VulkanTextureReadback.h + ) +endif() + if(APPLE) target_sources(CemuCafe PRIVATE - HW/Latte/Renderer/Vulkan/CocoaSurface.mm HW/Latte/Renderer/MetalView.mm HW/Latte/Renderer/MetalView.h ) + if (ENABLE_VULKAN) + target_sources(CemuCafe PRIVATE + HW/Latte/Renderer/Vulkan/CocoaSurface.mm + ) + endif() endif() if(ENABLE_METAL) diff --git a/src/Cafe/HW/Latte/Core/LatteBufferData.cpp b/src/Cafe/HW/Latte/Core/LatteBufferData.cpp index 7620e6a7..9d606e72 100644 --- a/src/Cafe/HW/Latte/Core/LatteBufferData.cpp +++ b/src/Cafe/HW/Latte/Core/LatteBufferData.cpp @@ -9,7 +9,9 @@ #include "Cafe/GameProfile/GameProfile.h" #include "Cafe/HW/Latte/Core/LatteBufferCache.h" +#ifdef ENABLE_VULKAN #include "Cafe/HW/Latte/Renderer/Vulkan/VulkanRenderer.h" +#endif template void rectGenerate4thVertex(uint32be* output, uint32be* input0, uint32be* input1, uint32be* input2) @@ -199,6 +201,7 @@ bool LatteBufferCache_Sync(uint32 minIndex, uint32 maxIndex, uint32 baseInstance #if BOOST_OS_MACOS if(bufferStride % 4 != 0) { + #ifdef ENABLE_VULKAN if (g_renderer->GetType() == RendererAPI::Vulkan) { if (VulkanRenderer* vkRenderer = VulkanRenderer::GetInstance()) @@ -208,6 +211,7 @@ bool LatteBufferCache_Sync(uint32 minIndex, uint32 maxIndex, uint32 baseInstance continue; } } + #endif } #endif diff --git a/src/Cafe/HW/Latte/Core/LatteShader.cpp b/src/Cafe/HW/Latte/Core/LatteShader.cpp index 91de6310..2f9bac94 100644 --- a/src/Cafe/HW/Latte/Core/LatteShader.cpp +++ b/src/Cafe/HW/Latte/Core/LatteShader.cpp @@ -6,7 +6,9 @@ #include "Cafe/HW/Latte/LegacyShaderDecompiler/LatteDecompiler.h" #include "Cafe/HW/Latte/Core/FetchShader.h" #include "Cafe/HW/Latte/Core/LattePerformanceMonitor.h" +#ifdef ENABLE_VULKAN #include "Cafe/HW/Latte/Renderer/Vulkan/VulkanRenderer.h" +#endif #include "Cafe/OS/libs/gx2/GX2.h" // todo - remove dependency #include "Cafe/GraphicPack/GraphicPack2.h" #include "HW/Latte/Core/Latte.h" @@ -683,20 +685,69 @@ uint64 LatteSHRC_CalcPSAuxHash(LatteDecompilerShader* pixelShader, uint32* conte return auxHash; } +void InitUniformLayoutFromDecompiler( + LatteDecompilerShader* shader, + const LatteDecompilerOutput_t& decompilerOutput +) +{ + const auto& offsets = decompilerOutput.uniformOffsetsVK; + + shader->uniform.loc_remapped = offsets.offset_remapped; + shader->uniform.loc_uniformRegister = offsets.offset_uniformRegister; + shader->uniform.count_uniformRegister = offsets.count_uniformRegister; + shader->uniform.loc_windowSpaceToClipSpaceTransform = offsets.offset_windowSpaceToClipSpaceTransform; + shader->uniform.loc_alphaTestRef = offsets.offset_alphaTestRef; + shader->uniform.loc_pointSize = offsets.offset_pointSize; + shader->uniform.loc_fragCoordScale = offsets.offset_fragCoordScale; + + // Texture scale uniforms + shader->uniform.list_ufTexRescale.clear(); + for (sint32 t = 0; t < LATTE_NUM_MAX_TEX_UNITS; t++) + { + if (offsets.offset_texScale[t] >= 0) + { + LatteUniformTextureScaleEntry_t entry{}; + entry.texUnit = t; + entry.uniformLocation = offsets.offset_texScale[t]; + shader->uniform.list_ufTexRescale.push_back(entry); + } + } + + shader->uniform.loc_verticesPerInstance = offsets.offset_verticesPerInstance; + + // Streamout buffers + for (sint32 t = 0; t < LATTE_NUM_STREAMOUT_BUFFER; t++) + { + shader->uniform.loc_streamoutBufferBase[t] = offsets.offset_streamoutBufferBase[t]; + } + + shader->uniform.uniformRangeSize = offsets.offset_endOfBlock; +} + LatteDecompilerShader* LatteShader_CreateShaderFromDecompilerOutput(LatteDecompilerOutput_t& decompilerOutput, uint64 baseHash, bool calculateAuxHash, uint64 optionalAuxHash, uint32* contextRegister) { LatteDecompilerShader* shader = decompilerOutput.shader; shader->baseHash = baseHash; // copy resource mapping // HACK - if (g_renderer->GetType() == RendererAPI::OpenGL) + switch (g_renderer->GetType()) + { +#ifdef ENABLE_OPENGL + case RendererAPI::OpenGL: shader->resourceMapping = decompilerOutput.resourceMappingGL; - else if (g_renderer->GetType() == RendererAPI::Vulkan) - shader->resourceMapping = decompilerOutput.resourceMappingVK; -#if ENABLE_METAL - else - shader->resourceMapping = decompilerOutput.resourceMappingMTL; + break; #endif +#ifdef ENABLE_VULKAN + case RendererAPI::Vulkan: + shader->resourceMapping = decompilerOutput.resourceMappingVK; + break; +#endif +#if ENABLE_METAL + case RendererAPI::Metal: + shader->resourceMapping = decompilerOutput.resourceMappingMTL; + break; +#endif + } // copy texture info shader->textureUnitMask2 = decompilerOutput.textureUnitMask; // copy streamout info @@ -705,33 +756,23 @@ LatteDecompilerShader* LatteShader_CreateShaderFromDecompilerOutput(LatteDecompi // copy uniform offsets // for OpenGL these are retrieved in _prepareSeparableUniforms() // HACK - if (g_renderer->GetType() == RendererAPI::Vulkan || g_renderer->GetType() == RendererAPI::Metal) - { - shader->uniform.loc_remapped = decompilerOutput.uniformOffsetsVK.offset_remapped; - shader->uniform.loc_uniformRegister = decompilerOutput.uniformOffsetsVK.offset_uniformRegister; - shader->uniform.count_uniformRegister = decompilerOutput.uniformOffsetsVK.count_uniformRegister; - shader->uniform.loc_windowSpaceToClipSpaceTransform = decompilerOutput.uniformOffsetsVK.offset_windowSpaceToClipSpaceTransform; - shader->uniform.loc_alphaTestRef = decompilerOutput.uniformOffsetsVK.offset_alphaTestRef; - shader->uniform.loc_pointSize = decompilerOutput.uniformOffsetsVK.offset_pointSize; - shader->uniform.loc_fragCoordScale = decompilerOutput.uniformOffsetsVK.offset_fragCoordScale; - for (sint32 t = 0; t < LATTE_NUM_MAX_TEX_UNITS; t++) - { - if (decompilerOutput.uniformOffsetsVK.offset_texScale[t] >= 0) - { - LatteUniformTextureScaleEntry_t entry = { 0 }; - entry.texUnit = t; - entry.uniformLocation = decompilerOutput.uniformOffsetsVK.offset_texScale[t]; - shader->uniform.list_ufTexRescale.push_back(entry); - } - } - shader->uniform.loc_verticesPerInstance = decompilerOutput.uniformOffsetsVK.offset_verticesPerInstance; - for (sint32 t = 0; t < LATTE_NUM_STREAMOUT_BUFFER; t++) - shader->uniform.loc_streamoutBufferBase[t] = decompilerOutput.uniformOffsetsVK.offset_streamoutBufferBase[t]; - shader->uniform.uniformRangeSize = decompilerOutput.uniformOffsetsVK.offset_endOfBlock; - } - else + switch (g_renderer->GetType()) { +#ifdef ENABLE_OPENGL + case RendererAPI::OpenGL: shader->uniform.count_uniformRegister = decompilerOutput.uniformOffsetsGL.count_uniformRegister; + break; +#endif +#ifdef ENABLE_VULKAN + case RendererAPI::Vulkan: + InitUniformLayoutFromDecompiler(shader, decompilerOutput); + break; +#endif +#if ENABLE_METAL + case RendererAPI::Metal: + InitUniformLayoutFromDecompiler(shader, decompilerOutput); + break; +#endif } // calculate aux hash if (calculateAuxHash) @@ -766,10 +807,12 @@ void LatteShader_GetDecompilerOptions(LatteDecompilerOptions& options, LatteCons options.usesGeometryShader = geometryShaderEnabled; options.spirvInstrinsics.hasRoundingModeRTEFloat32 = false; options.useTFViaSSBO = g_renderer->UseTFViaSSBO(); + #ifdef ENABLE_VULKAN if (g_renderer->GetType() == RendererAPI::Vulkan) { options.spirvInstrinsics.hasRoundingModeRTEFloat32 = VulkanRenderer::GetInstance()->HasSPRIVRoundingModeRTE32(); } + #endif options.strictMul = g_current_game_profile->GetAccurateShaderMul() != AccurateShaderMulOption::False; } diff --git a/src/Cafe/HW/Latte/Core/LatteShaderCache.cpp b/src/Cafe/HW/Latte/Core/LatteShaderCache.cpp index 14a1f9b0..d723797d 100644 --- a/src/Cafe/HW/Latte/Core/LatteShaderCache.cpp +++ b/src/Cafe/HW/Latte/Core/LatteShaderCache.cpp @@ -9,13 +9,17 @@ #include "WindowSystem.h" #include "Cafe/HW/Latte/Renderer/Renderer.h" +#ifdef ENABLE_OPENGL #include "Cafe/HW/Latte/Renderer/OpenGL/RendererShaderGL.h" +#endif +#ifdef ENABLE_VULKAN #include "Cafe/HW/Latte/Renderer/Vulkan/RendererShaderVk.h" +#include "Cafe/HW/Latte/Renderer/Vulkan/VulkanPipelineStableCache.h" +#endif #if ENABLE_METAL #include "Cafe/HW/Latte/Renderer/Metal/RendererShaderMtl.h" #include "Cafe/HW/Latte/Renderer/Metal/MetalPipelineCache.h" #endif -#include "Cafe/HW/Latte/Renderer/Vulkan/VulkanPipelineStableCache.h" #include #include "imgui/imgui_extension.h" @@ -273,13 +277,23 @@ static BootSoundPlayer g_bootSndPlayer; void LatteShaderCache_finish() { - if (g_renderer->GetType() == RendererAPI::Vulkan) + switch (g_renderer->GetType()) + { +#ifdef ENABLE_VULKAN + case: RendererAPI::Vulkan: RendererShaderVk::ShaderCacheLoading_end(); - else if (g_renderer->GetType() == RendererAPI::OpenGL) + return; +#endif +#ifdef ENABLE_OPENGL + case RendererAPI::OpenGL: RendererShaderGL::ShaderCacheLoading_end(); + return; + } +#endif #if ENABLE_METAL - else if (g_renderer->GetType() == RendererAPI::Metal) - RendererShaderMtl::ShaderCacheLoading_end(); + case RendererAPI::Metal: + RendererShaderMtl::ShaderCacheLoading_end(); + return; #endif } @@ -359,14 +373,24 @@ void LatteShaderCache_Load() fs::create_directories(ActiveSettings::GetCachePath("shaderCache/transferable"), ec); fs::create_directories(ActiveSettings::GetCachePath("shaderCache/precompiled"), ec); // initialize renderer specific caches - if (g_renderer->GetType() == RendererAPI::Vulkan) + switch(g_renderer->GetType()) + { +#ifdef ENABLE_VULKAN + case: RendererAPI::Vulkan RendererShaderVk::ShaderCacheLoading_begin(cacheTitleId); - else if (g_renderer->GetType() == RendererAPI::OpenGL) - RendererShaderGL::ShaderCacheLoading_begin(cacheTitleId); -#if ENABLE_METAL - else if (g_renderer->GetType() == RendererAPI::Metal) - RendererShaderMtl::ShaderCacheLoading_begin(cacheTitleId); + break; #endif +#ifdef ENABLE_OPENGL + case: RendererAPI::OpenGL: + RendererShaderGL::ShaderCacheLoading_begin(cacheTitleId); + break; +#endif +#if ENABLE_METAL + case: RendererAPI::Metal: + RendererShaderMtl::ShaderCacheLoading_begin(cacheTitleId); + break; +#endif + } // get cache file name fs::path pathGeneric; @@ -634,31 +658,52 @@ void LatteShaderCache_ShowProgress(const std::function & loadUpdateF void LatteShaderCache_LoadPipelineCache(uint64 cacheTitleId) { - if (g_renderer->GetType() == RendererAPI::Vulkan) + switch(g_renderer->GetType()) + { + #ifdef ENABLE_VULKAN + case RendererAPI::Vulkan: g_shaderCacheLoaderState.pipelineFileCount = VulkanPipelineStableCache::GetInstance().BeginLoading(cacheTitleId); + break; + #endif #if ENABLE_METAL - else if (g_renderer->GetType() == RendererAPI::Metal) + case RendererAPI::Metal: g_shaderCacheLoaderState.pipelineFileCount = MetalPipelineCache::GetInstance().BeginLoading(cacheTitleId); + break; #endif + } + g_shaderCacheLoaderState.loadedPipelines = 0; LatteShaderCache_ShowProgress(LatteShaderCache_updatePipelineLoadingProgress, true); - if (g_renderer->GetType() == RendererAPI::Vulkan) + + switch(g_renderer->GetType()) + { +#ifdef ENABLE_VULKAN + case RendererAPI::Vulkan: VulkanPipelineStableCache::GetInstance().EndLoading(); -#if ENABLE_METAL - else if (g_renderer->GetType() == RendererAPI::Metal) - MetalPipelineCache::GetInstance().EndLoading(); + break; #endif +#if ENABLE_METAL + case RendererAPI::Metal: + MetalPipelineCache::GetInstance().EndLoading(); + break; +#endif + } } bool LatteShaderCache_updatePipelineLoadingProgress() { uint32 pipelinesMissingShaders = 0; - if (g_renderer->GetType() == RendererAPI::Vulkan) + switch(g_renderer->GetType()) + { +#ifdef ENABLE_VULKAN + case RendererAPI::Vulkan: return VulkanPipelineStableCache::GetInstance().UpdateLoading(g_shaderCacheLoaderState.loadedPipelines, pipelinesMissingShaders); +#endif #if ENABLE_METAL - else if (g_renderer->GetType() == RendererAPI::Metal) + case RendererAPI::Metal: return MetalPipelineCache::GetInstance().UpdateLoading(g_shaderCacheLoaderState.loadedPipelines, pipelinesMissingShaders); #endif + } return false; } @@ -918,20 +963,36 @@ void LatteShaderCache_Close() delete s_shaderCacheGeneric; s_shaderCacheGeneric = nullptr; } - if (g_renderer->GetType() == RendererAPI::Vulkan) + switch(g_renderer->GetType()) + { +#ifdef ENABLE_VULKAN + case RendererAPI::Vulkan: RendererShaderVk::ShaderCacheLoading_Close(); - else if (g_renderer->GetType() == RendererAPI::OpenGL) + break; +#endif +#ifdef ENABLE_OPENGL + case RendererAPI::OpenGL: RendererShaderGL::ShaderCacheLoading_Close(); + break; +#endif #if ENABLE_METAL - else if (g_renderer->GetType() == RendererAPI::Metal) - RendererShaderMtl::ShaderCacheLoading_Close(); + case RendererAPI::Metal: + RendererShaderMtl::ShaderCacheLoading_Close(); + break; #endif // if Vulkan or Metal then also close pipeline cache - if (g_renderer->GetType() == RendererAPI::Vulkan) - VulkanPipelineStableCache::GetInstance().Close(); + switch(g_renderer->GetType()) + { + #ifdef ENABLE_VULKAN + case: RendererAPI::Vulkan: + VulkanPipelineStableCache::GetInstance().Close(); + break; + #endif #if ENABLE_METAL - else if (g_renderer->GetType() == RendererAPI::Metal) - MetalPipelineCache::GetInstance().Close(); + case: RendererAPI::Metal: + MetalPipelineCache::GetInstance().Close(); + break; #endif + } } diff --git a/src/Cafe/HW/Latte/Core/LatteTextureLegacy.cpp b/src/Cafe/HW/Latte/Core/LatteTextureLegacy.cpp index 4c11e57c..f54cf064 100644 --- a/src/Cafe/HW/Latte/Core/LatteTextureLegacy.cpp +++ b/src/Cafe/HW/Latte/Core/LatteTextureLegacy.cpp @@ -4,9 +4,11 @@ #include "Cafe/HW/Latte/Renderer/Renderer.h" +#ifdef ENABLE_OPENGL #include "Cafe/HW/Latte/Renderer/OpenGL/OpenGLRenderer.h" #include "Cafe/HW/Latte/Renderer/OpenGL/LatteTextureGL.h" #include "Cafe/HW/Latte/Renderer/OpenGL/LatteTextureViewGL.h" +#endif struct TexScaleXY { @@ -192,6 +194,7 @@ void LatteTexture_updateTexturesForStage(LatteDecompilerShader* shaderContext, u LatteGPUState.repeatTextureInitialization = true; } + #ifdef ENABLE_OPENGL if (g_renderer->GetType() == RendererAPI::OpenGL) { // on OpenGL, texture views and sampler parameters are tied together (we are avoiding sampler objects due to driver bugs) @@ -214,6 +217,7 @@ void LatteTexture_updateTexturesForStage(LatteDecompilerShader* shaderContext, u textureView->lastTextureBindIndex = LatteGPUState.textureBindCounter; rendererGL->renderstate_updateTextureSettingsGL(shaderContext, textureView, textureIndex + glBackendBaseTexUnit, word4, textureIndex, isDepthSampler); } + #endif g_renderer->texture_setLatteTexture(textureView, textureIndex + glBackendBaseTexUnit); // update if data changed bool swizzleChanged = false; diff --git a/src/Cafe/HW/Latte/Core/LatteTextureReadback.cpp b/src/Cafe/HW/Latte/Core/LatteTextureReadback.cpp index 8df5dcea..b0a6bdf5 100644 --- a/src/Cafe/HW/Latte/Core/LatteTextureReadback.cpp +++ b/src/Cafe/HW/Latte/Core/LatteTextureReadback.cpp @@ -6,7 +6,9 @@ #include "Cafe/HW/Latte/Renderer/Renderer.h" #include "Cafe/HW/Latte/Core/LatteTexture.h" +#ifdef ENABLE_OPENGL #include "Cafe/HW/Latte/Renderer/OpenGL/LatteTextureViewGL.h" +#endif #define LOG_READBACK_TIME diff --git a/src/Cafe/HW/Latte/Core/LatteTiming.cpp b/src/Cafe/HW/Latte/Core/LatteTiming.cpp index 115b60d9..60f4c52d 100644 --- a/src/Cafe/HW/Latte/Core/LatteTiming.cpp +++ b/src/Cafe/HW/Latte/Core/LatteTiming.cpp @@ -1,6 +1,8 @@ #include "Cafe/HW/Latte/Core/Latte.h" #include "Cafe/OS/libs/gx2/GX2_Event.h" +#ifdef ENABLE_VULKAN #include "Cafe/HW/Latte/Renderer/Vulkan/VsyncDriver.h" +#endif #include "util/highresolutiontimer/HighResolutionTimer.h" #include "config/CemuConfig.h" #include "Cafe/CafeSystem.h" @@ -55,8 +57,10 @@ void LatteTiming_EnableHostDrivenVSync() { if (s_usingHostDrivenVSync) return; + #ifdef ENABLE_VULKAN VsyncDriver_startThread(LatteTiming_NotifyHostVSync); s_usingHostDrivenVSync = true; + #endif } bool LatteTiming_IsUsingHostDrivenVSync() diff --git a/src/Cafe/HW/Latte/Renderer/RendererOuputShader.cpp b/src/Cafe/HW/Latte/Renderer/RendererOuputShader.cpp index a4f538a8..3c417e2b 100644 --- a/src/Cafe/HW/Latte/Renderer/RendererOuputShader.cpp +++ b/src/Cafe/HW/Latte/Renderer/RendererOuputShader.cpp @@ -1,5 +1,9 @@ #include "Cafe/HW/Latte/Renderer/RendererOuputShader.h" +#include "Cafe/HW/Latte/Renderer/Renderer.h" +#include "Cafe/HW/Latte/Core/Latte.h" +#ifdef ENABLE_OPENGL #include "Cafe/HW/Latte/Renderer/OpenGL/OpenGLRenderer.h" +#endif #include "config/ActiveSettings.h" const std::string RendererOutputShader::s_copy_shader_source = diff --git a/src/config/ActiveSettings.cpp b/src/config/ActiveSettings.cpp index 862ac6c3..9ab146a4 100644 --- a/src/config/ActiveSettings.cpp +++ b/src/config/ActiveSettings.cpp @@ -1,7 +1,9 @@ #include "Cafe/GameProfile/GameProfile.h" #include "Cafe/IOSU/legacy/iosu_crypto.h" #include "Cafe/HW/Latte/Core/Latte.h" +#ifdef ENABLE_VULKAN #include "Cafe/HW/Latte/Renderer/Vulkan/VulkanAPI.h" +#endif #include "Cafe/CafeSystem.h" #include "Cemu/Logging/CemuLogging.h" #include "config/ActiveSettings.h" @@ -107,9 +109,12 @@ bool ActiveSettings::WaitForGX2DrawDoneEnabled() GraphicAPI ActiveSettings::GetGraphicsAPI() { GraphicAPI api = g_current_game_profile->GetGraphicsAPI().value_or(GetConfig().graphic_api); + + #ifdef ENABLE_VULKAN && HAS_OPENGL // check if vulkan even available if (api == kVulkan && !g_vulkan_available) api = kOpenGL; + #endif return api; } diff --git a/src/gui/wxgui/CMakeLists.txt b/src/gui/wxgui/CMakeLists.txt index 12fc62d9..7c7dc05e 100644 --- a/src/gui/wxgui/CMakeLists.txt +++ b/src/gui/wxgui/CMakeLists.txt @@ -1,9 +1,5 @@ add_library(CemuWxGui STATIC canvas/IRenderCanvas.h - canvas/OpenGLCanvas.cpp - canvas/OpenGLCanvas.h - canvas/VulkanCanvas.cpp - canvas/VulkanCanvas.h CemuApp.cpp CemuApp.h CemuUpdateWindow.cpp @@ -116,6 +112,20 @@ add_library(CemuWxGui STATIC wxHelper.h ) +if (ENABLE_OPENGL) + target_sources(CemuWxGui PRIVATE + canvas/OpenGLCanvas.cpp + canvas/OpenGLCanvas.h + ) +endif() + +if (ENABLE_VULKAN) + target_sources(CemuWxGui PRIVATE + canvas/VulkanCanvas.cpp + canvas/VulkanCanvas.h + ) +endif() + if (ENABLE_METAL) target_sources(CemuWxGui PRIVATE canvas/MetalCanvas.cpp diff --git a/src/gui/wxgui/CemuApp.cpp b/src/gui/wxgui/CemuApp.cpp index a900f10b..4160acb6 100644 --- a/src/gui/wxgui/CemuApp.cpp +++ b/src/gui/wxgui/CemuApp.cpp @@ -3,7 +3,9 @@ #include "wxgui/MainWindow.h" #include "wxgui/wxgui.h" #include "config/CemuConfig.h" +#ifdef ENABLE_VULKAN #include "Cafe/HW/Latte/Renderer/Vulkan/VulkanAPI.h" +#endif #include "Cafe/HW/Latte/Core/LatteOverlay.h" #include "config/ActiveSettings.h" #include "config/LaunchSettings.h" @@ -349,7 +351,9 @@ bool CemuApp::OnInit() __fastfail(0); } #endif + #ifdef ENABLE_VULKAN InitializeGlobalVulkan(); + #endif Bind(wxEVT_ACTIVATE_APP, &CemuApp::ActivateApp, this); diff --git a/src/gui/wxgui/MainWindow.cpp b/src/gui/wxgui/MainWindow.cpp index 4ef4fe08..4efb172a 100644 --- a/src/gui/wxgui/MainWindow.cpp +++ b/src/gui/wxgui/MainWindow.cpp @@ -11,8 +11,12 @@ #include "wxgui/windows/TextureRelationViewer/TextureRelationWindow.h" #include "wxgui/windows/PPCThreadsViewer/DebugPPCThreadsWindow.h" #include "AudioDebuggerWindow.h" +#ifdef ENABLE_OPENGL #include "wxgui/canvas/OpenGLCanvas.h" +#endif +#ifdef ENABLE_VULKAN #include "wxgui/canvas/VulkanCanvas.h" +#endif #if ENABLE_METAL #include "wxgui/canvas/MetalCanvas.h" #endif @@ -42,7 +46,9 @@ #include "wxgui/DownloadGraphicPacksWindow.h" #include "wxgui/GettingStartedDialog.h" #include "wxgui/helpers/wxHelpers.h" +#ifdef ENABLE_VULKAN #include "Cafe/HW/Latte/Renderer/Vulkan/VsyncDriver.h" +#endif #include "wxgui/input/InputSettings2.h" #include "wxgui/input/HotkeySettings.h" #include "input/InputManager.h" @@ -1601,15 +1607,25 @@ void MainWindow::CreateCanvas() this->GetSizer()->Add(m_game_panel, 1, wxEXPAND); // create canvas - if (ActiveSettings::GetGraphicsAPI() == kVulkan) + if (ActiveSettings::GetGraphicsAPI() == kVulkan) + { + #ifdef ENABLE_VULKAN m_render_canvas = new VulkanCanvas(m_game_panel, wxSize(1280, 720), true); + #endif + } else if (ActiveSettings::GetGraphicsAPI() == kOpenGL) + { + #ifdef ENABLE_OPENGL m_render_canvas = GLCanvas_Create(m_game_panel, wxSize(1280, 720), true); + #endif + } #if ENABLE_METAL else m_render_canvas = new MetalCanvas(m_game_panel, wxSize(1280, 720), true); #endif + cemu_assert(m_render_canvas != nullptr); + // mouse events m_render_canvas->Bind(wxEVT_MOTION, &MainWindow::OnMouseMove, this); m_render_canvas->Bind(wxEVT_MOUSEWHEEL, &MainWindow::OnMouseWheel, this); @@ -1670,7 +1686,9 @@ void MainWindow::OnSizeEvent(wxSizeEvent& event) event.Skip(); + #ifdef ENABLE_VULKAN VsyncDriver_notifyWindowPosChanged(); + #endif } void MainWindow::OnDPIChangedEvent(wxDPIChangedEvent& event) @@ -1691,7 +1709,9 @@ void MainWindow::OnMove(wxMoveEvent& event) if (m_debugger_window && m_debugger_window->IsShown()) m_debugger_window->OnParentMove(GetPosition(), GetSize()); + #ifdef ENABLE_VULKAN VsyncDriver_notifyWindowPosChanged(); + #endif } void MainWindow::OnDebuggerClose(wxCloseEvent& event) diff --git a/src/gui/wxgui/PadViewFrame.cpp b/src/gui/wxgui/PadViewFrame.cpp index 2079f1eb..6bcdb079 100644 --- a/src/gui/wxgui/PadViewFrame.cpp +++ b/src/gui/wxgui/PadViewFrame.cpp @@ -6,8 +6,12 @@ #include "config/ActiveSettings.h" #include "Cafe/OS/libs/swkbd/swkbd.h" +#ifdef ENABLE_OPENGL #include "wxgui/canvas/OpenGLCanvas.h" +#endif +#ifdef ENABLE_VULKAN #include "wxgui/canvas/VulkanCanvas.h" +#endif #if ENABLE_METAL #include "wxgui/canvas/MetalCanvas.h" #endif @@ -76,15 +80,24 @@ void PadViewFrame::InitializeRenderCanvas() auto sizer = new wxBoxSizer(wxVERTICAL); { if (ActiveSettings::GetGraphicsAPI() == kVulkan) + { + #ifdef ENABLE_VULKAN m_render_canvas = new VulkanCanvas(this, wxSize(854, 480), false); + #endif + } else if (ActiveSettings::GetGraphicsAPI() == kOpenGL) + { + #ifdef ENABLE_OPENGL m_render_canvas = GLCanvas_Create(this, wxSize(854, 480), false); + #endif + } #if ENABLE_METAL else m_render_canvas = new MetalCanvas(this, wxSize(854, 480), false); #endif sizer->Add(m_render_canvas, 1, wxEXPAND, 0, nullptr); } + cemu_assert(m_render_canvas != nullptr); SetSizer(sizer); Layout(); diff --git a/src/imgui/CMakeLists.txt b/src/imgui/CMakeLists.txt index e2d669c5..b5e91075 100644 --- a/src/imgui/CMakeLists.txt +++ b/src/imgui/CMakeLists.txt @@ -1,12 +1,22 @@ add_library(imguiImpl - imgui_impl_opengl3.cpp - imgui_impl_opengl3.h - imgui_impl_vulkan.cpp - imgui_impl_vulkan.h imgui_extension.cpp imgui_extension.h ) +if (ENABLE_OPENGL) + target_sources(imguiImpl PRIVATE + imgui_impl_opengl3.cpp + imgui_impl_opengl3.h + ) +endif() + +if (ENABLE_VULKAN) + target_sources(imguiImpl PRIVATE + imgui_impl_vulkan.cpp + imgui_impl_vulkan.h + ) +endif() + if (ENABLE_METAL) target_sources(imguiImpl PRIVATE imgui_impl_metal.mm diff --git a/src/imgui/imgui_extension.cpp b/src/imgui/imgui_extension.cpp index dadd2031..eb0e31ef 100644 --- a/src/imgui/imgui_extension.cpp +++ b/src/imgui/imgui_extension.cpp @@ -2,9 +2,13 @@ #include "WindowSystem.h" #include "Cafe/HW/Latte/Renderer/Renderer.h" #include "resource/IconsFontAwesome5.h" -#include "imgui_impl_opengl3.h" #include "resource/resource.h" +#ifdef ENABLE_OPENGL +#include "imgui_impl_opengl3.h" +#endif +#ifdef ENABLE_VULKAN #include "imgui_impl_vulkan.h" +#endif #include "input/InputManager.h" // diff --git a/src/main.cpp b/src/main.cpp index adce2680..a4e44115 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -19,7 +19,6 @@ #include "util/helpers/helpers.h" #include "config/ActiveSettings.h" -#include "Cafe/HW/Latte/Renderer/Vulkan/VsyncDriver.h" #include "Cafe/IOSU/legacy/iosu_crypto.h" #include "Cafe/OS/libs/vpad/vpad.h" @@ -65,6 +64,7 @@ void _putenvSafe(const char* c) _putenv(s->c_str()); } +#ifdef ENABLE_OPENGL void reconfigureGLDrivers() { // reconfigure GL drivers to store @@ -85,12 +85,15 @@ void reconfigureGLDrivers() _putenvSafe("__GL_SHADER_DISK_CACHE_SKIP_CLEANUP=1"); } +#endif +#ifdef ENABLE_VULKAN void reconfigureVkDrivers() { _putenvSafe("DISABLE_LAYER_AMD_SWITCHABLE_GRAPHICS_1=1"); _putenvSafe("DISABLE_VK_LAYER_VALVE_steam_fossilize_1=1"); } +#endif void WindowsInitCwd() { @@ -109,8 +112,12 @@ void WindowsInitCwd() void CemuCommonInit() { + #ifdef ENABLE_OPENGL reconfigureGLDrivers(); + #endif + #ifdef ENABLE_VULKAN reconfigureVkDrivers(); + #endif // crypto init AES128_init(); // init PPC timer