diff options
7 files changed, 23 insertions, 10 deletions
| diff --git a/src/shader_recompiler/frontend/maxwell/structured_control_flow.cpp b/src/shader_recompiler/frontend/maxwell/structured_control_flow.cpp index f124dc8c0..77d1cd0fc 100644 --- a/src/shader_recompiler/frontend/maxwell/structured_control_flow.cpp +++ b/src/shader_recompiler/frontend/maxwell/structured_control_flow.cpp @@ -20,6 +20,7 @@  #include "shader_recompiler/frontend/maxwell/decode.h"  #include "shader_recompiler/frontend/maxwell/structured_control_flow.h"  #include "shader_recompiler/frontend/maxwell/translate/translate.h" +#include "shader_recompiler/host_translate_info.h"  #include "shader_recompiler/object_pool.h"  namespace Shader::Maxwell { @@ -652,7 +653,7 @@ class TranslatePass {  public:      TranslatePass(ObjectPool<IR::Inst>& inst_pool_, ObjectPool<IR::Block>& block_pool_,                    ObjectPool<Statement>& stmt_pool_, Environment& env_, Statement& root_stmt, -                  IR::AbstractSyntaxList& syntax_list_) +                  IR::AbstractSyntaxList& syntax_list_, const HostTranslateInfo& host_info)          : stmt_pool{stmt_pool_}, inst_pool{inst_pool_}, block_pool{block_pool_}, env{env_},            syntax_list{syntax_list_} {          Visit(root_stmt, nullptr, nullptr); @@ -660,7 +661,7 @@ public:          IR::Block& first_block{*syntax_list.front().data.block};          IR::IREmitter ir(first_block, first_block.begin());          ir.Prologue(); -        if (uses_demote_to_helper) { +        if (uses_demote_to_helper && host_info.needs_demote_reorder) {              DemoteCombinationPass();          }      } @@ -977,12 +978,13 @@ private:  } // Anonymous namespace  IR::AbstractSyntaxList BuildASL(ObjectPool<IR::Inst>& inst_pool, ObjectPool<IR::Block>& block_pool, -                                Environment& env, Flow::CFG& cfg) { +                                Environment& env, Flow::CFG& cfg, +                                const HostTranslateInfo& host_info) {      ObjectPool<Statement> stmt_pool{64};      GotoPass goto_pass{cfg, stmt_pool};      Statement& root{goto_pass.RootStatement()};      IR::AbstractSyntaxList syntax_list; -    TranslatePass{inst_pool, block_pool, stmt_pool, env, root, syntax_list}; +    TranslatePass{inst_pool, block_pool, stmt_pool, env, root, syntax_list, host_info};      return syntax_list;  } diff --git a/src/shader_recompiler/frontend/maxwell/structured_control_flow.h b/src/shader_recompiler/frontend/maxwell/structured_control_flow.h index 88b083649..e38158da3 100644 --- a/src/shader_recompiler/frontend/maxwell/structured_control_flow.h +++ b/src/shader_recompiler/frontend/maxwell/structured_control_flow.h @@ -11,10 +11,13 @@  #include "shader_recompiler/frontend/maxwell/control_flow.h"  #include "shader_recompiler/object_pool.h" -namespace Shader::Maxwell { +namespace Shader { +struct HostTranslateInfo; +namespace Maxwell {  [[nodiscard]] IR::AbstractSyntaxList BuildASL(ObjectPool<IR::Inst>& inst_pool,                                                ObjectPool<IR::Block>& block_pool, Environment& env, -                                              Flow::CFG& cfg); +                                              Flow::CFG& cfg, const HostTranslateInfo& host_info); -} // namespace Shader::Maxwell +} // namespace Maxwell +} // namespace Shader diff --git a/src/shader_recompiler/frontend/maxwell/translate_program.cpp b/src/shader_recompiler/frontend/maxwell/translate_program.cpp index c067d459c..012d55357 100644 --- a/src/shader_recompiler/frontend/maxwell/translate_program.cpp +++ b/src/shader_recompiler/frontend/maxwell/translate_program.cpp @@ -130,7 +130,7 @@ void AddNVNStorageBuffers(IR::Program& program) {  IR::Program TranslateProgram(ObjectPool<IR::Inst>& inst_pool, ObjectPool<IR::Block>& block_pool,                               Environment& env, Flow::CFG& cfg, const HostTranslateInfo& host_info) {      IR::Program program; -    program.syntax_list = BuildASL(inst_pool, block_pool, env, cfg); +    program.syntax_list = BuildASL(inst_pool, block_pool, env, cfg, host_info);      program.blocks = GenerateBlocks(program.syntax_list);      program.post_order_blocks = PostOrder(program.syntax_list.front());      program.stage = env.ShaderStage(); diff --git a/src/shader_recompiler/host_translate_info.h b/src/shader_recompiler/host_translate_info.h index 94a584219..96468b2e7 100644 --- a/src/shader_recompiler/host_translate_info.h +++ b/src/shader_recompiler/host_translate_info.h @@ -11,8 +11,9 @@ namespace Shader {  /// Misc information about the host  struct HostTranslateInfo { -    bool support_float16{}; ///< True when the device supports 16-bit floats -    bool support_int64{};   ///< True when the device supports 64-bit integers +    bool support_float16{};      ///< True when the device supports 16-bit floats +    bool support_int64{};        ///< True when the device supports 64-bit integers +    bool needs_demote_reorder{}; ///< True when the device needs DemoteToHelperInvocation reordered  };  } // namespace Shader diff --git a/src/video_core/renderer_opengl/gl_device.h b/src/video_core/renderer_opengl/gl_device.h index ee992aed4..de9e41659 100644 --- a/src/video_core/renderer_opengl/gl_device.h +++ b/src/video_core/renderer_opengl/gl_device.h @@ -156,6 +156,10 @@ public:          return shader_backend;      } +    bool IsAmd() const { +        return vendor_name == "ATI Technologies Inc."; +    } +  private:      static bool TestVariableAoffi();      static bool TestPreciseBug(); diff --git a/src/video_core/renderer_opengl/gl_shader_cache.cpp b/src/video_core/renderer_opengl/gl_shader_cache.cpp index 1f4dda17e..b0e14182e 100644 --- a/src/video_core/renderer_opengl/gl_shader_cache.cpp +++ b/src/video_core/renderer_opengl/gl_shader_cache.cpp @@ -219,6 +219,7 @@ ShaderCache::ShaderCache(RasterizerOpenGL& rasterizer_, Core::Frontend::EmuWindo        host_info{            .support_float16 = false,            .support_int64 = device.HasShaderInt64(), +          .needs_demote_reorder = device.IsAmd(),        } {      if (use_asynchronous_shaders) {          workers = CreateWorkers(); diff --git a/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp b/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp index f316c4f92..31bfbcb06 100644 --- a/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp +++ b/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp @@ -325,6 +325,8 @@ PipelineCache::PipelineCache(RasterizerVulkan& rasterizer_, Tegra::Engines::Maxw      host_info = Shader::HostTranslateInfo{          .support_float16 = device.IsFloat16Supported(),          .support_int64 = device.IsShaderInt64Supported(), +        .needs_demote_reorder = driver_id == VK_DRIVER_ID_AMD_PROPRIETARY_KHR || +                                driver_id == VK_DRIVER_ID_AMD_OPEN_SOURCE_KHR,      };  } | 
