You've already forked godot
mirror of
https://github.com/godotengine/godot.git
synced 2025-11-07 12:30:27 +00:00
Added ability to visualize native shaders
This commit is contained in:
@@ -351,6 +351,127 @@ void ShaderRD::_compile_variant(uint32_t p_variant, Version *p_version) {
|
||||
}
|
||||
}
|
||||
|
||||
RS::ShaderNativeSourceCode ShaderRD::version_get_native_source_code(RID p_version) {
|
||||
Version *version = version_owner.getornull(p_version);
|
||||
RS::ShaderNativeSourceCode source_code;
|
||||
ERR_FAIL_COND_V(!version, source_code);
|
||||
|
||||
source_code.versions.resize(variant_defines.size());
|
||||
|
||||
for (int i = 0; i < source_code.versions.size(); i++) {
|
||||
if (!is_compute) {
|
||||
//vertex stage
|
||||
|
||||
StringBuilder builder;
|
||||
|
||||
builder.append(vertex_codev.get_data()); // version info (if exists)
|
||||
builder.append("\n"); //make sure defines begin at newline
|
||||
builder.append(general_defines.get_data());
|
||||
builder.append(variant_defines[i].get_data());
|
||||
|
||||
for (int j = 0; j < version->custom_defines.size(); j++) {
|
||||
builder.append(version->custom_defines[j].get_data());
|
||||
}
|
||||
|
||||
builder.append(vertex_code0.get_data()); //first part of vertex
|
||||
|
||||
builder.append(version->uniforms.get_data()); //uniforms (same for vertex and fragment)
|
||||
|
||||
builder.append(vertex_code1.get_data()); //second part of vertex
|
||||
|
||||
builder.append(version->vertex_globals.get_data()); // vertex globals
|
||||
|
||||
builder.append(vertex_code2.get_data()); //third part of vertex
|
||||
|
||||
builder.append(version->vertex_code.get_data()); // code
|
||||
|
||||
builder.append(vertex_code3.get_data()); //fourth of vertex
|
||||
|
||||
RS::ShaderNativeSourceCode::Version::Stage stage;
|
||||
stage.name = "vertex";
|
||||
stage.code = builder.as_string();
|
||||
|
||||
source_code.versions.write[i].stages.push_back(stage);
|
||||
}
|
||||
|
||||
if (!is_compute) {
|
||||
//fragment stage
|
||||
|
||||
StringBuilder builder;
|
||||
|
||||
builder.append(fragment_codev.get_data()); // version info (if exists)
|
||||
builder.append("\n"); //make sure defines begin at newline
|
||||
|
||||
builder.append(general_defines.get_data());
|
||||
builder.append(variant_defines[i].get_data());
|
||||
for (int j = 0; j < version->custom_defines.size(); j++) {
|
||||
builder.append(version->custom_defines[j].get_data());
|
||||
}
|
||||
|
||||
builder.append(fragment_code0.get_data()); //first part of fragment
|
||||
|
||||
builder.append(version->uniforms.get_data()); //uniforms (same for fragment and fragment)
|
||||
|
||||
builder.append(fragment_code1.get_data()); //first part of fragment
|
||||
|
||||
builder.append(version->fragment_globals.get_data()); // fragment globals
|
||||
|
||||
builder.append(fragment_code2.get_data()); //third part of fragment
|
||||
|
||||
builder.append(version->fragment_light.get_data()); // fragment light
|
||||
|
||||
builder.append(fragment_code3.get_data()); //fourth part of fragment
|
||||
|
||||
builder.append(version->fragment_code.get_data()); // fragment code
|
||||
|
||||
builder.append(fragment_code4.get_data()); //fourth part of fragment
|
||||
|
||||
RS::ShaderNativeSourceCode::Version::Stage stage;
|
||||
stage.name = "fragment";
|
||||
stage.code = builder.as_string();
|
||||
|
||||
source_code.versions.write[i].stages.push_back(stage);
|
||||
}
|
||||
|
||||
if (is_compute) {
|
||||
//compute stage
|
||||
|
||||
StringBuilder builder;
|
||||
|
||||
builder.append(compute_codev.get_data()); // version info (if exists)
|
||||
builder.append("\n"); //make sure defines begin at newline
|
||||
builder.append(general_defines.get_data());
|
||||
builder.append(variant_defines[i].get_data());
|
||||
|
||||
for (int j = 0; j < version->custom_defines.size(); j++) {
|
||||
builder.append(version->custom_defines[j].get_data());
|
||||
}
|
||||
|
||||
builder.append(compute_code0.get_data()); //first part of compute
|
||||
|
||||
builder.append(version->uniforms.get_data()); //uniforms (same for compute and fragment)
|
||||
|
||||
builder.append(compute_code1.get_data()); //second part of compute
|
||||
|
||||
builder.append(version->compute_globals.get_data()); // compute globals
|
||||
|
||||
builder.append(compute_code2.get_data()); //third part of compute
|
||||
|
||||
builder.append(version->compute_code.get_data()); // code
|
||||
|
||||
builder.append(compute_code3.get_data()); //fourth of compute
|
||||
|
||||
RS::ShaderNativeSourceCode::Version::Stage stage;
|
||||
stage.name = "compute";
|
||||
stage.code = builder.as_string();
|
||||
|
||||
source_code.versions.write[i].stages.push_back(stage);
|
||||
}
|
||||
}
|
||||
|
||||
return source_code;
|
||||
}
|
||||
|
||||
void ShaderRD::_compile_version(Version *p_version) {
|
||||
_clear_version(p_version);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user