Бранимир Караџић пре 4 година
родитељ
комит
39b018b3f7
2 измењених фајлова са 29 додато и 0 уклоњено
  1. 24 0
      3rdparty/spirv-cross/spirv_cross.cpp
  2. 5 0
      3rdparty/spirv-cross/spirv_cross.hpp

+ 24 - 0
3rdparty/spirv-cross/spirv_cross.cpp

@@ -1659,6 +1659,9 @@ bool Compiler::traverse_all_reachable_opcodes(const SPIRBlock &block, OpcodeHand
 		}
 		}
 	}
 	}
 
 
+	if (!handler.handle_terminator(block))
+		return false;
+
 	return true;
 	return true;
 }
 }
 
 
@@ -3055,6 +3058,27 @@ bool Compiler::AnalyzeVariableScopeAccessHandler::id_is_potential_temporary(uint
 	return compiler.ir.ids[id].empty() || (compiler.ir.ids[id].get_type() == TypeExpression);
 	return compiler.ir.ids[id].empty() || (compiler.ir.ids[id].get_type() == TypeExpression);
 }
 }
 
 
+bool Compiler::AnalyzeVariableScopeAccessHandler::handle_terminator(const SPIRBlock &block)
+{
+	switch (block.terminator)
+	{
+	case SPIRBlock::Return:
+		if (block.return_value)
+			notify_variable_access(block.return_value, block.self);
+		break;
+
+	case SPIRBlock::Select:
+	case SPIRBlock::MultiSelect:
+		notify_variable_access(block.condition, block.self);
+		break;
+
+	default:
+		break;
+	}
+
+	return true;
+}
+
 bool Compiler::AnalyzeVariableScopeAccessHandler::handle(spv::Op op, const uint32_t *args, uint32_t length)
 bool Compiler::AnalyzeVariableScopeAccessHandler::handle(spv::Op op, const uint32_t *args, uint32_t length)
 {
 {
 	// Keep track of the types of temporaries, so we can hoist them out as necessary.
 	// Keep track of the types of temporaries, so we can hoist them out as necessary.

+ 5 - 0
3rdparty/spirv-cross/spirv_cross.hpp

@@ -765,6 +765,10 @@ protected:
 		// Return true if traversal should continue.
 		// Return true if traversal should continue.
 		// If false, traversal will end immediately.
 		// If false, traversal will end immediately.
 		virtual bool handle(spv::Op opcode, const uint32_t *args, uint32_t length) = 0;
 		virtual bool handle(spv::Op opcode, const uint32_t *args, uint32_t length) = 0;
+		virtual bool handle_terminator(const SPIRBlock &)
+		{
+			return true;
+		}
 
 
 		virtual bool follow_function_call(const SPIRFunction &)
 		virtual bool follow_function_call(const SPIRFunction &)
 		{
 		{
@@ -979,6 +983,7 @@ protected:
 		bool id_is_phi_variable(uint32_t id) const;
 		bool id_is_phi_variable(uint32_t id) const;
 		bool id_is_potential_temporary(uint32_t id) const;
 		bool id_is_potential_temporary(uint32_t id) const;
 		bool handle(spv::Op op, const uint32_t *args, uint32_t length) override;
 		bool handle(spv::Op op, const uint32_t *args, uint32_t length) override;
+		bool handle_terminator(const SPIRBlock &block) override;
 
 
 		Compiler &compiler;
 		Compiler &compiler;
 		SPIRFunction &entry;
 		SPIRFunction &entry;