• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright 2018-2021 Bradley Austin Davis
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 #ifndef SPIRV_CROSS_REFLECT_HPP
25 #define SPIRV_CROSS_REFLECT_HPP
26 
27 #include "spirv_glsl.hpp"
28 #include <utility>
29 
30 namespace simple_json
31 {
32 class Stream;
33 }
34 
35 namespace SPIRV_CROSS_NAMESPACE
36 {
37 class CompilerReflection : public CompilerGLSL
38 {
39 	using Parent = CompilerGLSL;
40 
41 public:
CompilerReflection(std::vector<uint32_t> spirv_)42 	explicit CompilerReflection(std::vector<uint32_t> spirv_)
43 	    : Parent(std::move(spirv_))
44 	{
45 		options.vulkan_semantics = true;
46 	}
47 
CompilerReflection(const uint32_t * ir_,size_t word_count)48 	CompilerReflection(const uint32_t *ir_, size_t word_count)
49 	    : Parent(ir_, word_count)
50 	{
51 		options.vulkan_semantics = true;
52 	}
53 
CompilerReflection(const ParsedIR & ir_)54 	explicit CompilerReflection(const ParsedIR &ir_)
55 	    : CompilerGLSL(ir_)
56 	{
57 		options.vulkan_semantics = true;
58 	}
59 
CompilerReflection(ParsedIR && ir_)60 	explicit CompilerReflection(ParsedIR &&ir_)
61 	    : CompilerGLSL(std::move(ir_))
62 	{
63 		options.vulkan_semantics = true;
64 	}
65 
66 	void set_format(const std::string &format);
67 	std::string compile() override;
68 
69 private:
70 	static std::string execution_model_to_str(spv::ExecutionModel model);
71 
72 	void emit_entry_points();
73 	void emit_types();
74 	void emit_resources();
75 	void emit_specialization_constants();
76 
77 	void emit_type(uint32_t type_id, bool &emitted_open_tag);
78 	void emit_type_member(const SPIRType &type, uint32_t index);
79 	void emit_type_member_qualifiers(const SPIRType &type, uint32_t index);
80 	void emit_type_array(const SPIRType &type);
81 	void emit_resources(const char *tag, const SmallVector<Resource> &resources);
82 	bool type_is_reference(const SPIRType &type) const;
83 
84 	std::string to_member_name(const SPIRType &type, uint32_t index) const;
85 
86 	std::shared_ptr<simple_json::Stream> json_stream;
87 };
88 
89 } // namespace SPIRV_CROSS_NAMESPACE
90 
91 #endif
92