refactor(shader): centralize typed resource metadata

This commit is contained in:
nmzik
2026-08-19 11:33:05 +02:00
parent 87166eed94
commit 85cf965d54
18 changed files with 455 additions and 314 deletions
@@ -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