diff options
Diffstat (limited to 'src/video_core/renderer_vulkan')
| -rw-r--r-- | src/video_core/renderer_vulkan/vk_shader_decompiler.cpp | 66 |
1 files changed, 33 insertions, 33 deletions
diff --git a/src/video_core/renderer_vulkan/vk_shader_decompiler.cpp b/src/video_core/renderer_vulkan/vk_shader_decompiler.cpp index b53078721..1ab22251e 100644 --- a/src/video_core/renderer_vulkan/vk_shader_decompiler.cpp +++ b/src/video_core/renderer_vulkan/vk_shader_decompiler.cpp | |||
| @@ -1123,15 +1123,7 @@ private: | |||
| 1123 | } | 1123 | } |
| 1124 | 1124 | ||
| 1125 | if (const auto gmem = std::get_if<GmemNode>(&*node)) { | 1125 | if (const auto gmem = std::get_if<GmemNode>(&*node)) { |
| 1126 | const Id gmem_buffer = global_buffers.at(gmem->GetDescriptor()); | 1126 | return {OpLoad(t_uint, GetGlobalMemoryPointer(*gmem)), Type::Uint}; |
| 1127 | const Id real = AsUint(Visit(gmem->GetRealAddress())); | ||
| 1128 | const Id base = AsUint(Visit(gmem->GetBaseAddress())); | ||
| 1129 | |||
| 1130 | Id offset = OpISub(t_uint, real, base); | ||
| 1131 | offset = OpUDiv(t_uint, offset, Constant(t_uint, 4U)); | ||
| 1132 | return {OpLoad(t_float, | ||
| 1133 | OpAccessChain(t_gmem_float, gmem_buffer, Constant(t_uint, 0U), offset)), | ||
| 1134 | Type::Float}; | ||
| 1135 | } | 1127 | } |
| 1136 | 1128 | ||
| 1137 | if (const auto lmem = std::get_if<LmemNode>(&*node)) { | 1129 | if (const auto lmem = std::get_if<LmemNode>(&*node)) { |
| @@ -1142,10 +1134,7 @@ private: | |||
| 1142 | } | 1134 | } |
| 1143 | 1135 | ||
| 1144 | if (const auto smem = std::get_if<SmemNode>(&*node)) { | 1136 | if (const auto smem = std::get_if<SmemNode>(&*node)) { |
| 1145 | Id address = AsUint(Visit(smem->GetAddress())); | 1137 | return {OpLoad(t_uint, GetSharedMemoryPointer(*smem)), Type::Uint}; |
| 1146 | address = OpShiftRightLogical(t_uint, address, Constant(t_uint, 2U)); | ||
| 1147 | const Id pointer = OpAccessChain(t_smem_uint, shared_memory, address); | ||
| 1148 | return {OpLoad(t_uint, pointer), Type::Uint}; | ||
| 1149 | } | 1138 | } |
| 1150 | 1139 | ||
| 1151 | if (const auto internal_flag = std::get_if<InternalFlagNode>(&*node)) { | 1140 | if (const auto internal_flag = std::get_if<InternalFlagNode>(&*node)) { |
| @@ -1339,20 +1328,10 @@ private: | |||
| 1339 | target = {OpAccessChain(t_prv_float, local_memory, address), Type::Float}; | 1328 | target = {OpAccessChain(t_prv_float, local_memory, address), Type::Float}; |
| 1340 | 1329 | ||
| 1341 | } else if (const auto smem = std::get_if<SmemNode>(&*dest)) { | 1330 | } else if (const auto smem = std::get_if<SmemNode>(&*dest)) { |
| 1342 | ASSERT(stage == ShaderType::Compute); | 1331 | target = {GetSharedMemoryPointer(*smem), Type::Uint}; |
| 1343 | Id address = AsUint(Visit(smem->GetAddress())); | ||
| 1344 | address = OpShiftRightLogical(t_uint, address, Constant(t_uint, 2U)); | ||
| 1345 | target = {OpAccessChain(t_smem_uint, shared_memory, address), Type::Uint}; | ||
| 1346 | 1332 | ||
| 1347 | } else if (const auto gmem = std::get_if<GmemNode>(&*dest)) { | 1333 | } else if (const auto gmem = std::get_if<GmemNode>(&*dest)) { |
| 1348 | const Id real = AsUint(Visit(gmem->GetRealAddress())); | 1334 | target = {GetGlobalMemoryPointer(*gmem), Type::Uint}; |
| 1349 | const Id base = AsUint(Visit(gmem->GetBaseAddress())); | ||
| 1350 | const Id diff = OpISub(t_uint, real, base); | ||
| 1351 | const Id offset = OpShiftRightLogical(t_uint, diff, Constant(t_uint, 2)); | ||
| 1352 | |||
| 1353 | const Id gmem_buffer = global_buffers.at(gmem->GetDescriptor()); | ||
| 1354 | target = {OpAccessChain(t_gmem_float, gmem_buffer, Constant(t_uint, 0), offset), | ||
| 1355 | Type::Float}; | ||
| 1356 | 1335 | ||
| 1357 | } else { | 1336 | } else { |
| 1358 | UNIMPLEMENTED(); | 1337 | UNIMPLEMENTED(); |
| @@ -1804,11 +1783,16 @@ private: | |||
| 1804 | return {}; | 1783 | return {}; |
| 1805 | } | 1784 | } |
| 1806 | 1785 | ||
| 1807 | Expression UAtomicAdd(Operation operation) { | 1786 | Expression AtomicAdd(Operation operation) { |
| 1808 | const auto& smem = std::get<SmemNode>(*operation[0]); | 1787 | Id pointer; |
| 1809 | Id address = AsUint(Visit(smem.GetAddress())); | 1788 | if (const auto smem = std::get_if<SmemNode>(&*operation[0])) { |
| 1810 | address = OpShiftRightLogical(t_uint, address, Constant(t_uint, 2U)); | 1789 | pointer = GetSharedMemoryPointer(*smem); |
| 1811 | const Id pointer = OpAccessChain(t_smem_uint, shared_memory, address); | 1790 | } else if (const auto gmem = std::get_if<GmemNode>(&*operation[0])) { |
| 1791 | pointer = GetGlobalMemoryPointer(*gmem); | ||
| 1792 | } else { | ||
| 1793 | UNREACHABLE(); | ||
| 1794 | return {Constant(t_uint, 0), Type::Uint}; | ||
| 1795 | } | ||
| 1812 | 1796 | ||
| 1813 | const Id scope = Constant(t_uint, static_cast<u32>(spv::Scope::Device)); | 1797 | const Id scope = Constant(t_uint, static_cast<u32>(spv::Scope::Device)); |
| 1814 | const Id semantics = Constant(t_uint, 0U); | 1798 | const Id semantics = Constant(t_uint, 0U); |
| @@ -2243,6 +2227,22 @@ private: | |||
| 2243 | return {}; | 2227 | return {}; |
| 2244 | } | 2228 | } |
| 2245 | 2229 | ||
| 2230 | Id GetGlobalMemoryPointer(const GmemNode& gmem) { | ||
| 2231 | const Id real = AsUint(Visit(gmem.GetRealAddress())); | ||
| 2232 | const Id base = AsUint(Visit(gmem.GetBaseAddress())); | ||
| 2233 | const Id diff = OpISub(t_uint, real, base); | ||
| 2234 | const Id offset = OpShiftRightLogical(t_uint, diff, Constant(t_uint, 2)); | ||
| 2235 | const Id buffer = global_buffers.at(gmem.GetDescriptor()); | ||
| 2236 | return OpAccessChain(t_gmem_uint, buffer, Constant(t_uint, 0), offset); | ||
| 2237 | } | ||
| 2238 | |||
| 2239 | Id GetSharedMemoryPointer(const SmemNode& smem) { | ||
| 2240 | ASSERT(stage == ShaderType::Compute); | ||
| 2241 | Id address = AsUint(Visit(smem.GetAddress())); | ||
| 2242 | address = OpShiftRightLogical(t_uint, address, Constant(t_uint, 2U)); | ||
| 2243 | return OpAccessChain(t_smem_uint, shared_memory, address); | ||
| 2244 | } | ||
| 2245 | |||
| 2246 | static constexpr std::array operation_decompilers = { | 2246 | static constexpr std::array operation_decompilers = { |
| 2247 | &SPIRVDecompiler::Assign, | 2247 | &SPIRVDecompiler::Assign, |
| 2248 | 2248 | ||
| @@ -2389,7 +2389,7 @@ private: | |||
| 2389 | &SPIRVDecompiler::AtomicImageXor, | 2389 | &SPIRVDecompiler::AtomicImageXor, |
| 2390 | &SPIRVDecompiler::AtomicImageExchange, | 2390 | &SPIRVDecompiler::AtomicImageExchange, |
| 2391 | 2391 | ||
| 2392 | &SPIRVDecompiler::UAtomicAdd, | 2392 | &SPIRVDecompiler::AtomicAdd, |
| 2393 | 2393 | ||
| 2394 | &SPIRVDecompiler::Branch, | 2394 | &SPIRVDecompiler::Branch, |
| 2395 | &SPIRVDecompiler::BranchIndirect, | 2395 | &SPIRVDecompiler::BranchIndirect, |
| @@ -2485,9 +2485,9 @@ private: | |||
| 2485 | 2485 | ||
| 2486 | Id t_smem_uint{}; | 2486 | Id t_smem_uint{}; |
| 2487 | 2487 | ||
| 2488 | const Id t_gmem_float = TypePointer(spv::StorageClass::StorageBuffer, t_float); | 2488 | const Id t_gmem_uint = TypePointer(spv::StorageClass::StorageBuffer, t_uint); |
| 2489 | const Id t_gmem_array = | 2489 | const Id t_gmem_array = |
| 2490 | Name(Decorate(TypeRuntimeArray(t_float), spv::Decoration::ArrayStride, 4U), "GmemArray"); | 2490 | Name(Decorate(TypeRuntimeArray(t_uint), spv::Decoration::ArrayStride, 4U), "GmemArray"); |
| 2491 | const Id t_gmem_struct = MemberDecorate( | 2491 | const Id t_gmem_struct = MemberDecorate( |
| 2492 | Decorate(TypeStruct(t_gmem_array), spv::Decoration::Block), 0, spv::Decoration::Offset, 0); | 2492 | Decorate(TypeStruct(t_gmem_array), spv::Decoration::Block), 0, spv::Decoration::Offset, 0); |
| 2493 | const Id t_gmem_ssbo = TypePointer(spv::StorageClass::StorageBuffer, t_gmem_struct); | 2493 | const Id t_gmem_ssbo = TypePointer(spv::StorageClass::StorageBuffer, t_gmem_struct); |