mirror of
				https://git.zaroz.cloud/nintendo-back-up/yuzu/yuzu-mainline.git
				synced 2025-03-21 01:53:15 +00:00 
			
		
		
		
	Merge pull request #3982 from ReinUsesLisp/membar-cts
shader/other: Implement MEMBAR.CTS
This commit is contained in:
		
						commit
						058ec22787
					
				| @ -2344,7 +2344,12 @@ private: | ||||
|         return {}; | ||||
|     } | ||||
| 
 | ||||
|     Expression MemoryBarrierGL(Operation) { | ||||
|     Expression MemoryBarrierGroup(Operation) { | ||||
|         code.AddLine("groupMemoryBarrier();"); | ||||
|         return {}; | ||||
|     } | ||||
| 
 | ||||
|     Expression MemoryBarrierGlobal(Operation) { | ||||
|         code.AddLine("memoryBarrier();"); | ||||
|         return {}; | ||||
|     } | ||||
| @ -2591,7 +2596,8 @@ private: | ||||
|         &GLSLDecompiler::ShuffleIndexed, | ||||
| 
 | ||||
|         &GLSLDecompiler::Barrier, | ||||
|         &GLSLDecompiler::MemoryBarrierGL, | ||||
|         &GLSLDecompiler::MemoryBarrierGroup, | ||||
|         &GLSLDecompiler::MemoryBarrierGlobal, | ||||
|     }; | ||||
|     static_assert(operation_decompilers.size() == static_cast<std::size_t>(OperationCode::Amount)); | ||||
| 
 | ||||
|  | ||||
| @ -2215,8 +2215,8 @@ private: | ||||
|         return {}; | ||||
|     } | ||||
| 
 | ||||
|     Expression MemoryBarrierGL(Operation) { | ||||
|         const auto scope = spv::Scope::Device; | ||||
|     template <spv::Scope scope> | ||||
|     Expression MemoryBarrier(Operation) { | ||||
|         const auto semantics = | ||||
|             spv::MemorySemanticsMask::AcquireRelease | spv::MemorySemanticsMask::UniformMemory | | ||||
|             spv::MemorySemanticsMask::WorkgroupMemory | | ||||
| @ -2681,7 +2681,8 @@ private: | ||||
|         &SPIRVDecompiler::ShuffleIndexed, | ||||
| 
 | ||||
|         &SPIRVDecompiler::Barrier, | ||||
|         &SPIRVDecompiler::MemoryBarrierGL, | ||||
|         &SPIRVDecompiler::MemoryBarrier<spv::Scope::Workgroup>, | ||||
|         &SPIRVDecompiler::MemoryBarrier<spv::Scope::Device>, | ||||
|     }; | ||||
|     static_assert(operation_decompilers.size() == static_cast<std::size_t>(OperationCode::Amount)); | ||||
| 
 | ||||
|  | ||||
| @ -299,9 +299,19 @@ u32 ShaderIR::DecodeOther(NodeBlock& bb, u32 pc) { | ||||
|         break; | ||||
|     } | ||||
|     case OpCode::Id::MEMBAR: { | ||||
|         UNIMPLEMENTED_IF(instr.membar.type != Tegra::Shader::MembarType::GL); | ||||
|         UNIMPLEMENTED_IF(instr.membar.unknown != Tegra::Shader::MembarUnknown::Default); | ||||
|         bb.push_back(Operation(OperationCode::MemoryBarrierGL)); | ||||
|         const OperationCode type = [instr] { | ||||
|             switch (instr.membar.type) { | ||||
|             case Tegra::Shader::MembarType::CTA: | ||||
|                 return OperationCode::MemoryBarrierGroup; | ||||
|             case Tegra::Shader::MembarType::GL: | ||||
|                 return OperationCode::MemoryBarrierGlobal; | ||||
|             default: | ||||
|                 UNIMPLEMENTED_MSG("MEMBAR type={}", static_cast<int>(instr.membar.type.Value())); | ||||
|                 return OperationCode::MemoryBarrierGlobal; | ||||
|             } | ||||
|         }(); | ||||
|         bb.push_back(Operation(type)); | ||||
|         break; | ||||
|     } | ||||
|     case OpCode::Id::DEPBAR: { | ||||
|  | ||||
| @ -233,8 +233,9 @@ enum class OperationCode { | ||||
|     ThreadLtMask,   /// () -> uint
 | ||||
|     ShuffleIndexed, /// (uint value, uint index) -> uint
 | ||||
| 
 | ||||
|     Barrier,         /// () -> void
 | ||||
|     MemoryBarrierGL, /// () -> void
 | ||||
|     Barrier,             /// () -> void
 | ||||
|     MemoryBarrierGroup,  /// () -> void
 | ||||
|     MemoryBarrierGlobal, /// () -> void
 | ||||
| 
 | ||||
|     Amount, | ||||
| }; | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user
	 bunnei
						bunnei