Merge pull request #3981 from ReinUsesLisp/bar
shader/other: Implement BAR.SYNC 0x0
This commit is contained in:
		
							
								
								
									
										2
									
								
								externals/sirit
									
									
									
									
										vendored
									
									
								
							
							
								
								
								
								
								
							
						
						
									
										2
									
								
								externals/sirit
									
									
									
									
										vendored
									
									
								
							 Submodule externals/sirit updated: 414fc4dbd2...a62c5bbc10
									
								
							| @@ -2335,6 +2335,15 @@ private: | ||||
|         return {fmt::format("readInvocationARB({}, {})", value, index), Type::Float}; | ||||
|     } | ||||
|  | ||||
|     Expression Barrier(Operation) { | ||||
|         if (!ir.IsDecompiled()) { | ||||
|             LOG_ERROR(Render_OpenGL, "barrier() used but shader is not decompiled"); | ||||
|             return {}; | ||||
|         } | ||||
|         code.AddLine("barrier();"); | ||||
|         return {}; | ||||
|     } | ||||
|  | ||||
|     Expression MemoryBarrierGL(Operation) { | ||||
|         code.AddLine("memoryBarrier();"); | ||||
|         return {}; | ||||
| @@ -2581,6 +2590,7 @@ private: | ||||
|         &GLSLDecompiler::ThreadMask<Func::Lt>, | ||||
|         &GLSLDecompiler::ShuffleIndexed, | ||||
|  | ||||
|         &GLSLDecompiler::Barrier, | ||||
|         &GLSLDecompiler::MemoryBarrierGL, | ||||
|     }; | ||||
|     static_assert(operation_decompilers.size() == static_cast<std::size_t>(OperationCode::Amount)); | ||||
|   | ||||
| @@ -2199,6 +2199,22 @@ private: | ||||
|         return {OpSubgroupReadInvocationKHR(t_float, value, index), Type::Float}; | ||||
|     } | ||||
|  | ||||
|     Expression Barrier(Operation) { | ||||
|         if (!ir.IsDecompiled()) { | ||||
|             LOG_ERROR(Render_Vulkan, "OpBarrier used by shader is not decompiled"); | ||||
|             return {}; | ||||
|         } | ||||
|  | ||||
|         const auto scope = spv::Scope::Workgroup; | ||||
|         const auto memory = spv::Scope::Workgroup; | ||||
|         const auto semantics = | ||||
|             spv::MemorySemanticsMask::WorkgroupMemory | spv::MemorySemanticsMask::AcquireRelease; | ||||
|         OpControlBarrier(Constant(t_uint, static_cast<u32>(scope)), | ||||
|                          Constant(t_uint, static_cast<u32>(memory)), | ||||
|                          Constant(t_uint, static_cast<u32>(semantics))); | ||||
|         return {}; | ||||
|     } | ||||
|  | ||||
|     Expression MemoryBarrierGL(Operation) { | ||||
|         const auto scope = spv::Scope::Device; | ||||
|         const auto semantics = | ||||
| @@ -2664,6 +2680,7 @@ private: | ||||
|         &SPIRVDecompiler::ThreadMask<4>, // Lt | ||||
|         &SPIRVDecompiler::ShuffleIndexed, | ||||
|  | ||||
|         &SPIRVDecompiler::Barrier, | ||||
|         &SPIRVDecompiler::MemoryBarrierGL, | ||||
|     }; | ||||
|     static_assert(operation_decompilers.size() == static_cast<std::size_t>(OperationCode::Amount)); | ||||
|   | ||||
| @@ -293,6 +293,11 @@ u32 ShaderIR::DecodeOther(NodeBlock& bb, u32 pc) { | ||||
|         SetRegister(bb, instr.gpr0, GetRegister(instr.gpr8)); | ||||
|         break; | ||||
|     } | ||||
|     case OpCode::Id::BAR: { | ||||
|         UNIMPLEMENTED_IF_MSG(instr.value != 0xF0A81B8000070000ULL, "BAR is not BAR.SYNC 0x0"); | ||||
|         bb.push_back(Operation(OperationCode::Barrier)); | ||||
|         break; | ||||
|     } | ||||
|     case OpCode::Id::MEMBAR: { | ||||
|         UNIMPLEMENTED_IF(instr.membar.type != Tegra::Shader::MembarType::GL); | ||||
|         UNIMPLEMENTED_IF(instr.membar.unknown != Tegra::Shader::MembarUnknown::Default); | ||||
|   | ||||
| @@ -233,6 +233,7 @@ enum class OperationCode { | ||||
|     ThreadLtMask,   /// () -> uint | ||||
|     ShuffleIndexed, /// (uint value, uint index) -> uint | ||||
|  | ||||
|     Barrier,         /// () -> void | ||||
|     MemoryBarrierGL, /// () -> void | ||||
|  | ||||
|     Amount, | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 bunnei
					bunnei