mirror of
https://github.com/yuzu-emu/yuzu-android.git
synced 2025-06-10 16:28:15 -05:00
shader: Refactor PTP and other minor changes
This commit is contained in:
@ -398,16 +398,15 @@ Value IREmitter::CompositeConstruct(const Value& e1, const Value& e2) {
|
||||
if (e1.Type() != e2.Type()) {
|
||||
throw InvalidArgument("Mismatching types {} and {}", e1.Type(), e2.Type());
|
||||
}
|
||||
CompositeDecoration decor{};
|
||||
switch (e1.Type()) {
|
||||
case Type::U32:
|
||||
return Inst(Opcode::CompositeConstructU32x2, Flags{decor}, e1, e2);
|
||||
return Inst(Opcode::CompositeConstructU32x2, e1, e2);
|
||||
case Type::F16:
|
||||
return Inst(Opcode::CompositeConstructF16x2, Flags{decor}, e1, e2);
|
||||
return Inst(Opcode::CompositeConstructF16x2, e1, e2);
|
||||
case Type::F32:
|
||||
return Inst(Opcode::CompositeConstructF32x2, Flags{decor}, e1, e2);
|
||||
return Inst(Opcode::CompositeConstructF32x2, e1, e2);
|
||||
case Type::F64:
|
||||
return Inst(Opcode::CompositeConstructF64x2, Flags{decor}, e1, e2);
|
||||
return Inst(Opcode::CompositeConstructF64x2, e1, e2);
|
||||
default:
|
||||
ThrowInvalidType(e1.Type());
|
||||
}
|
||||
@ -437,7 +436,6 @@ Value IREmitter::CompositeConstruct(const Value& e1, const Value& e2, const Valu
|
||||
throw InvalidArgument("Mismatching types {}, {}, {}, and {}", e1.Type(), e2.Type(),
|
||||
e3.Type(), e4.Type());
|
||||
}
|
||||
CompositeDecoration decor{};
|
||||
switch (e1.Type()) {
|
||||
case Type::U32:
|
||||
return Inst(Opcode::CompositeConstructU32x4, e1, e2, e3, e4);
|
||||
@ -447,8 +445,6 @@ Value IREmitter::CompositeConstruct(const Value& e1, const Value& e2, const Valu
|
||||
return Inst(Opcode::CompositeConstructF32x4, e1, e2, e3, e4);
|
||||
case Type::F64:
|
||||
return Inst(Opcode::CompositeConstructF64x4, e1, e2, e3, e4);
|
||||
case Type::U32x2:
|
||||
return Inst(Opcode::CompositeConstructArrayU32x2, Flags{decor}, e1, e2, e3, e4);
|
||||
default:
|
||||
ThrowInvalidType(e1.Type());
|
||||
}
|
||||
|
@ -101,8 +101,8 @@ public:
|
||||
|
||||
template <typename FlagsType>
|
||||
requires(sizeof(FlagsType) <= sizeof(u32) && std::is_trivially_copyable_v<FlagsType>)
|
||||
[[nodiscard]] void SetFlags(FlagsType& new_val) noexcept {
|
||||
std::memcpy(&flags, &new_val, sizeof(new_val));
|
||||
[[nodiscard]] void SetFlags(FlagsType value) noexcept {
|
||||
std::memcpy(&flags, &value, sizeof(value));
|
||||
}
|
||||
|
||||
/// Intrusively store the host definition of this instruction.
|
||||
|
@ -32,11 +32,6 @@ struct FpControl {
|
||||
};
|
||||
static_assert(sizeof(FpControl) <= sizeof(u32));
|
||||
|
||||
struct CompositeDecoration {
|
||||
bool is_constant{false};
|
||||
};
|
||||
static_assert(sizeof(CompositeDecoration) <= sizeof(u32));
|
||||
|
||||
union TextureInstInfo {
|
||||
u32 raw;
|
||||
BitField<0, 8, TextureType> type;
|
||||
|
@ -126,7 +126,6 @@ OPCODE(CompositeExtractF64x4, F64, F64x
|
||||
OPCODE(CompositeInsertF64x2, F64x2, F64x2, F64, U32, )
|
||||
OPCODE(CompositeInsertF64x3, F64x3, F64x3, F64, U32, )
|
||||
OPCODE(CompositeInsertF64x4, F64x4, F64x4, F64, U32, )
|
||||
OPCODE(CompositeConstructArrayU32x2, Opaque, U32x2, U32x2, U32x2, U32x2, )
|
||||
|
||||
// Select operations
|
||||
OPCODE(SelectU1, U1, U1, U1, U1, )
|
||||
|
@ -44,20 +44,6 @@ bool Value::IsEmpty() const noexcept {
|
||||
return type == Type::Void;
|
||||
}
|
||||
|
||||
bool Value::IsConstantContainer() const {
|
||||
if (IsImmediate()) {
|
||||
return true;
|
||||
}
|
||||
ValidateAccess(Type::Opaque);
|
||||
auto num_args = inst->NumArgs();
|
||||
for (size_t i = 0; i < num_args; i++) {
|
||||
if (!inst->Arg(i).IsConstantContainer()) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
bool Value::IsImmediate() const noexcept {
|
||||
if (IsIdentity()) {
|
||||
return inst->Arg(0).IsImmediate();
|
||||
|
@ -38,7 +38,6 @@ public:
|
||||
[[nodiscard]] bool IsImmediate() const noexcept;
|
||||
[[nodiscard]] bool IsLabel() const noexcept;
|
||||
[[nodiscard]] IR::Type Type() const noexcept;
|
||||
[[nodiscard]] bool IsConstantContainer() const;
|
||||
|
||||
[[nodiscard]] IR::Inst* Inst() const;
|
||||
[[nodiscard]] IR::Block* Label() const;
|
||||
|
@ -106,17 +106,17 @@ IR::Value MakeOffset(TranslatorVisitor& v, IR::Reg& reg, TextureType type) {
|
||||
throw NotImplementedException("Invalid texture type {}", type);
|
||||
}
|
||||
|
||||
IR::Value MakeOffsetPTP(TranslatorVisitor& v, IR::Reg& reg) {
|
||||
std::pair<IR::Value, IR::Value> MakeOffsetPTP(TranslatorVisitor& v, IR::Reg& reg) {
|
||||
const IR::U32 value1{v.X(reg++)};
|
||||
const IR::U32 value2{v.X(reg++)};
|
||||
const IR::U32 bitsize = v.ir.Imm32(6);
|
||||
const auto getVector = ([&v, &bitsize](const IR::U32& value, u32 base) {
|
||||
return v.ir.CompositeConstruct(
|
||||
v.ir.BitFieldExtract(value, v.ir.Imm32(base + 0), bitsize, true),
|
||||
v.ir.BitFieldExtract(value, v.ir.Imm32(base + 8), bitsize, true));
|
||||
});
|
||||
return v.ir.CompositeConstruct(getVector(value1, 0), getVector(value1, 16),
|
||||
getVector(value2, 0), getVector(value2, 16));
|
||||
const IR::U32 bitsize{v.ir.Imm32(6)};
|
||||
const auto make_vector{[&v, &bitsize](const IR::U32& value) {
|
||||
return v.ir.CompositeConstruct(v.ir.BitFieldExtract(value, v.ir.Imm32(0), bitsize, true),
|
||||
v.ir.BitFieldExtract(value, v.ir.Imm32(8), bitsize, true),
|
||||
v.ir.BitFieldExtract(value, v.ir.Imm32(16), bitsize, true),
|
||||
v.ir.BitFieldExtract(value, v.ir.Imm32(24), bitsize, true));
|
||||
}};
|
||||
return {make_vector(value1), make_vector(value2)};
|
||||
}
|
||||
|
||||
void Impl(TranslatorVisitor& v, u64 insn, ComponentType component_type, OffsetType offset_type,
|
||||
@ -150,14 +150,12 @@ void Impl(TranslatorVisitor& v, u64 insn, ComponentType component_type, OffsetTy
|
||||
switch (offset_type) {
|
||||
case OffsetType::None:
|
||||
break;
|
||||
case OffsetType::AOFFI: {
|
||||
case OffsetType::AOFFI:
|
||||
offset = MakeOffset(v, meta_reg, tld4.type);
|
||||
break;
|
||||
}
|
||||
case OffsetType::PTP: {
|
||||
offset2 = MakeOffsetPTP(v, meta_reg);
|
||||
case OffsetType::PTP:
|
||||
std::tie(offset, offset2) = MakeOffsetPTP(v, meta_reg);
|
||||
break;
|
||||
}
|
||||
default:
|
||||
throw NotImplementedException("Invalid offset type {}", offset_type);
|
||||
}
|
||||
@ -167,7 +165,7 @@ void Impl(TranslatorVisitor& v, u64 insn, ComponentType component_type, OffsetTy
|
||||
IR::TextureInstInfo info{};
|
||||
info.type.Assign(GetType(tld4.type, tld4.dc != 0));
|
||||
info.gather_component.Assign(static_cast<u32>(component_type));
|
||||
const IR::Value sample{[&]() -> IR::Value {
|
||||
const IR::Value sample{[&] {
|
||||
if (tld4.dc == 0) {
|
||||
return v.ir.ImageGather(handle, coords, offset, offset2, info);
|
||||
}
|
||||
|
Reference in New Issue
Block a user