vk_decompiler: add atomic op and handler function.
This commit is contained in:
		| @@ -1941,7 +1941,11 @@ private: | |||||||
|         return {}; |         return {}; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     Expression AtomicAdd(Operation operation) { |     template <Id (Module::*func)(Id, Id, Id, Id, Id), Type result_type, | ||||||
|  |               Type value_type = result_type> | ||||||
|  |     Expression Atomic(Operation operation) { | ||||||
|  |         const Id type_def = GetTypeDefinition(result_type); | ||||||
|  |  | ||||||
|         Id pointer; |         Id pointer; | ||||||
|         if (const auto smem = std::get_if<SmemNode>(&*operation[0])) { |         if (const auto smem = std::get_if<SmemNode>(&*operation[0])) { | ||||||
|             pointer = GetSharedMemoryPointer(*smem); |             pointer = GetSharedMemoryPointer(*smem); | ||||||
| @@ -1949,14 +1953,15 @@ private: | |||||||
|             pointer = GetGlobalMemoryPointer(*gmem); |             pointer = GetGlobalMemoryPointer(*gmem); | ||||||
|         } else { |         } else { | ||||||
|             UNREACHABLE(); |             UNREACHABLE(); | ||||||
|             return {Constant(t_uint, 0), Type::Uint}; |             return {Constant(type_def, 0), result_type}; | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         const Id scope = Constant(t_uint, static_cast<u32>(spv::Scope::Device)); |         const Id value = As(Visit(operation[1]), value_type); | ||||||
|         const Id semantics = Constant(t_uint, 0U); |  | ||||||
|  |  | ||||||
|         const Id value = AsUint(Visit(operation[1])); |         const Id scope = Constant(t_uint, static_cast<u32>(spv::Scope::Device)); | ||||||
|         return {OpAtomicIAdd(t_uint, pointer, scope, semantics, value), Type::Uint}; |         const Id semantics = Constant(type_def, 0); | ||||||
|  |  | ||||||
|  |         return {(this->*func)(type_def, pointer, scope, semantics, value), result_type}; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     Expression Branch(Operation operation) { |     Expression Branch(Operation operation) { | ||||||
| @@ -2545,7 +2550,21 @@ private: | |||||||
|         &SPIRVDecompiler::AtomicImageXor, |         &SPIRVDecompiler::AtomicImageXor, | ||||||
|         &SPIRVDecompiler::AtomicImageExchange, |         &SPIRVDecompiler::AtomicImageExchange, | ||||||
|  |  | ||||||
|         &SPIRVDecompiler::AtomicAdd, |         &SPIRVDecompiler::Atomic<&Module::OpAtomicExchange, Type::Uint>, | ||||||
|  |         &SPIRVDecompiler::Atomic<&Module::OpAtomicIAdd, Type::Uint>, | ||||||
|  |         &SPIRVDecompiler::Atomic<&Module::OpAtomicUMin, Type::Uint>, | ||||||
|  |         &SPIRVDecompiler::Atomic<&Module::OpAtomicUMax, Type::Uint>, | ||||||
|  |         &SPIRVDecompiler::Atomic<&Module::OpAtomicAnd, Type::Uint>, | ||||||
|  |         &SPIRVDecompiler::Atomic<&Module::OpAtomicOr, Type::Uint>, | ||||||
|  |         &SPIRVDecompiler::Atomic<&Module::OpAtomicXor, Type::Uint>, | ||||||
|  |  | ||||||
|  |         &SPIRVDecompiler::Atomic<&Module::OpAtomicExchange, Type::Int>, | ||||||
|  |         &SPIRVDecompiler::Atomic<&Module::OpAtomicIAdd, Type::Int>, | ||||||
|  |         &SPIRVDecompiler::Atomic<&Module::OpAtomicSMin, Type::Int>, | ||||||
|  |         &SPIRVDecompiler::Atomic<&Module::OpAtomicSMax, Type::Int>, | ||||||
|  |         &SPIRVDecompiler::Atomic<&Module::OpAtomicAnd, Type::Int>, | ||||||
|  |         &SPIRVDecompiler::Atomic<&Module::OpAtomicOr, Type::Int>, | ||||||
|  |         &SPIRVDecompiler::Atomic<&Module::OpAtomicXor, Type::Int>, | ||||||
|  |  | ||||||
|         &SPIRVDecompiler::Branch, |         &SPIRVDecompiler::Branch, | ||||||
|         &SPIRVDecompiler::BranchIndirect, |         &SPIRVDecompiler::BranchIndirect, | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user