Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix soft shadows by increasing the bit count for specialization constants. #98614

Merged
merged 1 commit into from
Oct 28, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -108,10 +108,10 @@ class SceneShaderForwardClustered {
uint32_t projector_use_mipmaps : 1;
uint32_t use_depth_fog : 1;
uint32_t use_lightmap_bicubic_filter : 1;
uint32_t soft_shadow_samples : 4;
uint32_t penumbra_shadow_samples : 4;
uint32_t directional_soft_shadow_samples : 4;
uint32_t directional_penumbra_shadow_samples : 4;
uint32_t soft_shadow_samples : 6;
uint32_t penumbra_shadow_samples : 6;
uint32_t directional_soft_shadow_samples : 6;
uint32_t directional_penumbra_shadow_samples : 6;
};

uint32_t packed_0;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -322,7 +322,12 @@ void SceneShaderForwardMobile::ShaderData::_create_pipeline(PipelineKey p_pipeli
specialization_constants.push_back(sc);

sc.constant_id = 1;
sc.float_value = p_pipeline_key.shader_specialization.packed_1;
sc.int_value = p_pipeline_key.shader_specialization.packed_1;
sc.type = RD::PIPELINE_SPECIALIZATION_CONSTANT_TYPE_INT;
specialization_constants.push_back(sc);

sc.constant_id = 2;
sc.float_value = p_pipeline_key.shader_specialization.packed_2;
sc.type = RD::PIPELINE_SPECIALIZATION_CONSTANT_TYPE_FLOAT;
specialization_constants.push_back(sc);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -74,22 +74,23 @@ class SceneShaderForwardMobile {
uint32_t use_depth_fog : 1;
uint32_t is_multimesh : 1;
uint32_t use_lightmap_bicubic_filter : 1;
uint32_t pad : 2;
uint32_t soft_shadow_samples : 4;
uint32_t penumbra_shadow_samples : 4;
uint32_t directional_soft_shadow_samples : 4;
uint32_t directional_penumbra_shadow_samples : 4;
uint32_t soft_shadow_samples : 6;
uint32_t penumbra_shadow_samples : 6;
uint32_t directional_soft_shadow_samples : 6;
};

uint32_t packed_0;
};

union {
float luminance_multiplier;
float packed_1;
uint32_t directional_penumbra_shadow_samples : 6;
uint32_t packed_1;
};

uint32_t packed_2;
union {
float luminance_multiplier;
float packed_2;
};
};

struct UbershaderConstants {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -107,19 +107,19 @@ bool sc_use_lightmap_bicubic_filter() {
}

uint sc_soft_shadow_samples() {
return (sc_packed_0() >> 8) & 15U;
return (sc_packed_0() >> 8) & 63U;
}

uint sc_penumbra_shadow_samples() {
return (sc_packed_0() >> 12) & 15U;
return (sc_packed_0() >> 14) & 63U;
}

uint sc_directional_soft_shadow_samples() {
return (sc_packed_0() >> 16) & 15U;
return (sc_packed_0() >> 20) & 63U;
}

uint sc_directional_penumbra_shadow_samples() {
return (sc_packed_0() >> 20) & 15U;
return (sc_packed_0() >> 26) & 63U;
}

float sc_luminance_multiplier() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,8 +22,8 @@ layout(push_constant, std430) uniform DrawCall {
uint pad;
#ifdef UBERSHADER
uint sc_packed_0;
float sc_packed_1;
uint sc_packed_2;
uint sc_packed_1;
float sc_packed_2;
uint uc_packed_0;
#endif
}
Expand All @@ -42,10 +42,14 @@ uint sc_packed_0() {
return draw_call.sc_packed_0;
}

float sc_packed_1() {
uint sc_packed_1() {
return draw_call.sc_packed_1;
}

float sc_packed_2() {
return draw_call.sc_packed_2;
}

uint uc_cull_mode() {
return (draw_call.uc_packed_0 >> 0) & 3U;
}
Expand All @@ -54,16 +58,21 @@ uint uc_cull_mode() {

// Pull the constants from the pipeline's specialization constants.
layout(constant_id = 0) const uint pso_sc_packed_0 = 0;
layout(constant_id = 1) const float pso_sc_packed_1 = 2.0;
layout(constant_id = 1) const uint pso_sc_packed_1 = 0;
layout(constant_id = 2) const float pso_sc_packed_2 = 2.0;

uint sc_packed_0() {
return pso_sc_packed_0;
}

float sc_packed_1() {
uint sc_packed_1() {
return pso_sc_packed_1;
}

float sc_packed_2() {
return pso_sc_packed_2;
}

#endif

bool sc_use_light_projector() {
Expand Down Expand Up @@ -123,23 +132,23 @@ bool sc_use_lightmap_bicubic_filter() {
}

uint sc_soft_shadow_samples() {
return (sc_packed_0() >> 16) & 15U;
return (sc_packed_0() >> 14) & 63U;
}

uint sc_penumbra_shadow_samples() {
return (sc_packed_0() >> 20) & 15U;
return (sc_packed_0() >> 20) & 63U;
}

uint sc_directional_soft_shadow_samples() {
return (sc_packed_0() >> 24) & 15U;
return (sc_packed_0() >> 26) & 63U;
}

uint sc_directional_penumbra_shadow_samples() {
return (sc_packed_0() >> 28) & 15U;
return (sc_packed_1() >> 0) & 63U;
}

float sc_luminance_multiplier() {
return sc_packed_1();
return sc_packed_2();
}

/* Set 0: Base Pass (never changes) */
Expand Down
Loading