1
0
mirror of https://github.com/godotengine/godot.git synced 2025-11-04 12:00:25 +00:00

Add shader baker to project exporter.

Metal Support contributed by Migeran (https://migeran.com) and Stuart Carnie.

Co-authored-by: Stuart Carnie <stuart.carnie@gmail.com>
Co-authored-by: Gergely Kis <gergely.kis@migeran.com>
This commit is contained in:
Dario
2025-01-13 16:13:39 -03:00
parent 99f5a3d665
commit 5a30a7e7cd
112 changed files with 5786 additions and 4203 deletions

View File

@@ -368,6 +368,11 @@ RS::ShaderNativeSourceCode Fog::FogShaderData::get_native_source_code() const {
return fog_singleton->volumetric_fog.shader.version_get_native_source_code(version);
}
Pair<ShaderRD *, RID> Fog::FogShaderData::get_native_shader_and_version() const {
Fog *fog_singleton = Fog::get_singleton();
return { &fog_singleton->volumetric_fog.shader, version };
}
Fog::FogShaderData::~FogShaderData() {
Fog *fog_singleton = Fog::get_singleton();
ERR_FAIL_NULL(fog_singleton);

View File

@@ -202,6 +202,7 @@ private:
virtual bool is_animated() const;
virtual bool casts_shadows() const;
virtual RS::ShaderNativeSourceCode get_native_source_code() const;
virtual Pair<ShaderRD *, RID> get_native_shader_and_version() const;
FogShaderData() {}
virtual ~FogShaderData();

View File

@@ -3366,6 +3366,31 @@ GI::GI() {
}
GI::~GI() {
if (voxel_gi_debug_shader_version.is_valid()) {
voxel_gi_debug_shader.version_free(voxel_gi_debug_shader_version);
}
if (voxel_gi_lighting_shader_version.is_valid()) {
voxel_gi_shader.version_free(voxel_gi_lighting_shader_version);
}
if (shader_version.is_valid()) {
shader.version_free(shader_version);
}
if (sdfgi_shader.debug_probes_shader.is_valid()) {
sdfgi_shader.debug_probes.version_free(sdfgi_shader.debug_probes_shader);
}
if (sdfgi_shader.debug_shader.is_valid()) {
sdfgi_shader.debug.version_free(sdfgi_shader.debug_shader);
}
if (sdfgi_shader.direct_light_shader.is_valid()) {
sdfgi_shader.direct_light.version_free(sdfgi_shader.direct_light_shader);
}
if (sdfgi_shader.integrate_shader.is_valid()) {
sdfgi_shader.integrate.version_free(sdfgi_shader.integrate_shader);
}
if (sdfgi_shader.preprocess_shader.is_valid()) {
sdfgi_shader.preprocess.version_free(sdfgi_shader.preprocess_shader);
}
singleton = nullptr;
}
@@ -3511,20 +3536,26 @@ void GI::init(SkyRD *p_sky) {
{
//calculate tables
String defines = "\n#define SDFGI_OCT_SIZE " + itos(SDFGI::LIGHTPROBE_OCT_SIZE) + "\n";
if (RendererSceneRenderRD::get_singleton()->is_vrs_supported()) {
defines += "\n#define USE_VRS\n";
}
if (!RD::get_singleton()->sampler_is_format_supported_for_filter(RD::DATA_FORMAT_R8G8_UINT, RD::SAMPLER_FILTER_LINEAR)) {
defines += "\n#define SAMPLE_VOXEL_GI_NEAREST\n";
Vector<ShaderRD::VariantDefine> variants;
for (uint32_t vrs = 0; vrs < 2; vrs++) {
String vrs_base = vrs ? "\n#define USE_VRS\n" : "";
Group group = vrs ? GROUP_VRS : GROUP_NORMAL;
bool default_enabled = vrs == 0;
variants.push_back(ShaderRD::VariantDefine(group, vrs_base + "\n#define USE_VOXEL_GI_INSTANCES\n", default_enabled)); // MODE_VOXEL_GI
variants.push_back(ShaderRD::VariantDefine(group, vrs_base + "\n#define USE_VOXEL_GI_INSTANCES\n#define SAMPLE_VOXEL_GI_NEAREST\n", default_enabled)); // MODE_VOXEL_GI_WITHOUT_SAMPLER
variants.push_back(ShaderRD::VariantDefine(group, vrs_base + "\n#define USE_SDFGI\n", default_enabled)); // MODE_SDFGI
variants.push_back(ShaderRD::VariantDefine(group, vrs_base + "\n#define USE_SDFGI\n\n#define USE_VOXEL_GI_INSTANCES\n", default_enabled)); // MODE_COMBINED
variants.push_back(ShaderRD::VariantDefine(group, vrs_base + "\n#define USE_SDFGI\n\n#define USE_VOXEL_GI_INSTANCES\n#define SAMPLE_VOXEL_GI_NEAREST\n", default_enabled)); // MODE_COMBINED_WITHOUT_SAMPLER
}
Vector<String> gi_modes;
shader.initialize(variants, defines);
gi_modes.push_back("\n#define USE_VOXEL_GI_INSTANCES\n"); // MODE_VOXEL_GI
gi_modes.push_back("\n#define USE_SDFGI\n"); // MODE_SDFGI
gi_modes.push_back("\n#define USE_SDFGI\n\n#define USE_VOXEL_GI_INSTANCES\n"); // MODE_COMBINED
bool vrs_supported = RendererSceneRenderRD::get_singleton()->is_vrs_supported();
if (vrs_supported) {
shader.enable_group(GROUP_VRS);
}
shader.initialize(gi_modes, defines);
shader_version = shader.version_create();
Vector<RD::PipelineSpecializationConstant> specialization_constants;
@@ -3551,8 +3582,10 @@ void GI::init(SkyRD *p_sky) {
specialization_constants.ptrw()[0].bool_value = (v & SHADER_SPECIALIZATION_HALF_RES) ? true : false;
specialization_constants.ptrw()[1].bool_value = (v & SHADER_SPECIALIZATION_USE_FULL_PROJECTION_MATRIX) ? true : false;
specialization_constants.ptrw()[2].bool_value = (v & SHADER_SPECIALIZATION_USE_VRS) ? true : false;
int variant_base = vrs_supported ? MODE_MAX : 0;
for (int i = 0; i < MODE_MAX; i++) {
pipelines[v][i] = RD::get_singleton()->compute_pipeline_create(shader.version_get_shader(shader_version, i), specialization_constants);
pipelines[v][i] = RD::get_singleton()->compute_pipeline_create(shader.version_get_shader(shader_version, variant_base + i), specialization_constants);
}
}
@@ -3612,31 +3645,6 @@ void GI::free() {
RD::get_singleton()->free(sdfgi_ubo);
}
if (voxel_gi_debug_shader_version.is_valid()) {
voxel_gi_debug_shader.version_free(voxel_gi_debug_shader_version);
}
if (voxel_gi_lighting_shader_version.is_valid()) {
voxel_gi_shader.version_free(voxel_gi_lighting_shader_version);
}
if (shader_version.is_valid()) {
shader.version_free(shader_version);
}
if (sdfgi_shader.debug_probes_shader.is_valid()) {
sdfgi_shader.debug_probes.version_free(sdfgi_shader.debug_probes_shader);
}
if (sdfgi_shader.debug_shader.is_valid()) {
sdfgi_shader.debug.version_free(sdfgi_shader.debug_shader);
}
if (sdfgi_shader.direct_light_shader.is_valid()) {
sdfgi_shader.direct_light.version_free(sdfgi_shader.direct_light_shader);
}
if (sdfgi_shader.integrate_shader.is_valid()) {
sdfgi_shader.integrate.version_free(sdfgi_shader.integrate_shader);
}
if (sdfgi_shader.preprocess_shader.is_valid()) {
sdfgi_shader.preprocess.version_free(sdfgi_shader.preprocess_shader);
}
if (voxel_gi_lights) {
memdelete_arr(voxel_gi_lights);
}
@@ -3889,7 +3897,15 @@ void GI::process_gi(Ref<RenderSceneBuffersRD> p_render_buffers, const RID *p_nor
pipeline_specialization |= SHADER_SPECIALIZATION_USE_VRS;
}
Mode mode = (use_sdfgi && use_voxel_gi_instances) ? MODE_COMBINED : (use_sdfgi ? MODE_SDFGI : MODE_VOXEL_GI);
bool without_sampler = RD::get_singleton()->sampler_is_format_supported_for_filter(RD::DATA_FORMAT_R8G8_UINT, RD::SAMPLER_FILTER_LINEAR);
Mode mode;
if (use_sdfgi && use_voxel_gi_instances) {
mode = without_sampler ? MODE_COMBINED_WITHOUT_SAMPLER : MODE_COMBINED;
} else if (use_sdfgi) {
mode = MODE_SDFGI;
} else {
mode = without_sampler ? MODE_VOXEL_GI_WITHOUT_SAMPLER : MODE_VOXEL_GI;
}
for (uint32_t v = 0; v < p_view_count; v++) {
push_constant.view_index = v;
@@ -4062,7 +4078,9 @@ void GI::process_gi(Ref<RenderSceneBuffersRD> p_render_buffers, const RID *p_nor
uniforms.push_back(u);
}
rbgi->uniform_set[v] = RD::get_singleton()->uniform_set_create(uniforms, shader.version_get_shader(shader_version, 0), 0);
bool vrs_supported = RendererSceneRenderRD::get_singleton()->is_vrs_supported();
int variant_base = vrs_supported ? MODE_MAX : 0;
rbgi->uniform_set[v] = RD::get_singleton()->uniform_set_create(uniforms, shader.version_get_shader(shader_version, variant_base), 0);
}
RD::get_singleton()->compute_list_bind_compute_pipeline(compute_list, pipelines[pipeline_specialization][mode]);
@@ -4121,3 +4139,7 @@ void GI::debug_voxel_gi(RID p_voxel_gi, RD::DrawListID p_draw_list, RID p_frameb
voxel_gi->debug(p_draw_list, p_framebuffer, p_camera_with_transform, p_lighting, p_emission, p_alpha);
}
void GI::enable_vrs_shader_group() {
shader.enable_group(GROUP_VRS);
}

View File

@@ -788,10 +788,17 @@ public:
RID sdfgi_ubo;
enum Group {
GROUP_NORMAL,
GROUP_VRS,
};
enum Mode {
MODE_VOXEL_GI,
MODE_VOXEL_GI_WITHOUT_SAMPLER,
MODE_SDFGI,
MODE_COMBINED,
MODE_COMBINED_WITHOUT_SAMPLER,
MODE_MAX
};
@@ -825,6 +832,8 @@ public:
bool voxel_gi_needs_update(RID p_probe) const;
void voxel_gi_update(RID p_probe, bool p_update_light_instances, const Vector<RID> &p_light_instances, const PagedArray<RenderGeometryInstance *> &p_dynamic_objects);
void debug_voxel_gi(RID p_voxel_gi, RD::DrawListID p_draw_list, RID p_framebuffer, const Projection &p_camera_with_transform, bool p_lighting, bool p_emission, float p_alpha);
void enable_vrs_shader_group();
};
} // namespace RendererRD

View File

@@ -168,6 +168,11 @@ RS::ShaderNativeSourceCode SkyRD::SkyShaderData::get_native_source_code() const
return scene_singleton->sky.sky_shader.shader.version_get_native_source_code(version);
}
Pair<ShaderRD *, RID> SkyRD::SkyShaderData::get_native_shader_and_version() const {
RendererSceneRenderRD *scene_singleton = static_cast<RendererSceneRenderRD *>(RendererSceneRenderRD::singleton);
return { &scene_singleton->sky.sky_shader.shader, version };
}
SkyRD::SkyShaderData::~SkyShaderData() {
RendererSceneRenderRD *scene_singleton = static_cast<RendererSceneRenderRD *>(RendererSceneRenderRD::singleton);
ERR_FAIL_NULL(scene_singleton);

View File

@@ -128,6 +128,7 @@ private:
virtual bool is_animated() const;
virtual bool casts_shadows() const;
virtual RS::ShaderNativeSourceCode get_native_source_code() const;
virtual Pair<ShaderRD *, RID> get_native_shader_and_version() const;
SkyShaderData() {}
virtual ~SkyShaderData();