summaryrefslogtreecommitdiffstats
path: root/src/video_core/renderer_vulkan
diff options
context:
space:
mode:
authorReinUsesLisp <reinuseslisp@airmail.cc>2020-04-06 07:24:47 +0200
committerReinUsesLisp <reinuseslisp@airmail.cc>2020-04-06 07:24:47 +0200
commit3185245845f7487c3b832035b0c19fdc4f1a8262 (patch)
treec002fb721c5db8fc5f035bbf218e423b8d982f85 /src/video_core/renderer_vulkan
parentshader/memory: Add "using std::move" (diff)
downloadyuzu-3185245845f7487c3b832035b0c19fdc4f1a8262.tar
yuzu-3185245845f7487c3b832035b0c19fdc4f1a8262.tar.gz
yuzu-3185245845f7487c3b832035b0c19fdc4f1a8262.tar.bz2
yuzu-3185245845f7487c3b832035b0c19fdc4f1a8262.tar.lz
yuzu-3185245845f7487c3b832035b0c19fdc4f1a8262.tar.xz
yuzu-3185245845f7487c3b832035b0c19fdc4f1a8262.tar.zst
yuzu-3185245845f7487c3b832035b0c19fdc4f1a8262.zip
Diffstat (limited to 'src/video_core/renderer_vulkan')
-rw-r--r--src/video_core/renderer_vulkan/vk_shader_decompiler.cpp65
1 files changed, 40 insertions, 25 deletions
diff --git a/src/video_core/renderer_vulkan/vk_shader_decompiler.cpp b/src/video_core/renderer_vulkan/vk_shader_decompiler.cpp
index d67f08cf9..24d3ca08f 100644
--- a/src/video_core/renderer_vulkan/vk_shader_decompiler.cpp
+++ b/src/video_core/renderer_vulkan/vk_shader_decompiler.cpp
@@ -1941,11 +1941,8 @@ private:
return {};
}
- template <Id (Module::*func)(Id, Id, Id, Id, Id), Type result_type,
- Type value_type = result_type>
+ template <Id (Module::*func)(Id, Id, Id, Id, Id)>
Expression Atomic(Operation operation) {
- const Id type_def = GetTypeDefinition(result_type);
-
Id pointer;
if (const auto smem = std::get_if<SmemNode>(&*operation[0])) {
pointer = GetSharedMemoryPointer(*smem);
@@ -1953,15 +1950,19 @@ private:
pointer = GetGlobalMemoryPointer(*gmem);
} else {
UNREACHABLE();
- return {Constant(type_def, 0), result_type};
+ return {v_float_zero, Type::Float};
}
-
- const Id value = As(Visit(operation[1]), value_type);
-
const Id scope = Constant(t_uint, static_cast<u32>(spv::Scope::Device));
- const Id semantics = Constant(type_def, 0);
+ const Id semantics = Constant(t_uint, 0);
+ const Id value = AsUint(Visit(operation[1]));
+
+ return {(this->*func)(t_uint, pointer, scope, semantics, value), Type::Uint};
+ }
- return {(this->*func)(type_def, pointer, scope, semantics, value), result_type};
+ template <Id (Module::*func)(Id, Id, Id, Id, Id)>
+ Expression Reduce(Operation operation) {
+ Atomic<func>(operation);
+ return {};
}
Expression Branch(Operation operation) {
@@ -2550,21 +2551,35 @@ private:
&SPIRVDecompiler::AtomicImageXor,
&SPIRVDecompiler::AtomicImageExchange,
- &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::Atomic<&Module::OpAtomicExchange>,
+ &SPIRVDecompiler::Atomic<&Module::OpAtomicIAdd>,
+ &SPIRVDecompiler::Atomic<&Module::OpAtomicUMin>,
+ &SPIRVDecompiler::Atomic<&Module::OpAtomicUMax>,
+ &SPIRVDecompiler::Atomic<&Module::OpAtomicAnd>,
+ &SPIRVDecompiler::Atomic<&Module::OpAtomicOr>,
+ &SPIRVDecompiler::Atomic<&Module::OpAtomicXor>,
+
+ &SPIRVDecompiler::Atomic<&Module::OpAtomicExchange>,
+ &SPIRVDecompiler::Atomic<&Module::OpAtomicIAdd>,
+ &SPIRVDecompiler::Atomic<&Module::OpAtomicSMin>,
+ &SPIRVDecompiler::Atomic<&Module::OpAtomicSMax>,
+ &SPIRVDecompiler::Atomic<&Module::OpAtomicAnd>,
+ &SPIRVDecompiler::Atomic<&Module::OpAtomicOr>,
+ &SPIRVDecompiler::Atomic<&Module::OpAtomicXor>,
+
+ &SPIRVDecompiler::Reduce<&Module::OpAtomicIAdd>,
+ &SPIRVDecompiler::Reduce<&Module::OpAtomicUMin>,
+ &SPIRVDecompiler::Reduce<&Module::OpAtomicUMax>,
+ &SPIRVDecompiler::Reduce<&Module::OpAtomicAnd>,
+ &SPIRVDecompiler::Reduce<&Module::OpAtomicOr>,
+ &SPIRVDecompiler::Reduce<&Module::OpAtomicXor>,
+
+ &SPIRVDecompiler::Reduce<&Module::OpAtomicIAdd>,
+ &SPIRVDecompiler::Reduce<&Module::OpAtomicSMin>,
+ &SPIRVDecompiler::Reduce<&Module::OpAtomicSMax>,
+ &SPIRVDecompiler::Reduce<&Module::OpAtomicAnd>,
+ &SPIRVDecompiler::Reduce<&Module::OpAtomicOr>,
+ &SPIRVDecompiler::Reduce<&Module::OpAtomicXor>,
&SPIRVDecompiler::Branch,
&SPIRVDecompiler::BranchIndirect,