From e0ea5db2afc440b9a26992eae969b252b79c3c6c Mon Sep 17 00:00:00 2001 From: Skyth <19259897+blueskythlikesclouds@users.noreply.github.com> Date: Thu, 28 Nov 2024 17:48:33 +0300 Subject: [PATCH] Integrate smol-v. --- UnleashedRecomp/CMakeLists.txt | 5 +++++ UnleashedRecomp/gpu/video.cpp | 15 +++++++++++++-- UnleashedRecomp/stdafx.h | 1 + thirdparty/ShaderRecomp | 2 +- 4 files changed, 20 insertions(+), 3 deletions(-) diff --git a/UnleashedRecomp/CMakeLists.txt b/UnleashedRecomp/CMakeLists.txt index 36de7756..75512991 100644 --- a/UnleashedRecomp/CMakeLists.txt +++ b/UnleashedRecomp/CMakeLists.txt @@ -79,6 +79,8 @@ set(SWA_UI_CXX_SOURCES "ui/window.cpp" ) +set(SMOLV_SOURCE_DIR "${SWA_THIRDPARTY_ROOT}/ShaderRecomp/thirdparty/smol-v/source") + set(SWA_CXX_SOURCES "app.cpp" "main.cpp" @@ -93,6 +95,8 @@ set(SWA_CXX_SOURCES ${SWA_HID_CXX_SOURCES} ${SWA_PATCHES_CXX_SOURCES} ${SWA_UI_CXX_SOURCES} + + "${SMOLV_SOURCE_DIR}/smolv.cpp" ) if (WIN32) @@ -166,6 +170,7 @@ target_include_directories(UnleashedRecomp PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/api ${SWA_THIRDPARTY_ROOT}/ddspp ${Stb_INCLUDE_DIR} + ${SMOLV_SOURCE_DIR} ) target_precompile_headers(UnleashedRecomp PUBLIC ${SWA_PRECOMPILED_HEADERS}) diff --git a/UnleashedRecomp/gpu/video.cpp b/UnleashedRecomp/gpu/video.cpp index e9a01f85..baec44db 100644 --- a/UnleashedRecomp/gpu/video.cpp +++ b/UnleashedRecomp/gpu/video.cpp @@ -2499,9 +2499,20 @@ static RenderShader* GetOrLinkShader(GuestShader* guestShader, uint32_t specCons assert(guestShader->shaderCacheEntry != nullptr); if (g_vulkan) - guestShader->shader = g_device->createShader(g_shaderCache.get() + guestShader->shaderCacheEntry->spirvOffset, guestShader->shaderCacheEntry->spirvSize, "main", RenderShaderFormat::SPIRV); + { + auto compressedSpirvData = g_shaderCache.get() + guestShader->shaderCacheEntry->spirvOffset; + + std::vector decoded(smolv::GetDecodedBufferSize(compressedSpirvData, guestShader->shaderCacheEntry->spirvSize)); + bool result = smolv::Decode(compressedSpirvData, guestShader->shaderCacheEntry->spirvSize, decoded.data(), decoded.size()); + assert(result); + + guestShader->shader = g_device->createShader(decoded.data(), decoded.size(), "main", RenderShaderFormat::SPIRV); + } else - guestShader->shader = g_device->createShader(g_shaderCache.get() + guestShader->shaderCacheEntry->dxilOffset, guestShader->shaderCacheEntry->dxilSize, "main", RenderShaderFormat::DXIL); + { + guestShader->shader = g_device->createShader(g_shaderCache.get() + guestShader->shaderCacheEntry->dxilOffset, + guestShader->shaderCacheEntry->dxilSize, "main", RenderShaderFormat::DXIL); + } } return guestShader->shader.get(); diff --git a/UnleashedRecomp/stdafx.h b/UnleashedRecomp/stdafx.h index a4fc08f1..711a83ae 100644 --- a/UnleashedRecomp/stdafx.h +++ b/UnleashedRecomp/stdafx.h @@ -30,6 +30,7 @@ #include #include #include +#include using Microsoft::WRL::ComPtr; diff --git a/thirdparty/ShaderRecomp b/thirdparty/ShaderRecomp index bd987289..53cee767 160000 --- a/thirdparty/ShaderRecomp +++ b/thirdparty/ShaderRecomp @@ -1 +1 @@ -Subproject commit bd9872894411060e8b72c8eada341406a350d21d +Subproject commit 53cee767968f30656e23337b8c0919ad78c7fdfe