From a0a4e02ebb6e80085c2803cce084821b1bc826a3 Mon Sep 17 00:00:00 2001 From: iwubcode Date: Sun, 4 Oct 2026 00:53:19 -0500 Subject: [PATCH] VideoCommon: remove remnants of old custom shader feature, it will be replaced by Materials in the future --- Source/Core/VideoCommon/CMakeLists.txt | 2 - .../Runtime/CustomShaderCache.cpp | 387 ------------------ .../Runtime/CustomShaderCache.h | 142 ------- .../Runtime/GraphicsModActionData.h | 5 - Source/Core/VideoCommon/ShaderGenCommon.h | 17 - Source/Core/VideoCommon/VertexManagerBase.cpp | 123 +----- Source/Core/VideoCommon/VertexManagerBase.h | 14 +- Source/Core/VideoCommon/VideoConfig.cpp | 1 - 8 files changed, 10 insertions(+), 681 deletions(-) delete mode 100644 Source/Core/VideoCommon/GraphicsModSystem/Runtime/CustomShaderCache.cpp delete mode 100644 Source/Core/VideoCommon/GraphicsModSystem/Runtime/CustomShaderCache.h diff --git a/Source/Core/VideoCommon/CMakeLists.txt b/Source/Core/VideoCommon/CMakeLists.txt index 69a0968e4d..6bbdcd9897 100644 --- a/Source/Core/VideoCommon/CMakeLists.txt +++ b/Source/Core/VideoCommon/CMakeLists.txt @@ -99,8 +99,6 @@ add_library(videocommon GraphicsModSystem/Runtime/Actions/SkipAction.h GraphicsModSystem/Runtime/CustomPipeline.cpp GraphicsModSystem/Runtime/CustomPipeline.h - GraphicsModSystem/Runtime/CustomShaderCache.cpp - GraphicsModSystem/Runtime/CustomShaderCache.h GraphicsModSystem/Runtime/FBInfo.cpp GraphicsModSystem/Runtime/FBInfo.h GraphicsModSystem/Runtime/GraphicsModAction.h diff --git a/Source/Core/VideoCommon/GraphicsModSystem/Runtime/CustomShaderCache.cpp b/Source/Core/VideoCommon/GraphicsModSystem/Runtime/CustomShaderCache.cpp deleted file mode 100644 index 91d4082348..0000000000 --- a/Source/Core/VideoCommon/GraphicsModSystem/Runtime/CustomShaderCache.cpp +++ /dev/null @@ -1,387 +0,0 @@ -// Copyright 2022 Dolphin Emulator Project -// SPDX-License-Identifier: GPL-2.0-or-later - -#include "VideoCommon/GraphicsModSystem/Runtime/CustomShaderCache.h" - -#include - -#include "VideoCommon/AbstractGfx.h" -#include "VideoCommon/VideoConfig.h" -#include "VideoCommon/VideoEvents.h" - -CustomShaderCache::CustomShaderCache() -{ - m_api_type = g_backend_info.api_type; - m_host_config.bits = ShaderHostConfig::GetCurrent().bits; - - m_async_shader_compiler = g_gfx->CreateAsyncShaderCompiler(); - m_async_shader_compiler->StartWorkerThreads(1); // TODO - - m_async_uber_shader_compiler = g_gfx->CreateAsyncShaderCompiler(); - m_async_uber_shader_compiler->StartWorkerThreads(1); // TODO - - m_frame_end_handler = GetVideoEvents().after_frame_event.Register( - [this](Core::System&) { RetrieveAsyncShaders(); }); -} - -CustomShaderCache::~CustomShaderCache() -{ - if (m_async_shader_compiler) - { - m_async_shader_compiler->StopWorkerThreads(); - m_async_shader_compiler->ClearAllWork(); - } - - if (m_async_uber_shader_compiler) - { - m_async_uber_shader_compiler->StopWorkerThreads(); - m_async_uber_shader_compiler->ClearAllWork(); - } -} - -void CustomShaderCache::RetrieveAsyncShaders() -{ - m_async_shader_compiler->RetrieveWorkItems(); - m_async_uber_shader_compiler->RetrieveWorkItems(); -} - -void CustomShaderCache::Reload() -{ - while (m_async_shader_compiler->HasPendingWork() || m_async_shader_compiler->HasCompletedWork()) - { - m_async_shader_compiler->RetrieveWorkItems(); - } - - while (m_async_uber_shader_compiler->HasPendingWork() || - m_async_uber_shader_compiler->HasCompletedWork()) - { - m_async_uber_shader_compiler->RetrieveWorkItems(); - } - - m_ps_cache = {}; - m_uber_ps_cache = {}; - m_pipeline_cache = {}; - m_uber_pipeline_cache = {}; -} - -std::optional -CustomShaderCache::GetPipelineAsync(const VideoCommon::GXPipelineUid& uid, - const CustomShaderInstance& custom_shaders, - const AbstractPipelineConfig& pipeline_config) -{ - if (auto holder = m_pipeline_cache.GetHolder(uid, custom_shaders)) - { - if (holder->pending) - return std::nullopt; - return holder->value.get(); - } - AsyncCreatePipeline(uid, custom_shaders, pipeline_config); - return std::nullopt; -} - -std::optional -CustomShaderCache::GetPipelineAsync(const VideoCommon::GXUberPipelineUid& uid, - const CustomShaderInstance& custom_shaders, - const AbstractPipelineConfig& pipeline_config) -{ - if (auto holder = m_uber_pipeline_cache.GetHolder(uid, custom_shaders)) - { - if (holder->pending) - return std::nullopt; - return holder->value.get(); - } - AsyncCreatePipeline(uid, custom_shaders, pipeline_config); - return std::nullopt; -} - -void CustomShaderCache::AsyncCreatePipeline(const VideoCommon::GXPipelineUid& uid, - - const CustomShaderInstance& custom_shaders, - const AbstractPipelineConfig& pipeline_config) -{ - class PipelineWorkItem final : public VideoCommon::AsyncShaderCompiler::WorkItem - { - public: - PipelineWorkItem(CustomShaderCache* shader_cache, VideoCommon::GXPipelineUid uid, - CustomShaderInstance custom_shaders, PipelineIterator iterator, - AbstractPipelineConfig pipeline_config) - : m_shader_cache(shader_cache), m_uid(std::move(uid)), m_iterator(iterator), - m_config(std::move(pipeline_config)), m_custom_shaders(std::move(custom_shaders)) - { - SetStagesReady(); - } - - void SetStagesReady() - { - m_stages_ready = true; - - PixelShaderUid ps_uid = m_uid.ps_uid; - ClearUnusedPixelShaderUidBits(m_shader_cache->m_api_type, m_shader_cache->m_host_config, - &ps_uid); - - if (auto holder = m_shader_cache->m_ps_cache.GetHolder(ps_uid, m_custom_shaders)) - { - // If the pixel shader is no longer pending compilation - // and the shader compilation succeeded, set - // the pipeline to use the new pixel shader. - // Otherwise, use the existing shader. - if (!holder->pending && holder->value.get()) - { - m_config.pixel_shader = holder->value.get(); - } - m_stages_ready &= !holder->pending; - } - else - { - m_stages_ready &= false; - m_shader_cache->QueuePixelShaderCompile(ps_uid, m_custom_shaders); - } - } - - bool Compile() override - { - if (m_stages_ready) - { - m_pipeline = g_gfx->CreatePipeline(m_config); - } - return true; - } - - void Retrieve() override - { - if (m_stages_ready) - { - m_shader_cache->NotifyPipelineFinished(m_iterator, std::move(m_pipeline)); - } - else - { - // Re-queue for next frame. - auto wi = m_shader_cache->m_async_shader_compiler->CreateWorkItem( - m_shader_cache, m_uid, m_custom_shaders, m_iterator, m_config); - m_shader_cache->m_async_shader_compiler->QueueWorkItem(std::move(wi), 0); - } - } - - private: - CustomShaderCache* m_shader_cache; - std::unique_ptr m_pipeline; - VideoCommon::GXPipelineUid m_uid; - PipelineIterator m_iterator; - AbstractPipelineConfig m_config; - CustomShaderInstance m_custom_shaders; - bool m_stages_ready; - }; - - auto list_iter = m_pipeline_cache.InsertElement(uid, custom_shaders); - auto work_item = m_async_shader_compiler->CreateWorkItem( - this, uid, custom_shaders, list_iter, pipeline_config); - m_async_shader_compiler->QueueWorkItem(std::move(work_item), 0); -} - -void CustomShaderCache::AsyncCreatePipeline(const VideoCommon::GXUberPipelineUid& uid, - - const CustomShaderInstance& custom_shaders, - const AbstractPipelineConfig& pipeline_config) -{ - class PipelineWorkItem final : public VideoCommon::AsyncShaderCompiler::WorkItem - { - public: - PipelineWorkItem(CustomShaderCache* shader_cache, VideoCommon::GXUberPipelineUid uid, - CustomShaderInstance custom_shaders, UberPipelineIterator iterator, - AbstractPipelineConfig pipeline_config) - : m_shader_cache(shader_cache), m_uid(std::move(uid)), m_iterator(iterator), - m_config(std::move(pipeline_config)), m_custom_shaders(std::move(custom_shaders)) - { - SetStagesReady(); - } - - void SetStagesReady() - { - m_stages_ready = true; - - UberShader::PixelShaderUid ps_uid = m_uid.ps_uid; - ClearUnusedPixelShaderUidBits(m_shader_cache->m_api_type, m_shader_cache->m_host_config, - &ps_uid); - - if (auto holder = m_shader_cache->m_uber_ps_cache.GetHolder(ps_uid, m_custom_shaders)) - { - if (!holder->pending && holder->value.get()) - { - m_config.pixel_shader = holder->value.get(); - } - m_stages_ready &= !holder->pending; - } - else - { - m_stages_ready &= false; - m_shader_cache->QueuePixelShaderCompile(ps_uid, m_custom_shaders); - } - } - - bool Compile() override - { - if (m_stages_ready) - { - if (m_config.pixel_shader == nullptr || m_config.vertex_shader == nullptr) - return false; - - m_pipeline = g_gfx->CreatePipeline(m_config); - } - return true; - } - - void Retrieve() override - { - if (m_stages_ready) - { - m_shader_cache->NotifyPipelineFinished(m_iterator, std::move(m_pipeline)); - } - else - { - // Re-queue for next frame. - auto wi = m_shader_cache->m_async_uber_shader_compiler->CreateWorkItem( - m_shader_cache, m_uid, m_custom_shaders, m_iterator, m_config); - m_shader_cache->m_async_uber_shader_compiler->QueueWorkItem(std::move(wi), 0); - } - } - - private: - CustomShaderCache* m_shader_cache; - std::unique_ptr m_pipeline; - VideoCommon::GXUberPipelineUid m_uid; - UberPipelineIterator m_iterator; - AbstractPipelineConfig m_config; - CustomShaderInstance m_custom_shaders; - bool m_stages_ready; - }; - - auto list_iter = m_uber_pipeline_cache.InsertElement(uid, custom_shaders); - auto work_item = m_async_uber_shader_compiler->CreateWorkItem( - this, uid, custom_shaders, list_iter, pipeline_config); - m_async_uber_shader_compiler->QueueWorkItem(std::move(work_item), 0); -} - -void CustomShaderCache::NotifyPipelineFinished(PipelineIterator iterator, - std::unique_ptr pipeline) -{ - iterator->second.pending = false; - iterator->second.value = std::move(pipeline); -} - -void CustomShaderCache::NotifyPipelineFinished(UberPipelineIterator iterator, - std::unique_ptr pipeline) -{ - iterator->second.pending = false; - iterator->second.value = std::move(pipeline); -} - -void CustomShaderCache::QueuePixelShaderCompile(const PixelShaderUid& uid, - - const CustomShaderInstance& custom_shaders) -{ - class PixelShaderWorkItem final : public VideoCommon::AsyncShaderCompiler::WorkItem - { - public: - PixelShaderWorkItem(CustomShaderCache* shader_cache, const PixelShaderUid& uid, - CustomShaderInstance custom_shaders, PixelShaderIterator iter) - : m_shader_cache(shader_cache), m_uid(uid), m_custom_shaders(std::move(custom_shaders)), - m_iter(iter) - { - } - - bool Compile() override - { - m_shader = m_shader_cache->CompilePixelShader(m_uid, m_custom_shaders); - return true; - } - - void Retrieve() override - { - m_shader_cache->NotifyPixelShaderFinished(m_iter, std::move(m_shader)); - } - - private: - CustomShaderCache* m_shader_cache; - std::unique_ptr m_shader; - PixelShaderUid m_uid; - CustomShaderInstance m_custom_shaders; - PixelShaderIterator m_iter; - }; - - auto list_iter = m_ps_cache.InsertElement(uid, custom_shaders); - auto work_item = m_async_shader_compiler->CreateWorkItem( - this, uid, custom_shaders, list_iter); - m_async_shader_compiler->QueueWorkItem(std::move(work_item), 0); -} - -void CustomShaderCache::QueuePixelShaderCompile(const UberShader::PixelShaderUid& uid, - - const CustomShaderInstance& custom_shaders) -{ - class PixelShaderWorkItem final : public VideoCommon::AsyncShaderCompiler::WorkItem - { - public: - PixelShaderWorkItem(CustomShaderCache* shader_cache, const UberShader::PixelShaderUid& uid, - CustomShaderInstance custom_shaders, UberPixelShaderIterator iter) - : m_shader_cache(shader_cache), m_uid(uid), m_custom_shaders(std::move(custom_shaders)), - m_iter(iter) - { - } - - bool Compile() override - { - m_shader = m_shader_cache->CompilePixelShader(m_uid, m_custom_shaders); - return true; - } - - void Retrieve() override - { - m_shader_cache->NotifyPixelShaderFinished(m_iter, std::move(m_shader)); - } - - private: - CustomShaderCache* m_shader_cache; - std::unique_ptr m_shader; - UberShader::PixelShaderUid m_uid; - CustomShaderInstance m_custom_shaders; - UberPixelShaderIterator m_iter; - }; - - auto list_iter = m_uber_ps_cache.InsertElement(uid, custom_shaders); - auto work_item = m_async_uber_shader_compiler->CreateWorkItem( - this, uid, custom_shaders, list_iter); - m_async_uber_shader_compiler->QueueWorkItem(std::move(work_item), 0); -} - -std::unique_ptr -CustomShaderCache::CompilePixelShader(const PixelShaderUid& uid, - const CustomShaderInstance& custom_shaders) const -{ - const ShaderCode source_code = - GeneratePixelShaderCode(m_api_type, m_host_config, uid.GetUidData(), {}); - return g_gfx->CreateShaderFromSource(ShaderStage::Pixel, source_code.GetBuffer(), nullptr, - "Custom Pixel Shader"); -} - -std::unique_ptr -CustomShaderCache::CompilePixelShader(const UberShader::PixelShaderUid& uid, - const CustomShaderInstance& custom_shaders) const -{ - const ShaderCode source_code = GenPixelShader(m_api_type, m_host_config, uid.GetUidData()); - return g_gfx->CreateShaderFromSource(ShaderStage::Pixel, source_code.GetBuffer(), nullptr, - "Custom Uber Pixel Shader"); -} - -void CustomShaderCache::NotifyPixelShaderFinished(PixelShaderIterator iterator, - std::unique_ptr shader) -{ - iterator->second.pending = false; - iterator->second.value = std::move(shader); -} - -void CustomShaderCache::NotifyPixelShaderFinished(UberPixelShaderIterator iterator, - std::unique_ptr shader) -{ - iterator->second.pending = false; - iterator->second.value = std::move(shader); -} diff --git a/Source/Core/VideoCommon/GraphicsModSystem/Runtime/CustomShaderCache.h b/Source/Core/VideoCommon/GraphicsModSystem/Runtime/CustomShaderCache.h deleted file mode 100644 index 7890cafeb6..0000000000 --- a/Source/Core/VideoCommon/GraphicsModSystem/Runtime/CustomShaderCache.h +++ /dev/null @@ -1,142 +0,0 @@ -// Copyright 2022 Dolphin Emulator Project -// SPDX-License-Identifier: GPL-2.0-or-later - -#pragma once - -#include -#include -#include -#include - -#include "Common/HookableEvent.h" - -#include "VideoCommon/AbstractPipeline.h" -#include "VideoCommon/AbstractShader.h" -#include "VideoCommon/AsyncShaderCompiler.h" -#include "VideoCommon/GXPipelineTypes.h" -#include "VideoCommon/PixelShaderGen.h" -#include "VideoCommon/ShaderGenCommon.h" -#include "VideoCommon/UberShaderPixel.h" - -struct CustomShaderInstance -{ - CustomPixelShaderContents pixel_contents; - - bool operator==(const CustomShaderInstance& other) const = default; -}; - -class CustomShaderCache -{ -public: - CustomShaderCache(); - ~CustomShaderCache(); - CustomShaderCache(const CustomShaderCache&) = delete; - CustomShaderCache(CustomShaderCache&&) = delete; - CustomShaderCache& operator=(const CustomShaderCache&) = delete; - CustomShaderCache& operator=(CustomShaderCache&&) = delete; - - // Changes the shader host config. Shaders should be reloaded afterwards. - void SetHostConfig(const ShaderHostConfig& host_config) { m_host_config.bits = host_config.bits; } - - // Retrieves all pending shaders/pipelines from the async compiler. - void RetrieveAsyncShaders(); - - // Reloads/recreates all shaders and pipelines. - void Reload(); - - // The optional will be empty if this pipeline is now background compiling. - std::optional - GetPipelineAsync(const VideoCommon::GXPipelineUid& uid, - const CustomShaderInstance& custom_shaders, - const AbstractPipelineConfig& pipeline_config); - std::optional - GetPipelineAsync(const VideoCommon::GXUberPipelineUid& uid, - const CustomShaderInstance& custom_shaders, - const AbstractPipelineConfig& pipeline_config); - -private: - // Configuration bits. - APIType m_api_type = APIType::Nothing; - ShaderHostConfig m_host_config = {}; - std::unique_ptr m_async_shader_compiler; - std::unique_ptr m_async_uber_shader_compiler; - - void AsyncCreatePipeline(const VideoCommon::GXPipelineUid& uid, - const CustomShaderInstance& custom_shaders, - const AbstractPipelineConfig& pipeline_config); - void AsyncCreatePipeline(const VideoCommon::GXUberPipelineUid& uid, - const CustomShaderInstance& custom_shaders, - const AbstractPipelineConfig& pipeline_config); - - // Shader/Pipeline cache helper - template - struct Cache - { - struct CacheHolder - { - std::unique_ptr value = nullptr; - bool pending = true; - }; - using CacheElement = std::pair; - using CacheList = std::list; - std::map uid_to_cachelist; - - const CacheHolder* GetHolder(const Uid& uid, const CustomShaderInstance& custom_shaders) const - { - if (auto uuid_it = uid_to_cachelist.find(uid); uuid_it != uid_to_cachelist.end()) - { - for (const auto& [custom_shader_val, holder] : uuid_it->second) - { - if (custom_shaders == custom_shader_val) - { - return &holder; - } - } - } - - return nullptr; - } - - typename CacheList::iterator InsertElement(const Uid& uid, - const CustomShaderInstance& custom_shaders) - { - CacheList& cachelist = uid_to_cachelist[uid]; - CacheElement e{custom_shaders, CacheHolder{}}; - return cachelist.emplace(cachelist.begin(), std::move(e)); - } - }; - - Cache m_ps_cache; - Cache m_uber_ps_cache; - Cache m_pipeline_cache; - Cache m_uber_pipeline_cache; - - using PipelineIterator = Cache::CacheList::iterator; - using UberPipelineIterator = - Cache::CacheList::iterator; - using PixelShaderIterator = Cache::CacheList::iterator; - using UberPixelShaderIterator = - Cache::CacheList::iterator; - - void NotifyPipelineFinished(PipelineIterator iterator, - std::unique_ptr pipeline); - void NotifyPipelineFinished(UberPipelineIterator iterator, - std::unique_ptr pipeline); - - std::unique_ptr - CompilePixelShader(const PixelShaderUid& uid, const CustomShaderInstance& custom_shaders) const; - void NotifyPixelShaderFinished(PixelShaderIterator iterator, - std::unique_ptr shader); - std::unique_ptr - CompilePixelShader(const UberShader::PixelShaderUid& uid, - const CustomShaderInstance& custom_shaders) const; - void NotifyPixelShaderFinished(UberPixelShaderIterator iterator, - std::unique_ptr shader); - - void QueuePixelShaderCompile(const PixelShaderUid& uid, - const CustomShaderInstance& custom_shaders); - void QueuePixelShaderCompile(const UberShader::PixelShaderUid& uid, - const CustomShaderInstance& custom_shaders); - - Common::EventHook m_frame_end_handler; -}; diff --git a/Source/Core/VideoCommon/GraphicsModSystem/Runtime/GraphicsModActionData.h b/Source/Core/VideoCommon/GraphicsModSystem/Runtime/GraphicsModActionData.h index e82c87e0e4..2ea2381dd6 100644 --- a/Source/Core/VideoCommon/GraphicsModSystem/Runtime/GraphicsModActionData.h +++ b/Source/Core/VideoCommon/GraphicsModSystem/Runtime/GraphicsModActionData.h @@ -3,8 +3,6 @@ #pragma once -#include -#include #include #include @@ -13,7 +11,6 @@ #include "Common/SmallVector.h" #include "VideoCommon/Assets/TextureAsset.h" #include "VideoCommon/Resources/MaterialResource.h" -#include "VideoCommon/ShaderGenCommon.h" namespace GraphicsModActionData { @@ -21,8 +18,6 @@ struct DrawStarted { const Common::SmallVector& texture_units; bool* skip; - std::optional* custom_pixel_shader; - std::span* material_uniform_buffer; }; struct PreEFB diff --git a/Source/Core/VideoCommon/ShaderGenCommon.h b/Source/Core/VideoCommon/ShaderGenCommon.h index 7d2c80f086..551aeacb6f 100644 --- a/Source/Core/VideoCommon/ShaderGenCommon.h +++ b/Source/Core/VideoCommon/ShaderGenCommon.h @@ -328,20 +328,3 @@ static const char s_geometry_shader_uniforms[] = "\tfloat4 " I_STEREOPARAMS ";\n "\tfloat4 " I_LINEPTPARAMS ";\n" "\tint4 " I_TEXOFFSET ";\n" "\tuint vs_expand;\n"; - -constexpr std::string_view CUSTOM_PIXELSHADER_COLOR_FUNC = "customShaderColor"; - -struct CustomPixelShader -{ - std::string custom_shader; - std::string material_uniform_block; - - bool operator==(const CustomPixelShader& other) const = default; -}; - -struct CustomPixelShaderContents -{ - std::vector shaders; - - bool operator==(const CustomPixelShaderContents& other) const = default; -}; diff --git a/Source/Core/VideoCommon/VertexManagerBase.cpp b/Source/Core/VideoCommon/VertexManagerBase.cpp index 2bc6d586d7..f3f27518bf 100644 --- a/Source/Core/VideoCommon/VertexManagerBase.cpp +++ b/Source/Core/VideoCommon/VertexManagerBase.cpp @@ -25,7 +25,6 @@ #include "VideoCommon/DataReader.h" #include "VideoCommon/FramebufferManager.h" #include "VideoCommon/GeometryShaderManager.h" -#include "VideoCommon/GraphicsModSystem/Runtime/CustomShaderCache.h" #include "VideoCommon/GraphicsModSystem/Runtime/GraphicsModActionData.h" #include "VideoCommon/GraphicsModSystem/Runtime/GraphicsModManager.h" #include "VideoCommon/IndexGenerator.h" @@ -124,7 +123,6 @@ bool VertexManagerBase::Initialize() m_after_present_event = video_events.after_present_event.Register( [this](const PresentInfo& pi) { m_ticks_elapsed = pi.emulated_timestamp; }); m_index_generator.Init(); - m_custom_shader_cache = std::make_unique(); m_cpu_cull.Init(); return true; } @@ -610,25 +608,12 @@ void VertexManagerBase::Flush() if (!m_cull_all) { - CustomPixelShaderContents custom_pixel_shader_contents; - std::optional custom_pixel_shader; - std::vector custom_pixel_texture_names; - std::span custom_pixel_shader_uniforms; bool skip = false; - for (size_t i = 0; i < texture_names.size(); i++) + for (const std::string& texture_name : texture_names) { - GraphicsModActionData::DrawStarted draw_started{texture_units, &skip, &custom_pixel_shader, - &custom_pixel_shader_uniforms}; - for (const auto& action : g_graphics_mod_manager->GetDrawStartedActions(texture_names[i])) - { + GraphicsModActionData::DrawStarted draw_started{texture_units, &skip}; + for (const auto& action : g_graphics_mod_manager->GetDrawStartedActions(texture_name)) action->OnDrawStarted(&draw_started); - if (custom_pixel_shader) - { - custom_pixel_shader_contents.shaders.push_back(*custom_pixel_shader); - custom_pixel_texture_names.push_back(texture_names[i]); - } - custom_pixel_shader = std::nullopt; - } } // Now the vertices can be flushed to the GPU. Everything following the CommitBuffer() call @@ -648,18 +633,8 @@ void VertexManagerBase::Flush() UpdatePipelineObject(); if (m_current_pipeline_object) { - const AbstractPipeline* pipeline_object = m_current_pipeline_object; - if (!custom_pixel_shader_contents.shaders.empty()) - { - if (const auto custom_pipeline = - GetCustomPipeline(custom_pixel_shader_contents, m_current_pipeline_config, - m_current_uber_pipeline_config, m_current_pipeline_object)) - { - pipeline_object = custom_pipeline; - } - } - RenderDrawCall(pixel_shader_manager, geometry_shader_manager, custom_pixel_shader_contents, - custom_pixel_shader_uniforms, m_current_primitive_type, pipeline_object); + RenderDrawCall(pixel_shader_manager, geometry_shader_manager, m_current_primitive_type, + m_current_pipeline_object); } } @@ -1048,27 +1023,14 @@ void VertexManagerBase::OnEndFrame() InvalidatePipelineObject(); } -void VertexManagerBase::NotifyCustomShaderCacheOfHostChange(const ShaderHostConfig& host_config) -{ - m_custom_shader_cache->SetHostConfig(host_config); - m_custom_shader_cache->Reload(); -} - -void VertexManagerBase::RenderDrawCall( - PixelShaderManager& pixel_shader_manager, GeometryShaderManager& geometry_shader_manager, - const CustomPixelShaderContents& custom_pixel_shader_contents, - std::span custom_pixel_shader_uniforms, PrimitiveType primitive_type, - const AbstractPipeline* current_pipeline) +void VertexManagerBase::RenderDrawCall(PixelShaderManager& pixel_shader_manager, + GeometryShaderManager& geometry_shader_manager, + PrimitiveType primitive_type, + const AbstractPipeline* current_pipeline) { // Now we can upload uniforms, as nothing else will override them. geometry_shader_manager.SetConstants(primitive_type); pixel_shader_manager.SetConstants(); - if (!custom_pixel_shader_uniforms.empty() && - pixel_shader_manager.custom_constants.data() != custom_pixel_shader_uniforms.data()) - { - pixel_shader_manager.custom_constants_dirty = true; - } - pixel_shader_manager.custom_constants = custom_pixel_shader_uniforms; UploadUniforms(); g_gfx->SetPipeline(current_pipeline); @@ -1098,70 +1060,3 @@ void VertexManagerBase::RenderDrawCall( if (PerfQueryBase::ShouldEmulate()) g_perf_query->DisableQuery(bpmem.zcontrol.early_ztest ? PQG_ZCOMP_ZCOMPLOC : PQG_ZCOMP); } - -const AbstractPipeline* VertexManagerBase::GetCustomPipeline( - const CustomPixelShaderContents& custom_pixel_shader_contents, - const VideoCommon::GXPipelineUid& current_pipeline_config, - const VideoCommon::GXUberPipelineUid& current_uber_pipeline_config, - const AbstractPipeline* current_pipeline) const -{ - if (current_pipeline) - { - if (!custom_pixel_shader_contents.shaders.empty()) - { - CustomShaderInstance custom_shaders; - custom_shaders.pixel_contents = custom_pixel_shader_contents; - switch (g_ActiveConfig.iShaderCompilationMode) - { - case ShaderCompilationMode::Synchronous: - case ShaderCompilationMode::AsynchronousSkipRendering: - { - if (auto pipeline = m_custom_shader_cache->GetPipelineAsync( - current_pipeline_config, custom_shaders, current_pipeline->m_config)) - { - return *pipeline; - } - } - break; - case ShaderCompilationMode::SynchronousUberShaders: - { - // D3D has issues compiling large custom ubershaders - // use specialized shaders instead - if (g_backend_info.api_type == APIType::D3D) - { - if (auto pipeline = m_custom_shader_cache->GetPipelineAsync( - current_pipeline_config, custom_shaders, current_pipeline->m_config)) - { - return *pipeline; - } - } - else - { - if (auto pipeline = m_custom_shader_cache->GetPipelineAsync( - current_uber_pipeline_config, custom_shaders, current_pipeline->m_config)) - { - return *pipeline; - } - } - } - break; - case ShaderCompilationMode::AsynchronousUberShaders: - { - if (auto pipeline = m_custom_shader_cache->GetPipelineAsync( - current_pipeline_config, custom_shaders, current_pipeline->m_config)) - { - return *pipeline; - } - else if (auto uber_pipeline = m_custom_shader_cache->GetPipelineAsync( - current_uber_pipeline_config, custom_shaders, current_pipeline->m_config)) - { - return *uber_pipeline; - } - } - break; - }; - } - } - - return nullptr; -} diff --git a/Source/Core/VideoCommon/VertexManagerBase.h b/Source/Core/VideoCommon/VertexManagerBase.h index 715dbee692..8397efe707 100644 --- a/Source/Core/VideoCommon/VertexManagerBase.h +++ b/Source/Core/VideoCommon/VertexManagerBase.h @@ -15,8 +15,6 @@ #include "VideoCommon/ShaderCache.h" #include "VideoCommon/VideoEvents.h" -struct CustomPixelShaderContents; -class CustomShaderCache; class DataReader; class GeometryShaderManager; class NativeVertexFormat; @@ -134,7 +132,6 @@ public: m_current_pipeline_object = nullptr; m_pipeline_config_changed = true; } - void NotifyCustomShaderCacheOfHostChange(const ShaderHostConfig& host_config); // Utility pipeline drawing (e.g. EFB copies, post-processing, UI). virtual void UploadUtilityUniforms(const void* uniforms, u32 uniforms_size); @@ -224,19 +221,11 @@ private: static constexpr u32 MINIMUM_DRAW_CALLS_PER_COMMAND_BUFFER_FOR_READBACK = 10; void RenderDrawCall(PixelShaderManager& pixel_shader_manager, - GeometryShaderManager& geometry_shader_manager, - const CustomPixelShaderContents& custom_pixel_shader_contents, - std::span custom_pixel_shader_uniforms, PrimitiveType primitive_type, + GeometryShaderManager& geometry_shader_manager, PrimitiveType primitive_type, const AbstractPipeline* current_pipeline); void UpdatePipelineConfig(); void UpdatePipelineObject(); - const AbstractPipeline* - GetCustomPipeline(const CustomPixelShaderContents& custom_pixel_shader_contents, - const VideoCommon::GXPipelineUid& current_pipeline_config, - const VideoCommon::GXUberPipelineUid& current_uber_pipeline_confi, - const AbstractPipeline* current_pipeline) const; - bool m_is_flushed = true; FlushStatistics m_flush_statistics = {}; @@ -248,7 +237,6 @@ private: std::vector m_scheduled_command_buffer_kicks; bool m_allow_background_execution = true; - std::unique_ptr m_custom_shader_cache; u64 m_ticks_elapsed = 0; Common::EventHook m_frame_end_event; diff --git a/Source/Core/VideoCommon/VideoConfig.cpp b/Source/Core/VideoCommon/VideoConfig.cpp index c56f32c00c..1bb8796abf 100644 --- a/Source/Core/VideoCommon/VideoConfig.cpp +++ b/Source/Core/VideoCommon/VideoConfig.cpp @@ -390,7 +390,6 @@ void CheckForConfigChanges() OSD::AddMessage("Video config changed, reloading shaders.", OSD::Duration::NORMAL); g_gfx->WaitForGPUIdle(); g_vertex_manager->InvalidatePipelineObject(); - g_vertex_manager->NotifyCustomShaderCacheOfHostChange(new_host_config); g_shader_cache->SetHostConfig(new_host_config); g_shader_cache->Reload(); g_framebuffer_manager->RecompileShaders();