|
@@ -34,6 +34,17 @@ constexpr u32 PROGRAM_HEADER_SIZE = sizeof(Tegra::Shader::Header);
|
|
|
constexpr u32 MAX_GEOMETRY_BUFFERS = 6;
|
|
constexpr u32 MAX_GEOMETRY_BUFFERS = 6;
|
|
|
constexpr u32 MAX_ATTRIBUTES = 0x100; // Size in vec4s, this value is untested
|
|
constexpr u32 MAX_ATTRIBUTES = 0x100; // Size in vec4s, this value is untested
|
|
|
|
|
|
|
|
|
|
+static const char* INTERNAL_FLAG_NAMES[] = {"zero_flag", "sign_flag", "carry_flag",
|
|
|
|
|
+ "overflow_flag"};
|
|
|
|
|
+
|
|
|
|
|
+enum class InternalFlag : u64 {
|
|
|
|
|
+ ZeroFlag = 0,
|
|
|
|
|
+ SignFlag = 1,
|
|
|
|
|
+ CarryFlag = 2,
|
|
|
|
|
+ OverflowFlag = 3,
|
|
|
|
|
+ Amount
|
|
|
|
|
+};
|
|
|
|
|
+
|
|
|
class DecompileFail : public std::runtime_error {
|
|
class DecompileFail : public std::runtime_error {
|
|
|
public:
|
|
public:
|
|
|
using std::runtime_error::runtime_error;
|
|
using std::runtime_error::runtime_error;
|
|
@@ -257,14 +268,6 @@ private:
|
|
|
const std::string& suffix;
|
|
const std::string& suffix;
|
|
|
};
|
|
};
|
|
|
|
|
|
|
|
-enum class InternalFlag : u64 {
|
|
|
|
|
- ZeroFlag = 0,
|
|
|
|
|
- CarryFlag = 1,
|
|
|
|
|
- OverflowFlag = 2,
|
|
|
|
|
- NaNFlag = 3,
|
|
|
|
|
- Amount
|
|
|
|
|
-};
|
|
|
|
|
-
|
|
|
|
|
/**
|
|
/**
|
|
|
* Used to manage shader registers that are emulated with GLSL. This class keeps track of the state
|
|
* Used to manage shader registers that are emulated with GLSL. This class keeps track of the state
|
|
|
* of all registers (e.g. whether they are currently being used as Floats or Integers), and
|
|
* of all registers (e.g. whether they are currently being used as Floats or Integers), and
|
|
@@ -464,13 +467,15 @@ public:
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- std::string GetInternalFlag(const InternalFlag ii) const {
|
|
|
|
|
- const u32 code = static_cast<u32>(ii);
|
|
|
|
|
- return "internalFlag_" + std::to_string(code) + suffix;
|
|
|
|
|
|
|
+ std::string GetInternalFlag(const InternalFlag flag) const {
|
|
|
|
|
+ const auto index = static_cast<u32>(flag);
|
|
|
|
|
+ ASSERT(index < static_cast<u32>(InternalFlag::Amount));
|
|
|
|
|
+
|
|
|
|
|
+ return std::string(INTERNAL_FLAG_NAMES[index]) + '_' + suffix;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- void SetInternalFlag(const InternalFlag ii, const std::string& value) const {
|
|
|
|
|
- shader.AddLine(GetInternalFlag(ii) + " = " + value + ';');
|
|
|
|
|
|
|
+ void SetInternalFlag(const InternalFlag flag, const std::string& value) const {
|
|
|
|
|
+ shader.AddLine(GetInternalFlag(flag) + " = " + value + ';');
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
/**
|
|
@@ -621,8 +626,8 @@ private:
|
|
|
|
|
|
|
|
/// Generates declarations for internal flags.
|
|
/// Generates declarations for internal flags.
|
|
|
void GenerateInternalFlags() {
|
|
void GenerateInternalFlags() {
|
|
|
- for (u32 ii = 0; ii < static_cast<u64>(InternalFlag::Amount); ii++) {
|
|
|
|
|
- const InternalFlag code = static_cast<InternalFlag>(ii);
|
|
|
|
|
|
|
+ for (u32 flag = 0; flag < static_cast<u32>(InternalFlag::Amount); flag++) {
|
|
|
|
|
+ const InternalFlag code = static_cast<InternalFlag>(flag);
|
|
|
declarations.AddLine("bool " + GetInternalFlag(code) + " = false;");
|
|
declarations.AddLine("bool " + GetInternalFlag(code) + " = false;");
|
|
|
}
|
|
}
|
|
|
declarations.AddNewLine();
|
|
declarations.AddNewLine();
|