1 /*
2  * Copyright 2015-2021 Arm Limited
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *     http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 /*
18  * At your option, you may choose to accept this material under either:
19  *  1. The Apache License, Version 2.0, found at <http://www.apache.org/licenses/LICENSE-2.0>, or
20  *  2. The MIT License, found at <http://opensource.org/licenses/MIT>.
21  * SPDX-License-Identifier: Apache-2.0 OR MIT.
22  */
23 
24 #ifndef SPIRV_CROSS_CPP_HPP
25 #define SPIRV_CROSS_CPP_HPP
26 
27 #include "spirv_glsl.hpp"
28 #include <utility>
29 
30 namespace SPIRV_CROSS_NAMESPACE
31 {
32 class CompilerCPP : public CompilerGLSL
33 {
34 public:
CompilerCPP(std::vector<uint32_t> spirv_)35 	explicit CompilerCPP(std::vector<uint32_t> spirv_)
36 	    : CompilerGLSL(std::move(spirv_))
37 	{
38 	}
39 
CompilerCPP(const uint32_t * ir_,size_t word_count)40 	CompilerCPP(const uint32_t *ir_, size_t word_count)
41 	    : CompilerGLSL(ir_, word_count)
42 	{
43 	}
44 
CompilerCPP(const ParsedIR & ir_)45 	explicit CompilerCPP(const ParsedIR &ir_)
46 	    : CompilerGLSL(ir_)
47 	{
48 	}
49 
CompilerCPP(ParsedIR && ir_)50 	explicit CompilerCPP(ParsedIR &&ir_)
51 	    : CompilerGLSL(std::move(ir_))
52 	{
53 	}
54 
55 	std::string compile() override;
56 
57 	// Sets a custom symbol name that can override
58 	// spirv_cross_get_interface.
59 	//
60 	// Useful when several shader interfaces are linked
61 	// statically into the same binary.
set_interface_name(std::string name)62 	void set_interface_name(std::string name)
63 	{
64 		interface_name = std::move(name);
65 	}
66 
67 private:
68 	void emit_header() override;
69 	void emit_c_linkage();
70 	void emit_function_prototype(SPIRFunction &func, const Bitset &return_flags) override;
71 
72 	void emit_resources();
73 	void emit_buffer_block(const SPIRVariable &type) override;
74 	void emit_push_constant_block(const SPIRVariable &var) override;
75 	void emit_interface_block(const SPIRVariable &type);
76 	void emit_block_chain(SPIRBlock &block);
77 	void emit_uniform(const SPIRVariable &var) override;
78 	void emit_shared(const SPIRVariable &var);
79 	void emit_block_struct(SPIRType &type);
80 	std::string variable_decl(const SPIRType &type, const std::string &name, uint32_t id) override;
81 
82 	std::string argument_decl(const SPIRFunction::Parameter &arg);
83 
84 	SmallVector<std::string> resource_registrations;
85 	std::string impl_type;
86 	std::string resource_type;
87 	uint32_t shared_counter = 0;
88 
89 	std::string interface_name;
90 };
91 } // namespace SPIRV_CROSS_NAMESPACE
92 
93 #endif
94