|
|
|
@ -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;
|
|
|
|
|