|
@@ -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);
|
|
|
|