1 // Copyright 2015 The Shaderc Authors. All rights reserved.
2 //
3 // Licensed under the Apache License, Version 2.0 (the "License");
4 // you may not use this file except in compliance with the License.
5 // You may obtain a copy of the License at
6 //
7 //     http://www.apache.org/licenses/LICENSE-2.0
8 //
9 // Unless required by applicable law or agreed to in writing, software
10 // distributed under the License is distributed on an "AS IS" BASIS,
11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 // See the License for the specific language governing permissions and
13 // limitations under the License.
14 
15 #ifndef LIBSHADERC_SRC_SHADERC_PRIVATE_H_
16 #define LIBSHADERC_SRC_SHADERC_PRIVATE_H_
17 
18 #include <cassert>
19 #include <cstdint>
20 #include <string>
21 #include <vector>
22 
23 #include "shaderc/shaderc.h"
24 
25 #include "libshaderc_util/compiler.h"
26 #include "spirv-tools/libspirv.h"
27 
28 // Described in shaderc.h.
29 struct shaderc_compilation_result {
~shaderc_compilation_resultshaderc_compilation_result30   virtual ~shaderc_compilation_result() {}
31 
32   // Returns the data from this compilation as a sequence of bytes.
33   virtual const char* GetBytes() const = 0;
34 
35   // The size of the output data in term of bytes.
36   size_t output_data_size = 0;
37   // Compilation messages.
38   std::string messages;
39   // Number of errors.
40   size_t num_errors = 0;
41   // Number of warnings.
42   size_t num_warnings = 0;
43   // Compilation status.
44   shaderc_compilation_status compilation_status =
45       shaderc_compilation_status_null_result_object;
46 };
47 
48 // Compilation result class using a vector for holding the compilation
49 // output data.
50 class shaderc_compilation_result_vector : public shaderc_compilation_result {
51  public:
52   ~shaderc_compilation_result_vector() = default;
53 
SetOutputData(std::vector<uint32_t> && data)54   void SetOutputData(std::vector<uint32_t>&& data) {
55     output_data_ = std::move(data);
56   }
57 
GetBytes()58   const char* GetBytes() const override {
59     return reinterpret_cast<const char*>(output_data_.data());
60   }
61 
62  private:
63   // Compilation output data. In normal compilation mode, it contains the
64   // compiled SPIR-V binary code. In disassembly and preprocessing-only mode, it
65   // contains a null-terminated string which is the text output. For text
66   // output, extra bytes with value 0x00 might be appended to complete the last
67   // uint32_t element.
68   std::vector<uint32_t> output_data_;
69 };
70 
71 // Compilation result class using a spv_binary for holding the compilation
72 // output data.
73 class shaderc_compilation_result_spv_binary
74     : public shaderc_compilation_result {
75  public:
~shaderc_compilation_result_spv_binary()76   ~shaderc_compilation_result_spv_binary() { spvBinaryDestroy(output_data_); }
77 
SetOutputData(spv_binary data)78   void SetOutputData(spv_binary data) { output_data_ = data; }
79 
GetBytes()80   const char* GetBytes() const override {
81     return reinterpret_cast<const char*>(output_data_->code);
82   }
83 
84  private:
85   spv_binary output_data_ = nullptr;
86 };
87 
88 namespace shaderc_util {
89 class GlslangInitializer;
90 }
91 
92 struct shaderc_compiler {
93   std::unique_ptr<shaderc_util::GlslangInitializer> initializer;
94 };
95 
96 // Converts a shader stage from shaderc_shader_kind into a shaderc_util::Compiler::Stage.
97 // This is only valid for a specifically named shader stage, e.g. vertex through fragment,
98 // or compute.
shaderc_convert_specific_stage(shaderc_shader_kind kind)99 inline shaderc_util::Compiler::Stage shaderc_convert_specific_stage(
100     shaderc_shader_kind kind) {
101   switch (kind) {
102     case shaderc_vertex_shader:
103       return shaderc_util::Compiler::Stage::Vertex;
104     case shaderc_fragment_shader:
105       return shaderc_util::Compiler::Stage::Fragment;
106     case shaderc_tess_control_shader:
107       return shaderc_util::Compiler::Stage::TessControl;
108     case shaderc_tess_evaluation_shader:
109       return shaderc_util::Compiler::Stage::TessEval;
110     case shaderc_geometry_shader:
111       return shaderc_util::Compiler::Stage::Geometry;
112     case shaderc_compute_shader:
113       return shaderc_util::Compiler::Stage::Compute;
114     case shaderc_raygen_shader:
115       return shaderc_util::Compiler::Stage::RayGenNV;
116     case shaderc_intersection_shader:
117       return shaderc_util::Compiler::Stage::IntersectNV;
118     case shaderc_anyhit_shader:
119       return shaderc_util::Compiler::Stage::AnyHitNV;
120     case shaderc_closesthit_shader:
121       return shaderc_util::Compiler::Stage::ClosestHitNV;
122     case shaderc_miss_shader:
123       return shaderc_util::Compiler::Stage::MissNV;
124     case shaderc_callable_shader:
125       return shaderc_util::Compiler::Stage::CallableNV;
126     case shaderc_task_shader:
127       return shaderc_util::Compiler::Stage::TaskNV;
128     case shaderc_mesh_shader:
129       return shaderc_util::Compiler::Stage::MeshNV;
130     default:
131       // We don't care about the other kinds.
132       break;
133   }
134   // This should not occur.
135   assert(false && "Should have specified a specific stage");
136   return shaderc_util::Compiler::Stage::TessEval;
137 }
138 
139 #endif  // LIBSHADERC_SRC_SHADERC_PRIVATE_H_
140