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

[macOS] Selectively bake specific shader variants for MoltenVK.

This commit is contained in:
Pāvels Nadtočajevs
2025-06-20 13:03:47 +03:00
parent d7cc121e64
commit a8873727ac
6 changed files with 87 additions and 9 deletions

View File

@@ -235,9 +235,6 @@ void ShaderRD::_build_variant_code(StringBuilder &builder, uint32_t p_variant, c
}
#if (defined(MACOS_ENABLED) || defined(APPLE_EMBEDDED_ENABLED))
RenderingDevice *rd = RD::get_singleton();
if (rd->get_device_capabilities().device_family == RDD::DEVICE_VULKAN) {
builder.append("#define MOLTENVK_USED\n");
}
if (!rd->has_feature(RD::SUPPORTS_IMAGE_ATOMIC_32_BIT)) {
builder.append("#define NO_IMAGE_ATOMICS\n");
}
@@ -272,7 +269,7 @@ void ShaderRD::_build_variant_code(StringBuilder &builder, uint32_t p_variant, c
}
Vector<String> ShaderRD::_build_variant_stage_sources(uint32_t p_variant, CompileData p_data) {
if (!variants_enabled[p_variant]) {
if (!variants_enabled[p_variant] && !variants_bake_for.has(p_variant)) {
return Vector<String>(); // Variant is disabled, return.
}
@@ -474,7 +471,10 @@ bool ShaderRD::_load_from_cache(Version *p_version, int p_group) {
int variant_id = group_to_variant_map[p_group][i];
uint32_t variant_size = f->get_32();
ERR_FAIL_COND_V(variant_size == 0 && variants_enabled[variant_id], false);
if (!variants_enabled[variant_id]) {
if (!variants_enabled[variant_id] && !variants_bake_for.has(variant_id)) {
continue;
}
if (variant_size == 0) {
continue;
}
Vector<uint8_t> variant_bytes;
@@ -489,10 +489,11 @@ bool ShaderRD::_load_from_cache(Version *p_version, int p_group) {
for (uint32_t i = 0; i < variant_count; i++) {
int variant_id = group_to_variant_map[p_group][i];
if (!variants_enabled[variant_id]) {
if ((!variants_enabled[variant_id] && !variants_bake_for.has(variant_id)) || p_version->variant_data[variant_id].is_empty()) {
p_version->variants.write[variant_id] = RID();
continue;
}
print_verbose(vformat("Loading cache for shader %s, variant %d", name, i));
{
RID shader = RD::get_singleton()->shader_create_from_bytecode_with_samplers(p_version->variant_data[variant_id], p_version->variants[variant_id], immutable_samplers);
if (shader.is_null()) {
@@ -581,7 +582,7 @@ void ShaderRD::_compile_version_end(Version *p_version, int p_group) {
if (!all_valid) {
// Clear versions if they exist.
for (int i = 0; i < variant_defines.size(); i++) {
if (!variants_enabled[i] || !group_enabled[variant_defines[i].group]) {
if ((!variants_enabled[i] && !variants_bake_for.has(i)) || !group_enabled[variant_defines[i].group]) {
continue; // Disabled.
}
if (!p_version->variants[i].is_null()) {