diff --git a/.github/workflows/linux-qt.yml b/.github/workflows/linux-qt.yml index 6848f203bc..c43c50e6fc 100644 --- a/.github/workflows/linux-qt.yml +++ b/.github/workflows/linux-qt.yml @@ -5,9 +5,9 @@ name: Linux-Qt on: push: - branches: [ "main" ] + branches: [ "bb-deadlock-shaders-fixes" ] pull_request: - branches: [ "main" ] + branches: [ "bb-deadlock-shaders-fixes" ] env: BUILD_TYPE: Release diff --git a/.github/workflows/windows-qt.yml b/.github/workflows/windows-qt.yml index fee202b5c4..3551fd6b92 100644 --- a/.github/workflows/windows-qt.yml +++ b/.github/workflows/windows-qt.yml @@ -5,9 +5,9 @@ name: Windows-Qt on: push: - branches: [ "main" ] + branches: [ "bb-deadlock-shaders-fixes" ] pull_request: - branches: [ "main" ] + branches: [ "bb-deadlock-shaders-fixes" ] env: BUILD_TYPE: Release diff --git a/CMakeSettings.json b/CMakeSettings.json index 9242e0808a..a092a94d91 100644 --- a/CMakeSettings.json +++ b/CMakeSettings.json @@ -9,7 +9,19 @@ "cmakeCommandArgs": "", "buildCommandArgs": "", "ctestCommandArgs": "", - "inheritEnvironments": [ "clang_cl_x64_x64" ] + "inheritEnvironments": [ "clang_cl_x64_x64" ], + "variables": [ + { + "name": "ENABLE_QT_GUI", + "value": "True", + "type": "BOOL" + }, + { + "name": "CMAKE_PREFIX_PATH", + "value": "C:/Qt/6.7.2/msvc2019_64", + "type": "PATH" + } + ] }, { "name": "x64-Clang-Debug", @@ -20,7 +32,19 @@ "cmakeCommandArgs": "", "buildCommandArgs": "", "ctestCommandArgs": "", - "inheritEnvironments": [ "clang_cl_x64_x64" ] + "inheritEnvironments": [ "clang_cl_x64_x64" ], + "variables": [ + { + "name": "ENABLE_QT_GUI", + "value": "True", + "type": "BOOL" + }, + { + "name": "CMAKE_PREFIX_PATH", + "value": "C:/Qt/6.7.2/msvc2019_64", + "type": "PATH" + } + ] }, { "name": "x64-Clang-RelWithDebInfo", diff --git a/src/core/libraries/kernel/thread_management.cpp b/src/core/libraries/kernel/thread_management.cpp index 8f97ed8795..980170f4c4 100644 --- a/src/core/libraries/kernel/thread_management.cpp +++ b/src/core/libraries/kernel/thread_management.cpp @@ -53,11 +53,12 @@ void init_pthreads() { } void pthreadInitSelfMainThread() { + auto name = "Main_Thread"; auto* pthread_pool = g_pthread_cxt->GetPthreadPool(); - g_pthread_self = pthread_pool->Create(); + g_pthread_self = pthread_pool->Create(name); scePthreadAttrInit(&g_pthread_self->attr); g_pthread_self->pth = pthread_self(); - g_pthread_self->name = "Main_Thread"; + g_pthread_self->name = name; } int PS4_SYSV_ABI scePthreadAttrInit(ScePthreadAttr* attr) { @@ -1013,7 +1014,7 @@ int PS4_SYSV_ABI scePthreadCreate(ScePthread* thread, const ScePthreadAttr* attr attr = g_pthread_cxt->GetDefaultAttr(); } - *thread = pthread_pool->Create(); + *thread = pthread_pool->Create(name); if ((*thread)->attr != nullptr) { scePthreadAttrDestroy(&(*thread)->attr); @@ -1055,17 +1056,27 @@ int PS4_SYSV_ABI scePthreadCreate(ScePthread* thread, const ScePthreadAttr* attr } } -ScePthread PThreadPool::Create() { +ScePthread PThreadPool::Create(const char* name) { std::scoped_lock lock{m_mutex}; for (auto* p : m_threads) { - if (p->is_free) { + if (p->is_free || + (p->name == name && (p->name.starts_with("CSChr") || p->name.starts_with("CSCloth")))) { p->is_free = false; return p; } } +#ifdef _WIN64 auto* ret = new PthreadInternal{}; +#else + // Linux specific hack + static u8* hint_address = reinterpret_cast(0x7FFFFC000ULL); + auto* ret = reinterpret_cast( + mmap(hint_address, sizeof(PthreadInternal), PROT_READ | PROT_WRITE, + MAP_PRIVATE | MAP_ANONYMOUS | MAP_FIXED, -1, 0)); + hint_address += Common::AlignUp(sizeof(PthreadInternal), 4_KB); +#endif ret->is_free = false; ret->is_detached = false; ret->is_almost_done = false; diff --git a/src/core/libraries/kernel/thread_management.h b/src/core/libraries/kernel/thread_management.h index a2b2f6feaf..7385b55ce0 100644 --- a/src/core/libraries/kernel/thread_management.h +++ b/src/core/libraries/kernel/thread_management.h @@ -119,7 +119,7 @@ struct PthreadSemInternal { class PThreadPool { public: - ScePthread Create(); + ScePthread Create(const char* name); private: std::vector m_threads; diff --git a/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp b/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp index b4b256bb0e..588431a9ba 100644 --- a/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp +++ b/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp @@ -174,7 +174,8 @@ const ComputePipeline* PipelineCache::GetComputePipeline() { } bool ShouldSkipShader(u64 shader_hash, const char* shader_type) { - static constexpr std::array skip_hashes = {}; + static constexpr std::array skip_hashes = {0xc0cbc309, 0x77d1c63, 0xff7a6d7c, + 0xddfbac23, 0x896e7242}; if (std::ranges::contains(skip_hashes, shader_hash)) { LOG_WARNING(Render_Vulkan, "Skipped {} shader hash {:#x}.", shader_type, shader_hash); return true;