From 3ff9c4cc43aa8647a12fceb58dda580946c34df9 Mon Sep 17 00:00:00 2001 From: Joshua Ashton Date: Sun, 22 Dec 2019 17:46:57 +0000 Subject: [PATCH] [dxso] Track and prioritize co-issued CNDs above their parent ops --- src/dxso/dxso_analysis.cpp | 3 +++ src/dxso/dxso_analysis.h | 2 ++ src/dxso/dxso_compiler.cpp | 12 +++++++++++- src/dxso/dxso_compiler.h | 3 ++- 4 files changed, 18 insertions(+), 2 deletions(-) diff --git a/src/dxso/dxso_analysis.cpp b/src/dxso/dxso_analysis.cpp index 467bd02c7..33e9bbf7e 100644 --- a/src/dxso/dxso_analysis.cpp +++ b/src/dxso/dxso_analysis.cpp @@ -10,6 +10,9 @@ namespace dxvk { const DxsoInstructionContext& ctx) { DxsoOpcode opcode = ctx.instruction.opcode; + if (opcode == DxsoOpcode::Cnd && ctx.instruction.coissue) + m_analysis->coissues.push_back(ctx); + if (opcode == DxsoOpcode::TexKill) m_analysis->usesKill = true; diff --git a/src/dxso/dxso_analysis.h b/src/dxso/dxso_analysis.h index 9cbfd9672..96fd8e1fc 100644 --- a/src/dxso/dxso_analysis.h +++ b/src/dxso/dxso_analysis.h @@ -10,6 +10,8 @@ namespace dxvk { bool usesDerivatives = false; bool usesKill = false; + + std::vector coissues; }; class DxsoAnalyzer { diff --git a/src/dxso/dxso_compiler.cpp b/src/dxso/dxso_compiler.cpp index 9d39070b2..9ee44358a 100644 --- a/src/dxso/dxso_compiler.cpp +++ b/src/dxso/dxso_compiler.cpp @@ -74,9 +74,19 @@ namespace dxvk { void DxsoCompiler::processInstruction( - const DxsoInstructionContext& ctx) { + const DxsoInstructionContext& ctx, + uint32_t currentCoissueIdx) { const DxsoOpcode opcode = ctx.instruction.opcode; + for (const auto& coissue : m_analysis->coissues) { + if (coissue.instructionIdx == ctx.instructionIdx && + coissue.instructionIdx != currentCoissueIdx) + return; + + if (coissue.instructionIdx == ctx.instructionIdx + 1) + processInstruction(coissue, coissue.instructionIdx); + } + switch (opcode) { case DxsoOpcode::Nop: return; diff --git a/src/dxso/dxso_compiler.h b/src/dxso/dxso_compiler.h index edb12aa80..169b1547d 100644 --- a/src/dxso/dxso_compiler.h +++ b/src/dxso/dxso_compiler.h @@ -231,7 +231,8 @@ namespace dxvk { * \param [in] ins The instruction */ void processInstruction( - const DxsoInstructionContext& ctx); + const DxsoInstructionContext& ctx, + uint32_t currentCoissueIdx = 0); /** * \brief Finalizes the shader