mirror of
https://github.com/KytyPS5/KytyPS5.git
synced 2026-10-21 03:16:54 +02:00
refactor(shader): centralize typed resource metadata
This commit is contained in:
@@ -79,19 +79,16 @@ bool HasSideEffects(ValueOpcode opcode) {
|
||||
shared_access == SharedAccess::Append || shared_access == SharedAccess::Consume) {
|
||||
return true;
|
||||
}
|
||||
if (AddressOpcodeInfoOf(opcode).access == AddressAccess::Write) {
|
||||
return true;
|
||||
}
|
||||
const auto image_info = ImageOpcodeInfoOf(opcode);
|
||||
if (image_info.access == ImageAccess::Write || image_info.access == ImageAccess::Atomic) {
|
||||
return true;
|
||||
}
|
||||
switch (opcode) {
|
||||
case ValueOpcode::Reference:
|
||||
case ValueOpcode::ReferenceU32:
|
||||
case ValueOpcode::StoreAddressU8:
|
||||
case ValueOpcode::StoreAddressU16:
|
||||
case ValueOpcode::StoreAddressU32:
|
||||
case ValueOpcode::ImageAtomicIAdd32:
|
||||
case ValueOpcode::ImageAtomicUMin32:
|
||||
case ValueOpcode::ImageAtomicUMax32:
|
||||
case ValueOpcode::ImageAtomicAnd32:
|
||||
case ValueOpcode::ImageAtomicOr32:
|
||||
case ValueOpcode::ImageAtomicXor32:
|
||||
case ValueOpcode::ImageWrite:
|
||||
case ValueOpcode::SetAttribute:
|
||||
case ValueOpcode::Barrier: return true;
|
||||
default: return false;
|
||||
@@ -185,4 +182,37 @@ uint32_t SharedComponentCount(ValueOpcode opcode) {
|
||||
}
|
||||
}
|
||||
|
||||
AddressOpcodeInfo AddressOpcodeInfoOf(ValueOpcode opcode) {
|
||||
switch (opcode) {
|
||||
case ValueOpcode::LoadAddressU8: return {AddressAccess::Read, 8u};
|
||||
case ValueOpcode::LoadAddressU16: return {AddressAccess::Read, 16u};
|
||||
case ValueOpcode::LoadAddressU32: return {AddressAccess::Read, 32u};
|
||||
case ValueOpcode::StoreAddressU8: return {AddressAccess::Write, 8u};
|
||||
case ValueOpcode::StoreAddressU16: return {AddressAccess::Write, 16u};
|
||||
case ValueOpcode::StoreAddressU32: return {AddressAccess::Write, 32u};
|
||||
default: return {};
|
||||
}
|
||||
}
|
||||
|
||||
ImageOpcodeInfo ImageOpcodeInfoOf(ValueOpcode opcode) {
|
||||
switch (opcode) {
|
||||
case ValueOpcode::ImageQueryDimensions:
|
||||
case ValueOpcode::ImageRead: return {ImageAccess::Read, ImageResourceClass::Sampled, false};
|
||||
case ValueOpcode::ImageQueryLod:
|
||||
case ValueOpcode::ImageSampleRaw:
|
||||
case ValueOpcode::ImageGatherRaw:
|
||||
return {ImageAccess::Read, ImageResourceClass::Sampled, true};
|
||||
case ValueOpcode::ImageWrite:
|
||||
return {ImageAccess::Write, ImageResourceClass::Storage, false};
|
||||
case ValueOpcode::ImageAtomicIAdd32:
|
||||
case ValueOpcode::ImageAtomicUMin32:
|
||||
case ValueOpcode::ImageAtomicUMax32:
|
||||
case ValueOpcode::ImageAtomicAnd32:
|
||||
case ValueOpcode::ImageAtomicOr32:
|
||||
case ValueOpcode::ImageAtomicXor32:
|
||||
return {ImageAccess::Atomic, ImageResourceClass::StorageUint, false};
|
||||
default: return {};
|
||||
}
|
||||
}
|
||||
|
||||
} // namespace Libs::Graphics::ShaderRecompiler::IR
|
||||
|
||||
@@ -18,6 +18,20 @@ enum class ValueOpcode {
|
||||
|
||||
enum class BufferAccess { None, Read, Write, Atomic };
|
||||
enum class SharedAccess { None, Read, Write, Atomic, Append, Consume };
|
||||
enum class AddressAccess { None, Read, Write };
|
||||
enum class ImageAccess { None, Read, Write, Atomic };
|
||||
enum class ImageResourceClass { None, Sampled, Storage, StorageUint };
|
||||
|
||||
struct AddressOpcodeInfo {
|
||||
AddressAccess access = AddressAccess::None;
|
||||
uint32_t data_bits = 0;
|
||||
};
|
||||
|
||||
struct ImageOpcodeInfo {
|
||||
ImageAccess access = ImageAccess::None;
|
||||
ImageResourceClass resource_class = ImageResourceClass::None;
|
||||
bool needs_sampler = false;
|
||||
};
|
||||
|
||||
struct DppMoveFlags {
|
||||
uint16_t control = 0;
|
||||
@@ -51,14 +65,16 @@ struct ExportFlags {
|
||||
static_assert(sizeof(ExportFlags) == sizeof(uint64_t));
|
||||
static_assert(std::is_trivially_copyable_v<ExportFlags>);
|
||||
|
||||
[[nodiscard]] Type TypeOf(ValueOpcode opcode);
|
||||
[[nodiscard]] Type ArgTypeOf(ValueOpcode opcode, size_t index);
|
||||
[[nodiscard]] size_t NumArgsOf(ValueOpcode opcode);
|
||||
[[nodiscard]] bool HasSideEffects(ValueOpcode opcode);
|
||||
[[nodiscard]] BufferAccess BufferAccessOf(ValueOpcode opcode);
|
||||
[[nodiscard]] uint32_t BufferComponentCount(ValueOpcode opcode);
|
||||
[[nodiscard]] SharedAccess SharedAccessOf(ValueOpcode opcode);
|
||||
[[nodiscard]] uint32_t SharedComponentCount(ValueOpcode opcode);
|
||||
[[nodiscard]] std::string_view ValueOpcodeName(ValueOpcode opcode);
|
||||
[[nodiscard]] Type TypeOf(ValueOpcode opcode);
|
||||
[[nodiscard]] Type ArgTypeOf(ValueOpcode opcode, size_t index);
|
||||
[[nodiscard]] size_t NumArgsOf(ValueOpcode opcode);
|
||||
[[nodiscard]] bool HasSideEffects(ValueOpcode opcode);
|
||||
[[nodiscard]] BufferAccess BufferAccessOf(ValueOpcode opcode);
|
||||
[[nodiscard]] uint32_t BufferComponentCount(ValueOpcode opcode);
|
||||
[[nodiscard]] SharedAccess SharedAccessOf(ValueOpcode opcode);
|
||||
[[nodiscard]] uint32_t SharedComponentCount(ValueOpcode opcode);
|
||||
[[nodiscard]] AddressOpcodeInfo AddressOpcodeInfoOf(ValueOpcode opcode);
|
||||
[[nodiscard]] ImageOpcodeInfo ImageOpcodeInfoOf(ValueOpcode opcode);
|
||||
[[nodiscard]] std::string_view ValueOpcodeName(ValueOpcode opcode);
|
||||
|
||||
} // namespace Libs::Graphics::ShaderRecompiler::IR
|
||||
|
||||
@@ -2,7 +2,6 @@
|
||||
VALUE_OPCODE(Phi, Opaque)
|
||||
VALUE_OPCODE(Identity, Opaque, Opaque)
|
||||
VALUE_OPCODE(Void, Void)
|
||||
VALUE_OPCODE(ConditionRef, U1, U1)
|
||||
VALUE_OPCODE(Reference, Void, U1)
|
||||
VALUE_OPCODE(ReferenceU32, Void, U32)
|
||||
|
||||
@@ -112,7 +111,6 @@ VALUE_OPCODE(BitCount32, U32, U32)
|
||||
VALUE_OPCODE(BitCount64, U32, U64)
|
||||
VALUE_OPCODE(FindUMsb32, U32, U32)
|
||||
VALUE_OPCODE(FindUMsb64, U32, U64)
|
||||
VALUE_OPCODE(FindSMsb32, U32, U32)
|
||||
VALUE_OPCODE(FindILsb32, U32, U32)
|
||||
VALUE_OPCODE(SMin32, U32, U32, U32)
|
||||
VALUE_OPCODE(UMin32, U32, U32, U32)
|
||||
@@ -131,19 +129,14 @@ VALUE_OPCODE(ULessThan64, U1, U64, U64)
|
||||
VALUE_OPCODE(IEqual32, U1, U32, U32)
|
||||
VALUE_OPCODE(IEqual64, U1, U64, U64)
|
||||
VALUE_OPCODE(SLessThanEqual32, U1, U32, U32)
|
||||
VALUE_OPCODE(SLessThanEqual64, U1, U64, U64)
|
||||
VALUE_OPCODE(ULessThanEqual32, U1, U32, U32)
|
||||
VALUE_OPCODE(ULessThanEqual64, U1, U64, U64)
|
||||
VALUE_OPCODE(SGreaterThan32, U1, U32, U32)
|
||||
VALUE_OPCODE(SGreaterThan64, U1, U64, U64)
|
||||
VALUE_OPCODE(UGreaterThan32, U1, U32, U32)
|
||||
VALUE_OPCODE(UGreaterThan64, U1, U64, U64)
|
||||
VALUE_OPCODE(INotEqual32, U1, U32, U32)
|
||||
VALUE_OPCODE(INotEqual64, U1, U64, U64)
|
||||
VALUE_OPCODE(SGreaterThanEqual32, U1, U32, U32)
|
||||
VALUE_OPCODE(SGreaterThanEqual64, U1, U64, U64)
|
||||
VALUE_OPCODE(UGreaterThanEqual32, U1, U32, U32)
|
||||
VALUE_OPCODE(UGreaterThanEqual64, U1, U64, U64)
|
||||
VALUE_OPCODE(LogicalOr, U1, U1, U1)
|
||||
VALUE_OPCODE(LogicalAnd, U1, U1, U1)
|
||||
VALUE_OPCODE(LogicalXor, U1, U1, U1)
|
||||
|
||||
Reference in New Issue
Block a user