From 8af6e6a05207b1c9736bd80a89ec3aed1f96dfea Mon Sep 17 00:00:00 2001 From: Fernando Sahmkow Date: Mon, 24 Jun 2019 19:46:49 -0400 Subject: shader_ir: Implement a new shader scanner --- src/video_core/shader/control_flow.h | 55 ++++++++++++++++++++++++++++++++++++ 1 file changed, 55 insertions(+) create mode 100644 src/video_core/shader/control_flow.h (limited to 'src/video_core/shader/control_flow.h') diff --git a/src/video_core/shader/control_flow.h b/src/video_core/shader/control_flow.h new file mode 100644 index 000000000..16736d57a --- /dev/null +++ b/src/video_core/shader/control_flow.h @@ -0,0 +1,55 @@ +#pragma once + +#include +#include +#include +#include + +#include "video_core/engines/shader_bytecode.h" +#include "video_core/shader/shader_ir.h" + +namespace VideoCommon::Shader { + +using Tegra::Shader::ConditionCode; +using Tegra::Shader::Pred; + +constexpr s32 exit_branch = -1; + +struct Condition { + Pred predicate{Pred::UnusedIndex}; + ConditionCode cc{ConditionCode::T}; + + bool IsUnconditional() const { + return (predicate == Pred::UnusedIndex) && (cc == ConditionCode::T); + } +}; + +struct ShaderBlock { + ShaderBlock() {} + ShaderBlock(const ShaderBlock& sb) = default; + u32 start{}; + u32 end{}; + struct Branch { + Condition cond{}; + bool kills{}; + s32 address{}; + bool operator==(const Branch& b) const { + return std::memcmp(this, &b, sizeof(Branch)) == 0; + } + } branch; + bool operator==(const ShaderBlock& sb) const { + return std::memcmp(this, &sb, sizeof(ShaderBlock)) == 0; + } +}; + +struct ShaderCharacteristics { + std::list blocks; + bool decompilable{}; + u32 start; + u32 end; +}; + +bool ScanFlow(const ProgramCode& program_code, u32 program_size, u32 start_address, + ShaderCharacteristics& result_out); + +} // namespace VideoCommon::Shader -- cgit v1.2.3