mirror of
				https://git.tardis.systems/mirrors/yuzu
				synced 2025-10-31 02:34:11 +01:00 
			
		
		
		
	shader/other: Implement BAR.SYNC 0x0
Trivially implement this particular case of BAR. Unless games use OpenCL or CUDA barriers, we shouldn't hit any other case here.
This commit is contained in:
		
							parent
							
								
									cf4ee279c6
								
							
						
					
					
						commit
						5d0986a53b
					
				
							
								
								
									
										2
									
								
								externals/sirit
									
									
									
									
										vendored
									
									
								
							
							
								
								
								
								
								
								
							
						
						
									
										2
									
								
								externals/sirit
									
									
									
									
										vendored
									
									
								
							| @ -1 +1 @@ | |||||||
| Subproject commit 414fc4dbd28d8fe48f735a0c389db8a234f733c0 | Subproject commit a62c5bbc100a5e5a31ea0ccc4a78d8fa6a4167ce | ||||||
| @ -2321,6 +2321,15 @@ private: | |||||||
|         return {fmt::format("readInvocationARB({}, {})", value, index), Type::Float}; |         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) { |     Expression MemoryBarrierGL(Operation) { | ||||||
|         code.AddLine("memoryBarrier();"); |         code.AddLine("memoryBarrier();"); | ||||||
|         return {}; |         return {}; | ||||||
| @ -2556,6 +2565,7 @@ private: | |||||||
|         &GLSLDecompiler::ThreadId, |         &GLSLDecompiler::ThreadId, | ||||||
|         &GLSLDecompiler::ShuffleIndexed, |         &GLSLDecompiler::ShuffleIndexed, | ||||||
| 
 | 
 | ||||||
|  |         &GLSLDecompiler::Barrier, | ||||||
|         &GLSLDecompiler::MemoryBarrierGL, |         &GLSLDecompiler::MemoryBarrierGL, | ||||||
|     }; |     }; | ||||||
|     static_assert(operation_decompilers.size() == static_cast<std::size_t>(OperationCode::Amount)); |     static_assert(operation_decompilers.size() == static_cast<std::size_t>(OperationCode::Amount)); | ||||||
|  | |||||||
| @ -2181,6 +2181,22 @@ private: | |||||||
|         return {OpSubgroupReadInvocationKHR(t_float, value, index), Type::Float}; |         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) { |     Expression MemoryBarrierGL(Operation) { | ||||||
|         const auto scope = spv::Scope::Device; |         const auto scope = spv::Scope::Device; | ||||||
|         const auto semantics = |         const auto semantics = | ||||||
| @ -2641,6 +2657,7 @@ private: | |||||||
|         &SPIRVDecompiler::ThreadId, |         &SPIRVDecompiler::ThreadId, | ||||||
|         &SPIRVDecompiler::ShuffleIndexed, |         &SPIRVDecompiler::ShuffleIndexed, | ||||||
| 
 | 
 | ||||||
|  |         &SPIRVDecompiler::Barrier, | ||||||
|         &SPIRVDecompiler::MemoryBarrierGL, |         &SPIRVDecompiler::MemoryBarrierGL, | ||||||
|     }; |     }; | ||||||
|     static_assert(operation_decompilers.size() == static_cast<std::size_t>(OperationCode::Amount)); |     static_assert(operation_decompilers.size() == static_cast<std::size_t>(OperationCode::Amount)); | ||||||
|  | |||||||
| @ -272,6 +272,11 @@ u32 ShaderIR::DecodeOther(NodeBlock& bb, u32 pc) { | |||||||
|         SetRegister(bb, instr.gpr0, GetRegister(instr.gpr8)); |         SetRegister(bb, instr.gpr0, GetRegister(instr.gpr8)); | ||||||
|         break; |         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: { |     case OpCode::Id::MEMBAR: { | ||||||
|         UNIMPLEMENTED_IF(instr.membar.type != Tegra::Shader::MembarType::GL); |         UNIMPLEMENTED_IF(instr.membar.type != Tegra::Shader::MembarType::GL); | ||||||
|         UNIMPLEMENTED_IF(instr.membar.unknown != Tegra::Shader::MembarUnknown::Default); |         UNIMPLEMENTED_IF(instr.membar.unknown != Tegra::Shader::MembarUnknown::Default); | ||||||
|  | |||||||
| @ -228,6 +228,7 @@ enum class OperationCode { | |||||||
|     ThreadId,       /// () -> uint
 |     ThreadId,       /// () -> uint
 | ||||||
|     ShuffleIndexed, /// (uint value, uint index) -> uint
 |     ShuffleIndexed, /// (uint value, uint index) -> uint
 | ||||||
| 
 | 
 | ||||||
|  |     Barrier,         /// () -> void
 | ||||||
|     MemoryBarrierGL, /// () -> void
 |     MemoryBarrierGL, /// () -> void
 | ||||||
| 
 | 
 | ||||||
|     Amount, |     Amount, | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user