You've already forked godot
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:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user