|
|
|
@ -45,6 +45,30 @@ void AddRegisterIndexedLdc(Info& info) { |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
u32 GetElementSize(IR::Type& used_type, Shader::IR::Opcode opcode) { |
|
|
|
switch (opcode) { |
|
|
|
case IR::Opcode::GetCbufU8: |
|
|
|
case IR::Opcode::GetCbufS8: |
|
|
|
used_type |= IR::Type::U8; |
|
|
|
return 1; |
|
|
|
case IR::Opcode::GetCbufU16: |
|
|
|
case IR::Opcode::GetCbufS16: |
|
|
|
used_type |= IR::Type::U16; |
|
|
|
return 2; |
|
|
|
case IR::Opcode::GetCbufU32: |
|
|
|
used_type |= IR::Type::U32; |
|
|
|
return 4; |
|
|
|
case IR::Opcode::GetCbufF32: |
|
|
|
used_type |= IR::Type::F32; |
|
|
|
return 4; |
|
|
|
case IR::Opcode::GetCbufU32x2: |
|
|
|
used_type |= IR::Type::U32x2; |
|
|
|
return 8; |
|
|
|
default: |
|
|
|
throw InvalidArgument("Invalid opcode {}", opcode); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
void GetPatch(Info& info, IR::Patch patch) { |
|
|
|
if (!IR::IsGeneric(patch)) { |
|
|
|
throw NotImplementedException("Reading non-generic patch {}", patch); |
|
|
|
@ -481,45 +505,16 @@ void VisitUsages(Info& info, IR::Inst& inst) { |
|
|
|
const IR::Value offset{inst.Arg(1)}; |
|
|
|
if (index.IsImmediate()) { |
|
|
|
AddConstantBufferDescriptor(info, index.U32(), 1); |
|
|
|
} else { |
|
|
|
AddRegisterIndexedLdc(info); |
|
|
|
} |
|
|
|
|
|
|
|
u32 element_size{}; |
|
|
|
switch (inst.GetOpcode()) { |
|
|
|
case IR::Opcode::GetCbufU8: |
|
|
|
case IR::Opcode::GetCbufS8: |
|
|
|
info.used_constant_buffer_types |= IR::Type::U8; |
|
|
|
element_size = 1; |
|
|
|
break; |
|
|
|
case IR::Opcode::GetCbufU16: |
|
|
|
case IR::Opcode::GetCbufS16: |
|
|
|
info.used_constant_buffer_types |= IR::Type::U16; |
|
|
|
element_size = 2; |
|
|
|
break; |
|
|
|
case IR::Opcode::GetCbufU32: |
|
|
|
info.used_constant_buffer_types |= IR::Type::U32; |
|
|
|
element_size = 4; |
|
|
|
break; |
|
|
|
case IR::Opcode::GetCbufF32: |
|
|
|
info.used_constant_buffer_types |= IR::Type::F32; |
|
|
|
element_size = 4; |
|
|
|
break; |
|
|
|
case IR::Opcode::GetCbufU32x2: |
|
|
|
info.used_constant_buffer_types |= IR::Type::U32x2; |
|
|
|
element_size = 8; |
|
|
|
break; |
|
|
|
default: |
|
|
|
break; |
|
|
|
} |
|
|
|
|
|
|
|
if (index.IsImmediate()) { |
|
|
|
u32 element_size = GetElementSize(info.used_constant_buffer_types, inst.GetOpcode()); |
|
|
|
u32& size{info.constant_buffer_used_sizes[index.U32()]}; |
|
|
|
if (offset.IsImmediate()) { |
|
|
|
size = Common::AlignUp(std::max(size, offset.U32() + element_size), 16u); |
|
|
|
} else { |
|
|
|
size = 0x10'000; |
|
|
|
} |
|
|
|
} else { |
|
|
|
AddRegisterIndexedLdc(info); |
|
|
|
GetElementSize(info.used_indirect_cbuf_types, inst.GetOpcode()); |
|
|
|
} |
|
|
|
break; |
|
|
|
} |
|
|
|
|