You've already forked godot
mirror of
https://github.com/godotengine/godot.git
synced 2025-11-07 12:30:27 +00:00
Extract global variable, shader and material storage
This commit is contained in:
@@ -33,6 +33,7 @@
|
||||
#include "core/math/math_defs.h"
|
||||
#include "renderer_scene_render_rd.h"
|
||||
#include "servers/rendering/renderer_rd/renderer_compositor_rd.h"
|
||||
#include "servers/rendering/renderer_rd/storage_rd/material_storage.h"
|
||||
#include "servers/rendering/renderer_rd/storage_rd/texture_storage.h"
|
||||
#include "servers/rendering/rendering_server_default.h"
|
||||
|
||||
@@ -177,13 +178,13 @@ void RendererSceneSkyRD::SkyShaderData::get_param_list(List<PropertyInfo> *p_par
|
||||
}
|
||||
}
|
||||
|
||||
void RendererSceneSkyRD::SkyShaderData::get_instance_param_list(List<RendererStorage::InstanceShaderParam> *p_param_list) const {
|
||||
void RendererSceneSkyRD::SkyShaderData::get_instance_param_list(List<RendererMaterialStorage::InstanceShaderParam> *p_param_list) const {
|
||||
for (const KeyValue<StringName, ShaderLanguage::ShaderNode::Uniform> &E : uniforms) {
|
||||
if (E.value.scope != ShaderLanguage::ShaderNode::Uniform::SCOPE_INSTANCE) {
|
||||
continue;
|
||||
}
|
||||
|
||||
RendererStorage::InstanceShaderParam p;
|
||||
RendererMaterialStorage::InstanceShaderParam p;
|
||||
p.info = ShaderLanguage::uniform_to_property_info(E.value);
|
||||
p.info.name = E.key; //supply name
|
||||
p.index = E.value.instance_index;
|
||||
@@ -767,24 +768,24 @@ Ref<Image> RendererSceneSkyRD::Sky::bake_panorama(RendererStorageRD *p_storage,
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
// RendererSceneSkyRD
|
||||
|
||||
RendererStorageRD::ShaderData *RendererSceneSkyRD::_create_sky_shader_func() {
|
||||
RendererRD::ShaderData *RendererSceneSkyRD::_create_sky_shader_func() {
|
||||
SkyShaderData *shader_data = memnew(SkyShaderData);
|
||||
return shader_data;
|
||||
}
|
||||
|
||||
RendererStorageRD::ShaderData *RendererSceneSkyRD::_create_sky_shader_funcs() {
|
||||
RendererRD::ShaderData *RendererSceneSkyRD::_create_sky_shader_funcs() {
|
||||
// !BAS! Why isn't _create_sky_shader_func not just static too?
|
||||
return static_cast<RendererSceneRenderRD *>(RendererSceneRenderRD::singleton)->sky._create_sky_shader_func();
|
||||
};
|
||||
|
||||
RendererStorageRD::MaterialData *RendererSceneSkyRD::_create_sky_material_func(SkyShaderData *p_shader) {
|
||||
RendererRD::MaterialData *RendererSceneSkyRD::_create_sky_material_func(SkyShaderData *p_shader) {
|
||||
SkyMaterialData *material_data = memnew(SkyMaterialData);
|
||||
material_data->shader_data = p_shader;
|
||||
//update will happen later anyway so do nothing.
|
||||
return material_data;
|
||||
}
|
||||
|
||||
RendererStorageRD::MaterialData *RendererSceneSkyRD::_create_sky_material_funcs(RendererStorageRD::ShaderData *p_shader) {
|
||||
RendererRD::MaterialData *RendererSceneSkyRD::_create_sky_material_funcs(RendererRD::ShaderData *p_shader) {
|
||||
// !BAS! same here, we could just make _create_sky_material_func static?
|
||||
return static_cast<RendererSceneRenderRD *>(RendererSceneRenderRD::singleton)->sky._create_sky_material_func(static_cast<SkyShaderData *>(p_shader));
|
||||
};
|
||||
@@ -797,6 +798,7 @@ RendererSceneSkyRD::RendererSceneSkyRD() {
|
||||
|
||||
void RendererSceneSkyRD::init(RendererStorageRD *p_storage) {
|
||||
RendererRD::TextureStorage *texture_storage = RendererRD::TextureStorage::get_singleton();
|
||||
RendererRD::MaterialStorage *material_storage = RendererRD::MaterialStorage::get_singleton();
|
||||
storage = p_storage;
|
||||
|
||||
{
|
||||
@@ -833,8 +835,8 @@ void RendererSceneSkyRD::init(RendererStorageRD *p_storage) {
|
||||
}
|
||||
|
||||
// register our shader funds
|
||||
storage->shader_set_data_request_function(RendererStorageRD::SHADER_TYPE_SKY, _create_sky_shader_funcs);
|
||||
storage->material_set_data_request_function(RendererStorageRD::SHADER_TYPE_SKY, _create_sky_material_funcs);
|
||||
material_storage->shader_set_data_request_function(RendererRD::SHADER_TYPE_SKY, _create_sky_shader_funcs);
|
||||
material_storage->material_set_data_request_function(RendererRD::SHADER_TYPE_SKY, _create_sky_material_funcs);
|
||||
|
||||
{
|
||||
ShaderCompiler::DefaultIdentifierActions actions;
|
||||
@@ -896,10 +898,10 @@ void RendererSceneSkyRD::init(RendererStorageRD *p_storage) {
|
||||
|
||||
{
|
||||
// default material and shader for sky shader
|
||||
sky_shader.default_shader = storage->shader_allocate();
|
||||
storage->shader_initialize(sky_shader.default_shader);
|
||||
sky_shader.default_shader = material_storage->shader_allocate();
|
||||
material_storage->shader_initialize(sky_shader.default_shader);
|
||||
|
||||
storage->shader_set_code(sky_shader.default_shader, R"(
|
||||
material_storage->shader_set_code(sky_shader.default_shader, R"(
|
||||
// Default sky shader.
|
||||
|
||||
shader_type sky;
|
||||
@@ -909,12 +911,12 @@ void sky() {
|
||||
}
|
||||
)");
|
||||
|
||||
sky_shader.default_material = storage->material_allocate();
|
||||
storage->material_initialize(sky_shader.default_material);
|
||||
sky_shader.default_material = material_storage->material_allocate();
|
||||
material_storage->material_initialize(sky_shader.default_material);
|
||||
|
||||
storage->material_set_shader(sky_shader.default_material, sky_shader.default_shader);
|
||||
material_storage->material_set_shader(sky_shader.default_material, sky_shader.default_shader);
|
||||
|
||||
SkyMaterialData *md = (SkyMaterialData *)storage->material_get_data(sky_shader.default_material, RendererStorageRD::SHADER_TYPE_SKY);
|
||||
SkyMaterialData *md = (SkyMaterialData *)material_storage->material_get_data(sky_shader.default_material, RendererRD::SHADER_TYPE_SKY);
|
||||
sky_shader.default_shader_rd = sky_shader.shader.version_get_shader(md->shader_data->version, SKY_VERSION_BACKGROUND);
|
||||
|
||||
sky_scene_state.uniform_buffer = RD::get_singleton()->uniform_buffer_create(sizeof(SkySceneState::UBO));
|
||||
@@ -947,7 +949,7 @@ void sky() {
|
||||
RD::Uniform u;
|
||||
u.uniform_type = RD::UNIFORM_TYPE_STORAGE_BUFFER;
|
||||
u.binding = 1;
|
||||
u.append_id(storage->global_variables_get_storage_buffer());
|
||||
u.append_id(RendererRD::MaterialStorage::get_singleton()->global_variables_get_storage_buffer());
|
||||
uniforms.push_back(u);
|
||||
}
|
||||
|
||||
@@ -986,10 +988,10 @@ void sky() {
|
||||
|
||||
{
|
||||
// Need defaults for using fog with clear color
|
||||
sky_scene_state.fog_shader = storage->shader_allocate();
|
||||
storage->shader_initialize(sky_scene_state.fog_shader);
|
||||
sky_scene_state.fog_shader = material_storage->shader_allocate();
|
||||
material_storage->shader_initialize(sky_scene_state.fog_shader);
|
||||
|
||||
storage->shader_set_code(sky_scene_state.fog_shader, R"(
|
||||
material_storage->shader_set_code(sky_scene_state.fog_shader, R"(
|
||||
// Default clear color sky shader.
|
||||
|
||||
shader_type sky;
|
||||
@@ -1000,10 +1002,10 @@ void sky() {
|
||||
COLOR = clear_color.rgb;
|
||||
}
|
||||
)");
|
||||
sky_scene_state.fog_material = storage->material_allocate();
|
||||
storage->material_initialize(sky_scene_state.fog_material);
|
||||
sky_scene_state.fog_material = material_storage->material_allocate();
|
||||
material_storage->material_initialize(sky_scene_state.fog_material);
|
||||
|
||||
storage->material_set_shader(sky_scene_state.fog_material, sky_scene_state.fog_shader);
|
||||
material_storage->material_set_shader(sky_scene_state.fog_material, sky_scene_state.fog_shader);
|
||||
|
||||
Vector<RD::Uniform> uniforms;
|
||||
{
|
||||
@@ -1054,7 +1056,19 @@ void RendererSceneSkyRD::set_texture_format(RD::DataFormat p_texture_format) {
|
||||
}
|
||||
|
||||
RendererSceneSkyRD::~RendererSceneSkyRD() {
|
||||
// TODO cleanup anything created in init...
|
||||
// cleanup anything created in init...
|
||||
RendererRD::MaterialStorage *material_storage = RendererRD::MaterialStorage::get_singleton();
|
||||
|
||||
SkyMaterialData *md = (SkyMaterialData *)material_storage->material_get_data(sky_shader.default_material, RendererRD::SHADER_TYPE_SKY);
|
||||
sky_shader.shader.version_free(md->shader_data->version);
|
||||
RD::get_singleton()->free(sky_scene_state.directional_light_buffer);
|
||||
RD::get_singleton()->free(sky_scene_state.uniform_buffer);
|
||||
memdelete_arr(sky_scene_state.directional_lights);
|
||||
memdelete_arr(sky_scene_state.last_frame_directional_lights);
|
||||
material_storage->shader_free(sky_shader.default_shader);
|
||||
material_storage->material_free(sky_shader.default_material);
|
||||
material_storage->shader_free(sky_scene_state.fog_shader);
|
||||
material_storage->material_free(sky_scene_state.fog_material);
|
||||
|
||||
if (RD::get_singleton()->uniform_set_is_valid(sky_scene_state.uniform_set)) {
|
||||
RD::get_singleton()->free(sky_scene_state.uniform_set);
|
||||
@@ -1072,6 +1086,7 @@ RendererSceneSkyRD::~RendererSceneSkyRD() {
|
||||
}
|
||||
|
||||
void RendererSceneSkyRD::setup(RendererSceneEnvironmentRD *p_env, RID p_render_buffers, const PagedArray<RID> &p_lights, const CameraMatrix &p_projection, const Transform3D &p_transform, const Size2i p_screen_size, RendererSceneRenderRD *p_scene_render) {
|
||||
RendererRD::MaterialStorage *material_storage = RendererRD::MaterialStorage::get_singleton();
|
||||
ERR_FAIL_COND(!p_env);
|
||||
|
||||
SkyMaterialData *material = nullptr;
|
||||
@@ -1085,7 +1100,7 @@ void RendererSceneSkyRD::setup(RendererSceneEnvironmentRD *p_env, RID p_render_b
|
||||
sky_material = sky_get_material(p_env->sky);
|
||||
|
||||
if (sky_material.is_valid()) {
|
||||
material = (SkyMaterialData *)storage->material_get_data(sky_material, RendererStorageRD::SHADER_TYPE_SKY);
|
||||
material = (SkyMaterialData *)material_storage->material_get_data(sky_material, RendererRD::SHADER_TYPE_SKY);
|
||||
if (!material || !material->shader_data->valid) {
|
||||
material = nullptr;
|
||||
}
|
||||
@@ -1093,7 +1108,7 @@ void RendererSceneSkyRD::setup(RendererSceneEnvironmentRD *p_env, RID p_render_b
|
||||
|
||||
if (!material) {
|
||||
sky_material = sky_shader.default_material;
|
||||
material = (SkyMaterialData *)storage->material_get_data(sky_material, RendererStorageRD::SHADER_TYPE_SKY);
|
||||
material = (SkyMaterialData *)material_storage->material_get_data(sky_material, RendererRD::SHADER_TYPE_SKY);
|
||||
}
|
||||
|
||||
ERR_FAIL_COND(!material);
|
||||
@@ -1282,6 +1297,7 @@ void RendererSceneSkyRD::setup(RendererSceneEnvironmentRD *p_env, RID p_render_b
|
||||
}
|
||||
|
||||
void RendererSceneSkyRD::update(RendererSceneEnvironmentRD *p_env, const CameraMatrix &p_projection, const Transform3D &p_transform, double p_time, float p_luminance_multiplier) {
|
||||
RendererRD::MaterialStorage *material_storage = RendererRD::MaterialStorage::get_singleton();
|
||||
ERR_FAIL_COND(!p_env);
|
||||
|
||||
Sky *sky = get_sky(p_env->sky);
|
||||
@@ -1292,7 +1308,7 @@ void RendererSceneSkyRD::update(RendererSceneEnvironmentRD *p_env, const CameraM
|
||||
SkyMaterialData *material = nullptr;
|
||||
|
||||
if (sky_material.is_valid()) {
|
||||
material = (SkyMaterialData *)storage->material_get_data(sky_material, RendererStorageRD::SHADER_TYPE_SKY);
|
||||
material = (SkyMaterialData *)material_storage->material_get_data(sky_material, RendererRD::SHADER_TYPE_SKY);
|
||||
if (!material || !material->shader_data->valid) {
|
||||
material = nullptr;
|
||||
}
|
||||
@@ -1300,7 +1316,7 @@ void RendererSceneSkyRD::update(RendererSceneEnvironmentRD *p_env, const CameraM
|
||||
|
||||
if (!material) {
|
||||
sky_material = sky_shader.default_material;
|
||||
material = (SkyMaterialData *)storage->material_get_data(sky_material, RendererStorageRD::SHADER_TYPE_SKY);
|
||||
material = (SkyMaterialData *)material_storage->material_get_data(sky_material, RendererRD::SHADER_TYPE_SKY);
|
||||
}
|
||||
|
||||
ERR_FAIL_COND(!material);
|
||||
@@ -1450,6 +1466,7 @@ void RendererSceneSkyRD::update(RendererSceneEnvironmentRD *p_env, const CameraM
|
||||
}
|
||||
|
||||
void RendererSceneSkyRD::draw(RendererSceneEnvironmentRD *p_env, bool p_can_continue_color, bool p_can_continue_depth, RID p_fb, uint32_t p_view_count, const CameraMatrix *p_projections, const Transform3D &p_transform, double p_time) {
|
||||
RendererRD::MaterialStorage *material_storage = RendererRD::MaterialStorage::get_singleton();
|
||||
ERR_FAIL_COND(!p_env);
|
||||
|
||||
ERR_FAIL_COND(p_view_count == 0);
|
||||
@@ -1467,7 +1484,7 @@ void RendererSceneSkyRD::draw(RendererSceneEnvironmentRD *p_env, bool p_can_cont
|
||||
sky_material = sky_get_material(p_env->sky);
|
||||
|
||||
if (sky_material.is_valid()) {
|
||||
material = (SkyMaterialData *)storage->material_get_data(sky_material, RendererStorageRD::SHADER_TYPE_SKY);
|
||||
material = (SkyMaterialData *)material_storage->material_get_data(sky_material, RendererRD::SHADER_TYPE_SKY);
|
||||
if (!material || !material->shader_data->valid) {
|
||||
material = nullptr;
|
||||
}
|
||||
@@ -1475,13 +1492,13 @@ void RendererSceneSkyRD::draw(RendererSceneEnvironmentRD *p_env, bool p_can_cont
|
||||
|
||||
if (!material) {
|
||||
sky_material = sky_shader.default_material;
|
||||
material = (SkyMaterialData *)storage->material_get_data(sky_material, RendererStorageRD::SHADER_TYPE_SKY);
|
||||
material = (SkyMaterialData *)material_storage->material_get_data(sky_material, RendererRD::SHADER_TYPE_SKY);
|
||||
}
|
||||
}
|
||||
|
||||
if (background == RS::ENV_BG_CLEAR_COLOR || background == RS::ENV_BG_COLOR) {
|
||||
sky_material = sky_scene_state.fog_material;
|
||||
material = (SkyMaterialData *)storage->material_get_data(sky_material, RendererStorageRD::SHADER_TYPE_SKY);
|
||||
material = (SkyMaterialData *)material_storage->material_get_data(sky_material, RendererRD::SHADER_TYPE_SKY);
|
||||
}
|
||||
|
||||
ERR_FAIL_COND(!material);
|
||||
@@ -1556,6 +1573,7 @@ void RendererSceneSkyRD::draw(RendererSceneEnvironmentRD *p_env, bool p_can_cont
|
||||
}
|
||||
|
||||
void RendererSceneSkyRD::update_res_buffers(RendererSceneEnvironmentRD *p_env, uint32_t p_view_count, const CameraMatrix *p_projections, const Transform3D &p_transform, double p_time, float p_luminance_multiplier) {
|
||||
RendererRD::MaterialStorage *material_storage = RendererRD::MaterialStorage::get_singleton();
|
||||
ERR_FAIL_COND(!p_env);
|
||||
|
||||
ERR_FAIL_COND(p_view_count == 0);
|
||||
@@ -1570,7 +1588,7 @@ void RendererSceneSkyRD::update_res_buffers(RendererSceneEnvironmentRD *p_env, u
|
||||
sky_material = sky_get_material(p_env->sky);
|
||||
|
||||
if (sky_material.is_valid()) {
|
||||
material = (SkyMaterialData *)storage->material_get_data(sky_material, RendererStorageRD::SHADER_TYPE_SKY);
|
||||
material = (SkyMaterialData *)material_storage->material_get_data(sky_material, RendererRD::SHADER_TYPE_SKY);
|
||||
if (!material || !material->shader_data->valid) {
|
||||
material = nullptr;
|
||||
}
|
||||
@@ -1578,7 +1596,7 @@ void RendererSceneSkyRD::update_res_buffers(RendererSceneEnvironmentRD *p_env, u
|
||||
|
||||
if (!material) {
|
||||
sky_material = sky_shader.default_material;
|
||||
material = (SkyMaterialData *)storage->material_get_data(sky_material, RendererStorageRD::SHADER_TYPE_SKY);
|
||||
material = (SkyMaterialData *)material_storage->material_get_data(sky_material, RendererRD::SHADER_TYPE_SKY);
|
||||
}
|
||||
|
||||
ERR_FAIL_COND(!material);
|
||||
@@ -1640,6 +1658,7 @@ void RendererSceneSkyRD::update_res_buffers(RendererSceneEnvironmentRD *p_env, u
|
||||
}
|
||||
|
||||
void RendererSceneSkyRD::draw(RD::DrawListID p_draw_list, RendererSceneEnvironmentRD *p_env, RID p_fb, uint32_t p_view_count, const CameraMatrix *p_projections, const Transform3D &p_transform, double p_time, float p_luminance_multiplier) {
|
||||
RendererRD::MaterialStorage *material_storage = RendererRD::MaterialStorage::get_singleton();
|
||||
ERR_FAIL_COND(!p_env);
|
||||
|
||||
ERR_FAIL_COND(p_view_count == 0);
|
||||
@@ -1657,7 +1676,7 @@ void RendererSceneSkyRD::draw(RD::DrawListID p_draw_list, RendererSceneEnvironme
|
||||
sky_material = sky_get_material(p_env->sky);
|
||||
|
||||
if (sky_material.is_valid()) {
|
||||
material = (SkyMaterialData *)storage->material_get_data(sky_material, RendererStorageRD::SHADER_TYPE_SKY);
|
||||
material = (SkyMaterialData *)material_storage->material_get_data(sky_material, RendererRD::SHADER_TYPE_SKY);
|
||||
if (!material || !material->shader_data->valid) {
|
||||
material = nullptr;
|
||||
}
|
||||
@@ -1665,13 +1684,13 @@ void RendererSceneSkyRD::draw(RD::DrawListID p_draw_list, RendererSceneEnvironme
|
||||
|
||||
if (!material) {
|
||||
sky_material = sky_shader.default_material;
|
||||
material = (SkyMaterialData *)storage->material_get_data(sky_material, RendererStorageRD::SHADER_TYPE_SKY);
|
||||
material = (SkyMaterialData *)material_storage->material_get_data(sky_material, RendererRD::SHADER_TYPE_SKY);
|
||||
}
|
||||
}
|
||||
|
||||
if (background == RS::ENV_BG_CLEAR_COLOR || background == RS::ENV_BG_COLOR) {
|
||||
sky_material = sky_scene_state.fog_material;
|
||||
material = (SkyMaterialData *)storage->material_get_data(sky_material, RendererStorageRD::SHADER_TYPE_SKY);
|
||||
material = (SkyMaterialData *)material_storage->material_get_data(sky_material, RendererRD::SHADER_TYPE_SKY);
|
||||
}
|
||||
|
||||
ERR_FAIL_COND(!material);
|
||||
|
||||
Reference in New Issue
Block a user