Skip to content

Commit 044dda5

Browse files
committed
Fix entry point in msl code
1 parent e60ee25 commit 044dda5

3 files changed

Lines changed: 26 additions & 24 deletions

File tree

pathfinder/gpu/shader_translator.cpp

Lines changed: 20 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ std::shared_ptr<ShaderCode> glsl_to_spv(const ShaderCode *glsl_code) {
6969
return {};
7070
}
7171

72-
// Link the shader
72+
// Link the shader.
7373
glslang::TProgram program;
7474
program.addShader(&shader);
7575

@@ -159,11 +159,14 @@ std::shared_ptr<ShaderCode> spv_to_glsl(const ShaderCode *spv_code, bool is_es,
159159
auto resource = glsl.get_shader_resources();
160160

161161
// Update glsl resource binding map for GLES 3.0.
162+
163+
// Update texture binding map.
162164
for (const auto &r : resource.sampled_images) {
163165
uint32_t binding = glsl.get_decoration(r.id, spv::DecorationBinding);
164166
glsl_code->texture_binding_map.emplace_back(binding, r.name);
165167
}
166168

169+
// Update uniform binding map.
167170
std::vector<UniformBufferInfo> ubo_infos_;
168171

169172
for (const auto &r : resource.uniform_buffers) {
@@ -173,7 +176,7 @@ std::shared_ptr<ShaderCode> spv_to_glsl(const ShaderCode *spv_code, bool is_es,
173176
// Update uniform buffer info.
174177
ubo_infos_.emplace_back();
175178
auto &ubo_info = ubo_infos_.back();
176-
auto ub_type = glsl.get_type(r.type_id);
179+
const auto &ub_type = glsl.get_type(r.type_id);
177180
ubo_info.name = r.name;
178181
ubo_info.binding_point = binding;
179182
ubo_info.size = std::ceil(glsl.get_declared_struct_size(ub_type) / 16.0f) * 16;
@@ -189,26 +192,26 @@ std::shared_ptr<ShaderCode> spv_to_glsl(const ShaderCode *spv_code, bool is_es,
189192
return glsl_code;
190193
}
191194

192-
std::shared_ptr<ShaderCode> spv2msl(const ShaderCode *spv_code, bool need_framebuffer_fetch) {
195+
std::shared_ptr<ShaderCode> spv_to_msl(const ShaderCode *spv_code, bool need_framebuffer_fetch) {
193196
spirv_cross::CompilerMSL msl(reinterpret_cast<const uint32_t *>(spv_code->code.data()), spv_code->code.size() / 4);
194197
spirv_cross::ShaderResources resources = msl.get_shader_resources();
195198

196199
// Metal 专有的绑定偏移逻辑
197200
// 预留前 8 个索引给 Vertex Buffers ([[buffer(0)]] 到 [[buffer(7)]])
198201
const unsigned METAL_BUFFER_OFFSET = 8;
199202

200-
for (auto &resource : resources.uniform_buffers) {
201-
unsigned set = msl.get_decoration(resource.id, spv::DecorationDescriptorSet);
202-
unsigned binding = msl.get_decoration(resource.id, spv::DecorationBinding);
203+
for (const auto &resource : resources.uniform_buffers) {
204+
const unsigned set = msl.get_decoration(resource.id, spv::DecorationDescriptorSet);
205+
const unsigned binding = msl.get_decoration(resource.id, spv::DecorationBinding);
203206

204207
msl.unset_decoration(resource.id, spv::DecorationDescriptorSet);
205208
// MSL 中 UBO 和 Vertex Buffer 共享 buffer 索引,所以必须偏移
206209
msl.set_decoration(resource.id, spv::DecorationBinding, set * 16 + binding + METAL_BUFFER_OFFSET);
207210
}
208211

209-
for (auto &resource : resources.sampled_images) {
210-
unsigned set = msl.get_decoration(resource.id, spv::DecorationDescriptorSet);
211-
unsigned binding = msl.get_decoration(resource.id, spv::DecorationBinding);
212+
for (const auto &resource : resources.sampled_images) {
213+
const unsigned set = msl.get_decoration(resource.id, spv::DecorationDescriptorSet);
214+
const unsigned binding = msl.get_decoration(resource.id, spv::DecorationBinding);
212215

213216
msl.unset_decoration(resource.id, spv::DecorationDescriptorSet);
214217
// 采样器通常使用 [[texture(N)]] 和 [[sampler(N)]],与 buffer 空间分开,
@@ -227,13 +230,13 @@ std::shared_ptr<ShaderCode> spv2msl(const ShaderCode *spv_code, bool need_frameb
227230

228231
auto msl_code = std::make_shared<ShaderCode>();
229232
msl_code->stage = spv_code->stage;
230-
msl_code->entry_point = msl_code->entry_point;
233+
msl_code->entry_point = spv_code->entry_point;
231234
msl_code->code = msl.compile();
232235

233236
return msl_code;
234237
}
235238

236-
void ShaderTranslator::set_shader(const ShaderCodeKey &shader_key, const std::shared_ptr<ShaderCode> &code) {
239+
void ShaderTranslator::set_shader_code(const ShaderCodeKey &shader_key, const std::shared_ptr<ShaderCode> &code) {
237240
shader_->update_shader_code(shader_key, code);
238241
}
239242

@@ -248,11 +251,15 @@ void ShaderTranslator::compile_from_glsl(const std::string &entry_point,
248251
glsl_code->entry_point = entry_point;
249252
glsl_code->code = shader_code;
250253

251-
set_shader({ShaderSourceType::GLSL, 4, 5}, glsl_code);
254+
set_shader_code({ShaderSourceType::GLSL, 4, 5}, glsl_code);
252255

253256
prepare(need_framebuffer_fetch);
254257
}
255258

259+
std::shared_ptr<Shader> ShaderTranslator::get_shader() const {
260+
return shader_;
261+
}
262+
256263
bool ShaderTranslator::prepare(bool need_framebuffer_fetch) {
257264
auto spv_code_ptr = shader_->get_shader_code({ShaderSourceType::SPIRV, 1, 1});
258265
auto glsl_code_ptr = shader_->get_shader_code({ShaderSourceType::GLSL, 4, 5});
@@ -287,7 +294,7 @@ bool ShaderTranslator::prepare(bool need_framebuffer_fetch) {
287294

288295
// Generate msl code.
289296
if (msl_code_ptr == nullptr) {
290-
auto msl_code = spv2msl(spv_code_ptr.get(), need_framebuffer_fetch);
297+
auto msl_code = spv_to_msl(spv_code_ptr.get(), need_framebuffer_fetch);
291298
shader_->update_shader_code({ShaderSourceType::MSL, 1, 2}, msl_code);
292299
}
293300

pathfinder/gpu/shader_translator.h

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -27,19 +27,17 @@ struct UniformBufferInfo {
2727
/// Translates GLSL/SPV into SPV, MSL, GLSL ES etc. at runtime. Optional.
2828
class ShaderTranslator {
2929
public:
30-
ShaderTranslator(ShaderStage stage);
30+
explicit ShaderTranslator(ShaderStage stage);
3131

3232
~ShaderTranslator();
3333

3434
/// Set shader content by a specific key, shaders of other keys won't be affected.
35-
void set_shader(const ShaderCodeKey &key, const std::shared_ptr<ShaderCode> &code);
35+
void set_shader_code(const ShaderCodeKey &key, const std::shared_ptr<ShaderCode> &code);
3636

3737
/// Compile shader module at runtime using provided Glsl 4.4 code.
3838
void compile_from_glsl(const std::string &entry_point, const std::string &shader_code, bool need_framebuffer_fetch);
3939

40-
std::shared_ptr<Shader> outputShader() const {
41-
return shader_;
42-
}
40+
std::shared_ptr<Shader> get_shader() const;
4341

4442
private:
4543
bool prepare(bool need_framebuffer_fetch);

shader_generator/src/generator.cpp

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,11 @@
1-
#include <cassert>
1+
#include "generator.h"
2+
23
#include <fstream>
34
#include <iostream>
45
#include <regex>
5-
#include <spirv_glsl.hpp>
6-
#include <spirv_msl.hpp>
76
#include <spirv_parser.hpp>
8-
#include <spirv_reflect.hpp>
97

108
#include "../../pathfinder/gpu/shader_translator.h"
11-
#include "generator.h"
129

1310
using namespace Pathfinder;
1411

@@ -95,7 +92,7 @@ void generate_shader(const char* input_shader_file, const char* output_binary_fi
9592
auto translator = std::make_shared<ShaderTranslator>(binary_shader_stage_to_shader_stage(stage));
9693
translator->compile_from_glsl(entry_point, shader_source, need_framebuffer_fetch);
9794

98-
auto prepared_shader = translator->outputShader();
95+
auto prepared_shader = translator->get_shader();
9996

10097
// 辅助 lambda 函数,用于写入不同类型的 Shader 到同一个二进制文件中
10198
auto write_to_bin = [&](ShaderSourceType type, uint8_t major, uint8_t minor) {

0 commit comments

Comments
 (0)