|
|
@@ -271,6 +271,15 @@ enum class TextureProcessMode : u64 {
|
|
|
LLA = 7 // Load LOD. The A is unknown, does not appear to differ with LL
|
|
|
};
|
|
|
|
|
|
+enum class TextureMiscMode : u64 {
|
|
|
+ DC,
|
|
|
+ AOFFI, // Uses Offset
|
|
|
+ NDV,
|
|
|
+ NODEP,
|
|
|
+ MZ,
|
|
|
+ PTP,
|
|
|
+};
|
|
|
+
|
|
|
enum class IpaInterpMode : u64 { Linear = 0, Perspective = 1, Flat = 2, Sc = 3 };
|
|
|
enum class IpaSampleMode : u64 { Default = 0, Centroid = 1, Offset = 2 };
|
|
|
|
|
|
@@ -590,42 +599,127 @@ union Instruction {
|
|
|
BitField<28, 1, u64> array;
|
|
|
BitField<29, 2, TextureType> texture_type;
|
|
|
BitField<31, 4, u64> component_mask;
|
|
|
+ BitField<49, 1, u64> nodep_flag;
|
|
|
+ BitField<50, 1, u64> dc_flag;
|
|
|
+ BitField<54, 1, u64> aoffi_flag;
|
|
|
BitField<55, 3, TextureProcessMode> process_mode;
|
|
|
|
|
|
bool IsComponentEnabled(std::size_t component) const {
|
|
|
return ((1ull << component) & component_mask) != 0;
|
|
|
}
|
|
|
+
|
|
|
+ TextureProcessMode GetTextureProcessMode() const {
|
|
|
+ return process_mode;
|
|
|
+ }
|
|
|
+
|
|
|
+ bool UsesMiscMode(TextureMiscMode mode) const {
|
|
|
+ switch (mode) {
|
|
|
+ case TextureMiscMode::DC:
|
|
|
+ return dc_flag != 0;
|
|
|
+ case TextureMiscMode::NODEP:
|
|
|
+ return nodep_flag != 0;
|
|
|
+ case TextureMiscMode::AOFFI:
|
|
|
+ return aoffi_flag != 0;
|
|
|
+ default:
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ return false;
|
|
|
+ }
|
|
|
} tex;
|
|
|
|
|
|
union {
|
|
|
BitField<22, 6, TextureQueryType> query_type;
|
|
|
BitField<31, 4, u64> component_mask;
|
|
|
+ BitField<49, 1, u64> nodep_flag;
|
|
|
+
|
|
|
+ bool UsesMiscMode(TextureMiscMode mode) const {
|
|
|
+ switch (mode) {
|
|
|
+ case TextureMiscMode::NODEP:
|
|
|
+ return nodep_flag != 0;
|
|
|
+ default:
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ return false;
|
|
|
+ }
|
|
|
} txq;
|
|
|
|
|
|
union {
|
|
|
BitField<28, 1, u64> array;
|
|
|
BitField<29, 2, TextureType> texture_type;
|
|
|
BitField<31, 4, u64> component_mask;
|
|
|
+ BitField<35, 1, u64> ndv_flag;
|
|
|
+ BitField<49, 1, u64> nodep_flag;
|
|
|
|
|
|
bool IsComponentEnabled(std::size_t component) const {
|
|
|
return ((1ull << component) & component_mask) != 0;
|
|
|
}
|
|
|
+
|
|
|
+ bool UsesMiscMode(TextureMiscMode mode) const {
|
|
|
+ switch (mode) {
|
|
|
+ case TextureMiscMode::NDV:
|
|
|
+ return (ndv_flag != 0);
|
|
|
+ case TextureMiscMode::NODEP:
|
|
|
+ return (nodep_flag != 0);
|
|
|
+ default:
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ return false;
|
|
|
+ }
|
|
|
} tmml;
|
|
|
|
|
|
union {
|
|
|
BitField<28, 1, u64> array;
|
|
|
BitField<29, 2, TextureType> texture_type;
|
|
|
+ BitField<35, 1, u64> ndv_flag;
|
|
|
+ BitField<49, 1, u64> nodep_flag;
|
|
|
+ BitField<50, 1, u64> dc_flag;
|
|
|
+ BitField<54, 2, u64> info;
|
|
|
BitField<56, 2, u64> component;
|
|
|
+
|
|
|
+ bool UsesMiscMode(TextureMiscMode mode) const {
|
|
|
+ switch (mode) {
|
|
|
+ case TextureMiscMode::NDV:
|
|
|
+ return ndv_flag != 0;
|
|
|
+ case TextureMiscMode::NODEP:
|
|
|
+ return nodep_flag != 0;
|
|
|
+ case TextureMiscMode::DC:
|
|
|
+ return dc_flag != 0;
|
|
|
+ case TextureMiscMode::AOFFI:
|
|
|
+ return info == 1;
|
|
|
+ case TextureMiscMode::PTP:
|
|
|
+ return info == 2;
|
|
|
+ default:
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ return false;
|
|
|
+ }
|
|
|
} tld4;
|
|
|
|
|
|
union {
|
|
|
+ BitField<49, 1, u64> nodep_flag;
|
|
|
+ BitField<50, 1, u64> dc_flag;
|
|
|
+ BitField<51, 1, u64> aoffi_flag;
|
|
|
BitField<52, 2, u64> component;
|
|
|
+
|
|
|
+ bool UsesMiscMode(TextureMiscMode mode) const {
|
|
|
+ switch (mode) {
|
|
|
+ case TextureMiscMode::DC:
|
|
|
+ return dc_flag != 0;
|
|
|
+ case TextureMiscMode::NODEP:
|
|
|
+ return nodep_flag != 0;
|
|
|
+ case TextureMiscMode::AOFFI:
|
|
|
+ return aoffi_flag != 0;
|
|
|
+ default:
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ return false;
|
|
|
+ }
|
|
|
} tld4s;
|
|
|
|
|
|
union {
|
|
|
BitField<0, 8, Register> gpr0;
|
|
|
BitField<28, 8, Register> gpr28;
|
|
|
- BitField<49, 1, u64> nodep;
|
|
|
+ BitField<49, 1, u64> nodep_flag;
|
|
|
BitField<50, 3, u64> component_mask_selector;
|
|
|
BitField<53, 4, u64> texture_info;
|
|
|
|
|
|
@@ -645,6 +739,37 @@ union Instruction {
|
|
|
UNREACHABLE();
|
|
|
}
|
|
|
|
|
|
+ TextureProcessMode GetTextureProcessMode() const {
|
|
|
+ switch (texture_info) {
|
|
|
+ case 0:
|
|
|
+ case 2:
|
|
|
+ case 6:
|
|
|
+ case 8:
|
|
|
+ case 9:
|
|
|
+ case 11:
|
|
|
+ return TextureProcessMode::LZ;
|
|
|
+ case 3:
|
|
|
+ case 5:
|
|
|
+ case 13:
|
|
|
+ return TextureProcessMode::LL;
|
|
|
+ default:
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ return TextureProcessMode::None;
|
|
|
+ }
|
|
|
+
|
|
|
+ bool UsesMiscMode(TextureMiscMode mode) const {
|
|
|
+ switch (mode) {
|
|
|
+ case TextureMiscMode::DC:
|
|
|
+ return (texture_info >= 4 && texture_info <= 6) || texture_info == 9;
|
|
|
+ case TextureMiscMode::NODEP:
|
|
|
+ return nodep_flag != 0;
|
|
|
+ default:
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
bool IsArrayTexture() const {
|
|
|
// TEXS only supports Texture2D arrays.
|
|
|
return texture_info >= 7 && texture_info <= 9;
|
|
|
@@ -673,6 +798,7 @@ union Instruction {
|
|
|
} texs;
|
|
|
|
|
|
union {
|
|
|
+ BitField<49, 1, u64> nodep_flag;
|
|
|
BitField<53, 4, u64> texture_info;
|
|
|
|
|
|
TextureType GetTextureType() const {
|
|
|
@@ -693,6 +819,26 @@ union Instruction {
|
|
|
UNREACHABLE();
|
|
|
}
|
|
|
|
|
|
+ TextureProcessMode GetTextureProcessMode() const {
|
|
|
+ if (texture_info == 1 || texture_info == 5 || texture_info == 12)
|
|
|
+ return TextureProcessMode::LL;
|
|
|
+ return TextureProcessMode::LZ;
|
|
|
+ }
|
|
|
+
|
|
|
+ bool UsesMiscMode(TextureMiscMode mode) const {
|
|
|
+ switch (mode) {
|
|
|
+ case TextureMiscMode::AOFFI:
|
|
|
+ return texture_info == 12 || texture_info == 4;
|
|
|
+ case TextureMiscMode::MZ:
|
|
|
+ return texture_info == 5;
|
|
|
+ case TextureMiscMode::NODEP:
|
|
|
+ return nodep_flag != 0;
|
|
|
+ default:
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
bool IsArrayTexture() const {
|
|
|
// TEXS only supports Texture2D arrays.
|
|
|
return texture_info == 8;
|