| 1 | /* | 
| 2 |  * Copyright 2015-2021 Arm Limited | 
| 3 |  * SPDX-License-Identifier: Apache-2.0 OR MIT | 
| 4 |  * | 
| 5 |  * Licensed under the Apache License, Version 2.0 (the "License"); | 
| 6 |  * you may not use this file except in compliance with the License. | 
| 7 |  * You may obtain a copy of the License at | 
| 8 |  * | 
| 9 |  *     http://www.apache.org/licenses/LICENSE-2.0 | 
| 10 |  * | 
| 11 |  * Unless required by applicable law or agreed to in writing, software | 
| 12 |  * distributed under the License is distributed on an "AS IS" BASIS, | 
| 13 |  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | 
| 14 |  * See the License for the specific language governing permissions and | 
| 15 |  * limitations under the License. | 
| 16 |  */ | 
| 17 |  | 
| 18 | /* | 
| 19 |  * At your option, you may choose to accept this material under either: | 
| 20 |  *  1. The Apache License, Version 2.0, found at <http://www.apache.org/licenses/LICENSE-2.0>, or | 
| 21 |  *  2. The MIT License, found at <http://opensource.org/licenses/MIT>. | 
| 22 |  */ | 
| 23 |  | 
| 24 | #include "spirv_cross_util.hpp" | 
| 25 | #include "spirv_common.hpp" | 
| 26 |  | 
| 27 | using namespace spv; | 
| 28 | using namespace SPIRV_CROSS_NAMESPACE; | 
| 29 |  | 
| 30 | namespace spirv_cross_util | 
| 31 | { | 
| 32 | void rename_interface_variable(Compiler &compiler, const SmallVector<Resource> &resources, uint32_t location, | 
| 33 |                                const std::string &name) | 
| 34 | { | 
| 35 | 	for (auto &v : resources) | 
| 36 | 	{ | 
| 37 | 		if (!compiler.has_decoration(id: v.id, decoration: spv::DecorationLocation)) | 
| 38 | 			continue; | 
| 39 |  | 
| 40 | 		auto loc = compiler.get_decoration(id: v.id, decoration: spv::DecorationLocation); | 
| 41 | 		if (loc != location) | 
| 42 | 			continue; | 
| 43 |  | 
| 44 | 		auto &type = compiler.get_type(id: v.base_type_id); | 
| 45 |  | 
| 46 | 		// This is more of a friendly variant. If we need to rename interface variables, we might have to rename | 
| 47 | 		// structs as well and make sure all the names match up. | 
| 48 | 		if (type.basetype == SPIRType::Struct) | 
| 49 | 		{ | 
| 50 | 			compiler.set_name(id: v.base_type_id, name: join(ts: "SPIRV_Cross_Interface_Location" , ts&: location)); | 
| 51 | 			for (uint32_t i = 0; i < uint32_t(type.member_types.size()); i++) | 
| 52 | 				compiler.set_member_name(id: v.base_type_id, index: i, name: join(ts: "InterfaceMember" , ts&: i)); | 
| 53 | 		} | 
| 54 |  | 
| 55 | 		compiler.set_name(id: v.id, name); | 
| 56 | 	} | 
| 57 | } | 
| 58 |  | 
| 59 | void inherit_combined_sampler_bindings(Compiler &compiler) | 
| 60 | { | 
| 61 | 	auto &samplers = compiler.get_combined_image_samplers(); | 
| 62 | 	for (auto &s : samplers) | 
| 63 | 	{ | 
| 64 | 		if (compiler.has_decoration(id: s.image_id, decoration: spv::DecorationDescriptorSet)) | 
| 65 | 		{ | 
| 66 | 			uint32_t set = compiler.get_decoration(id: s.image_id, decoration: spv::DecorationDescriptorSet); | 
| 67 | 			compiler.set_decoration(id: s.combined_id, decoration: spv::DecorationDescriptorSet, argument: set); | 
| 68 | 		} | 
| 69 |  | 
| 70 | 		if (compiler.has_decoration(id: s.image_id, decoration: spv::DecorationBinding)) | 
| 71 | 		{ | 
| 72 | 			uint32_t binding = compiler.get_decoration(id: s.image_id, decoration: spv::DecorationBinding); | 
| 73 | 			compiler.set_decoration(id: s.combined_id, decoration: spv::DecorationBinding, argument: binding); | 
| 74 | 		} | 
| 75 | 	} | 
| 76 | } | 
| 77 | } // namespace spirv_cross_util | 
| 78 |  |