Merge pull request #3288 from ReinUsesLisp/uncurse-aoffi
shader_ir/texture: Simplify AOFFI code
This commit is contained in:
commit
15788ffcde
|
@ -794,14 +794,10 @@ std::tuple<std::size_t, std::size_t> ShaderIR::ValidateAndGetCoordinateElement(
|
||||||
|
|
||||||
std::vector<Node> ShaderIR::GetAoffiCoordinates(Node aoffi_reg, std::size_t coord_count,
|
std::vector<Node> ShaderIR::GetAoffiCoordinates(Node aoffi_reg, std::size_t coord_count,
|
||||||
bool is_tld4) {
|
bool is_tld4) {
|
||||||
const auto [coord_offsets, size, wrap_value,
|
const std::array coord_offsets = is_tld4 ? std::array{0U, 8U, 16U} : std::array{0U, 4U, 8U};
|
||||||
diff_value] = [is_tld4]() -> std::tuple<std::array<u32, 3>, u32, s32, s32> {
|
const u32 size = is_tld4 ? 6 : 4;
|
||||||
if (is_tld4) {
|
const s32 wrap_value = is_tld4 ? 32 : 8;
|
||||||
return {{0, 8, 16}, 6, 32, 64};
|
const s32 diff_value = is_tld4 ? 64 : 16;
|
||||||
} else {
|
|
||||||
return {{0, 4, 8}, 4, 8, 16};
|
|
||||||
}
|
|
||||||
}();
|
|
||||||
const u32 mask = (1U << size) - 1;
|
const u32 mask = (1U << size) - 1;
|
||||||
|
|
||||||
std::vector<Node> aoffi;
|
std::vector<Node> aoffi;
|
||||||
|
@ -814,7 +810,7 @@ std::vector<Node> ShaderIR::GetAoffiCoordinates(Node aoffi_reg, std::size_t coor
|
||||||
LOG_WARNING(HW_GPU,
|
LOG_WARNING(HW_GPU,
|
||||||
"AOFFI constant folding failed, some hardware might have graphical issues");
|
"AOFFI constant folding failed, some hardware might have graphical issues");
|
||||||
for (std::size_t coord = 0; coord < coord_count; ++coord) {
|
for (std::size_t coord = 0; coord < coord_count; ++coord) {
|
||||||
const Node value = BitfieldExtract(aoffi_reg, coord_offsets.at(coord), size);
|
const Node value = BitfieldExtract(aoffi_reg, coord_offsets[coord], size);
|
||||||
const Node condition =
|
const Node condition =
|
||||||
Operation(OperationCode::LogicalIGreaterEqual, value, Immediate(wrap_value));
|
Operation(OperationCode::LogicalIGreaterEqual, value, Immediate(wrap_value));
|
||||||
const Node negative = Operation(OperationCode::IAdd, value, Immediate(-diff_value));
|
const Node negative = Operation(OperationCode::IAdd, value, Immediate(-diff_value));
|
||||||
|
@ -824,7 +820,7 @@ std::vector<Node> ShaderIR::GetAoffiCoordinates(Node aoffi_reg, std::size_t coor
|
||||||
}
|
}
|
||||||
|
|
||||||
for (std::size_t coord = 0; coord < coord_count; ++coord) {
|
for (std::size_t coord = 0; coord < coord_count; ++coord) {
|
||||||
s32 value = (*aoffi_immediate >> coord_offsets.at(coord)) & mask;
|
s32 value = (*aoffi_immediate >> coord_offsets[coord]) & mask;
|
||||||
if (value >= wrap_value) {
|
if (value >= wrap_value) {
|
||||||
value -= diff_value;
|
value -= diff_value;
|
||||||
}
|
}
|
||||||
|
|
Reference in New Issue