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

@@ -392,9 +392,9 @@ RID RendererCanvasRenderRD::_create_base_uniform_set(RID p_to_render_target, boo
{
RD::Uniform u;
u.uniform_type = RD::UNIFORM_TYPE_UNIFORM_BUFFER;
u.uniform_type = RD::UNIFORM_TYPE_STORAGE_BUFFER;
u.binding = 2;
u.append_id(state.lights_uniform_buffer);
u.append_id(state.lights_storage_buffer);
uniforms.push_back(u);
}
@@ -525,7 +525,7 @@ void RendererCanvasRenderRD::canvas_render_items(RID p_to_render_target, Item *p
uint32_t index = 0;
while (l) {
if (index == state.max_lights_per_render) {
if (index == MAX_LIGHTS_PER_RENDER) {
l->render_index_cache = -1;
l = l->next_ptr;
continue;
@@ -588,7 +588,7 @@ void RendererCanvasRenderRD::canvas_render_items(RID p_to_render_target, Item *p
uint32_t index = light_count;
while (l) {
if (index == state.max_lights_per_render) {
if (index == MAX_LIGHTS_PER_RENDER) {
l->render_index_cache = -1;
l = l->next_ptr;
continue;
@@ -664,7 +664,7 @@ void RendererCanvasRenderRD::canvas_render_items(RID p_to_render_target, Item *p
}
if (light_count > 0) {
RD::get_singleton()->buffer_update(state.lights_uniform_buffer, 0, sizeof(LightUniform) * light_count, &state.light_uniforms[0]);
RD::get_singleton()->buffer_update(state.lights_storage_buffer, 0, sizeof(LightUniform) * light_count, &state.light_uniforms[0]);
}
bool use_linear_colors = texture_storage->render_target_is_using_hdr(p_to_render_target);
@@ -964,7 +964,7 @@ void RendererCanvasRenderRD::_update_shadow_atlas() {
RD::TextureFormat tf;
tf.texture_type = RD::TEXTURE_TYPE_2D;
tf.width = state.shadow_texture_size;
tf.height = state.max_lights_per_render * 2;
tf.height = MAX_LIGHTS_PER_RENDER * 2;
tf.usage_bits = RD::TEXTURE_USAGE_COLOR_ATTACHMENT_BIT | RD::TEXTURE_USAGE_SAMPLING_BIT;
tf.format = RD::DATA_FORMAT_R32_SFLOAT;
@@ -975,7 +975,7 @@ void RendererCanvasRenderRD::_update_shadow_atlas() {
RD::TextureFormat tf;
tf.texture_type = RD::TEXTURE_TYPE_2D;
tf.width = state.shadow_texture_size;
tf.height = state.max_lights_per_render * 2;
tf.height = MAX_LIGHTS_PER_RENDER * 2;
tf.usage_bits = RD::TEXTURE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
tf.format = RD::DATA_FORMAT_D32_SFLOAT;
tf.is_discardable = true;
@@ -1022,7 +1022,7 @@ void RendererCanvasRenderRD::light_update_shadow(RID p_rid, int p_shadow_index,
_update_shadow_atlas();
cl->shadow.z_far = p_far;
cl->shadow.y_offset = float(p_shadow_index * 2 + 1) / float(state.max_lights_per_render * 2);
cl->shadow.y_offset = float(p_shadow_index * 2 + 1) / float(MAX_LIGHTS_PER_RENDER * 2);
Color cc = Color(p_far, p_far, p_far, 1.0);
// First, do a culling pass and record what occluders need to be drawn for this light.
@@ -1137,7 +1137,7 @@ void RendererCanvasRenderRD::light_update_directional_shadow(RID p_rid, int p_sh
float half_size = p_clip_rect.size.length() * 0.5; //shadow length, must keep this no matter the angle
cl->shadow.z_far = distance;
cl->shadow.y_offset = float(p_shadow_index * 2 + 1) / float(state.max_lights_per_render * 2);
cl->shadow.y_offset = float(p_shadow_index * 2 + 1) / float(MAX_LIGHTS_PER_RENDER * 2);
Transform2D to_light_xform;
@@ -1584,7 +1584,7 @@ void RendererCanvasRenderRD::CanvasShaderData::set_code(const String &p_code) {
pipeline_hash_map.clear_pipelines();
if (version.is_null()) {
version = canvas_singleton->shader.canvas_shader.version_create();
version = canvas_singleton->shader.canvas_shader.version_create(false);
}
#if 0
@@ -1625,6 +1625,11 @@ RS::ShaderNativeSourceCode RendererCanvasRenderRD::CanvasShaderData::get_native_
return canvas_singleton->shader.canvas_shader.version_get_native_source_code(version);
}
Pair<ShaderRD *, RID> RendererCanvasRenderRD::CanvasShaderData::get_native_shader_and_version() const {
RendererCanvasRenderRD *canvas_singleton = static_cast<RendererCanvasRenderRD *>(RendererCanvasRender::singleton);
return { &canvas_singleton->shader.canvas_shader, version };
}
RID RendererCanvasRenderRD::CanvasShaderData::get_shader(ShaderVariant p_shader_variant, bool p_ubershader) const {
if (version.is_valid()) {
uint32_t variant_index = p_shader_variant + (p_ubershader ? SHADER_VARIANT_MAX : 0);
@@ -1726,20 +1731,10 @@ RendererCanvasRenderRD::RendererCanvasRenderRD() {
{ //shader variants
String global_defines;
uint64_t uniform_max_size = RD::get_singleton()->limit_get(RD::LIMIT_MAX_UNIFORM_BUFFER_SIZE);
if (uniform_max_size < 65536) {
//Yes, you guessed right, ARM again
state.max_lights_per_render = 64;
global_defines += "#define MAX_LIGHTS 64\n";
} else {
state.max_lights_per_render = DEFAULT_MAX_LIGHTS_PER_RENDER;
global_defines += "#define MAX_LIGHTS " + itos(DEFAULT_MAX_LIGHTS_PER_RENDER) + "\n";
}
global_defines += "#define MAX_LIGHTS " + itos(MAX_LIGHTS_PER_RENDER) + "\n";
global_defines += "\n#define SAMPLERS_BINDING_FIRST_INDEX " + itos(SAMPLERS_BINDING_FIRST_INDEX) + "\n";
state.light_uniforms = memnew_arr(LightUniform, state.max_lights_per_render);
state.light_uniforms = memnew_arr(LightUniform, MAX_LIGHTS_PER_RENDER);
Vector<String> variants;
const uint32_t ubershader_iterations = 1;
for (uint32_t ubershader = 0; ubershader < ubershader_iterations; ubershader++) {
@@ -1921,7 +1916,7 @@ RendererCanvasRenderRD::RendererCanvasRenderRD() {
{ //bindings
state.canvas_state_buffer = RD::get_singleton()->uniform_buffer_create(sizeof(State::Buffer));
state.lights_uniform_buffer = RD::get_singleton()->uniform_buffer_create(sizeof(LightUniform) * state.max_lights_per_render);
state.lights_storage_buffer = RD::get_singleton()->storage_buffer_create(sizeof(LightUniform) * MAX_LIGHTS_PER_RENDER);
RD::SamplerState shadow_sampler_state;
shadow_sampler_state.mag_filter = RD::SAMPLER_FILTER_NEAREST;
@@ -3316,7 +3311,7 @@ RendererCanvasRenderRD::~RendererCanvasRenderRD() {
}
memdelete_arr(state.light_uniforms);
RD::get_singleton()->free(state.lights_uniform_buffer);
RD::get_singleton()->free(state.lights_storage_buffer);
}
//shadow rendering