Skip to content

Commit

Permalink
Merge pull request #59984 from BastiaanOlij/more_storage_20220407
Browse files Browse the repository at this point in the history
More work on splitting up RendererStorage
  • Loading branch information
clayjohn authored Apr 19, 2022
2 parents 5905993 + 0b4fd92 commit 1d21779
Show file tree
Hide file tree
Showing 65 changed files with 9,300 additions and 9,045 deletions.
46 changes: 26 additions & 20 deletions drivers/gles3/rasterizer_canvas_gles3.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -38,9 +38,9 @@

#include "core/config/project_settings.h"
#include "servers/rendering/rendering_server_default.h"
#include "storage/canvas_texture_storage.h"
#include "storage/config.h"
#include "storage/material_storage.h"
#include "storage/texture_storage.h"

#ifndef GLES_OVER_GL
#define glClearDepth glClearDepthf
Expand Down Expand Up @@ -116,9 +116,11 @@ void RasterizerCanvasGLES3::_update_transform_to_mat4(const Transform3D &p_trans
}

void RasterizerCanvasGLES3::canvas_render_items(RID p_to_render_target, Item *p_item_list, const Color &p_modulate, Light *p_light_list, Light *p_directional_list, const Transform2D &p_canvas_transform, RS::CanvasItemTextureFilter p_default_filter, RS::CanvasItemTextureRepeat p_default_repeat, bool p_snap_2d_vertices_to_pixel, bool &r_sdf_used) {
storage->frame.current_rt = nullptr;
GLES3::TextureStorage *texture_storage = GLES3::TextureStorage::get_singleton();

texture_storage->frame.current_rt = nullptr;

storage->_set_current_render_target(p_to_render_target);
texture_storage->_set_current_render_target(p_to_render_target);

Transform2D canvas_transform_inverse = p_canvas_transform.affine_inverse();

Expand All @@ -130,7 +132,7 @@ void RasterizerCanvasGLES3::canvas_render_items(RID p_to_render_target, Item *p_
//update canvas state uniform buffer
StateBuffer state_buffer;

Size2i ssize = storage->render_target_get_size(p_to_render_target);
Size2i ssize = texture_storage->render_target_get_size(p_to_render_target);

Transform3D screen_transform;
screen_transform.translate(-(ssize.width / 2.0f), -(ssize.height / 2.0f), 0.0f);
Expand All @@ -149,11 +151,11 @@ void RasterizerCanvasGLES3::canvas_render_items(RID p_to_render_target, Item *p_
state_buffer.canvas_modulate[2] = p_modulate.b;
state_buffer.canvas_modulate[3] = p_modulate.a;

Size2 render_target_size = storage->render_target_get_size(p_to_render_target);
Size2 render_target_size = texture_storage->render_target_get_size(p_to_render_target);
state_buffer.screen_pixel_size[0] = 1.0 / render_target_size.x;
state_buffer.screen_pixel_size[1] = 1.0 / render_target_size.y;

state_buffer.time = storage->frame.time;
state_buffer.time = texture_storage->frame.time;
state_buffer.use_pixel_snap = p_snap_2d_vertices_to_pixel;

state_buffer.directional_light_count = 0; //directional_light_count;
Expand All @@ -166,7 +168,7 @@ void RasterizerCanvasGLES3::canvas_render_items(RID p_to_render_target, Item *p_
state_buffer.screen_to_sdf[0] = 1.0 / state_buffer.sdf_to_screen[0];
state_buffer.screen_to_sdf[1] = 1.0 / state_buffer.sdf_to_screen[1];

Rect2 sdf_rect = storage->render_target_get_sdf_rect(p_to_render_target);
Rect2 sdf_rect = texture_storage->render_target_get_sdf_rect(p_to_render_target);
Rect2 sdf_tex_rect(sdf_rect.position / canvas_scale, sdf_rect.size / canvas_scale);

state_buffer.sdf_to_tex[0] = 1.0 / sdf_tex_rect.size.width;
Expand Down Expand Up @@ -881,19 +883,21 @@ void RasterizerCanvasGLES3::update() {
}

void RasterizerCanvasGLES3::canvas_begin() {
GLES3::TextureStorage *texture_storage = GLES3::TextureStorage::get_singleton();

state.using_transparent_rt = false;

if (storage->frame.current_rt) {
storage->bind_framebuffer(storage->frame.current_rt->fbo);
state.using_transparent_rt = storage->frame.current_rt->flags[RendererStorage::RENDER_TARGET_TRANSPARENT];
if (texture_storage->frame.current_rt) {
glBindFramebuffer(GL_FRAMEBUFFER, texture_storage->frame.current_rt->fbo);
state.using_transparent_rt = texture_storage->frame.current_rt->flags[GLES3::TextureStorage::RENDER_TARGET_TRANSPARENT];
}

if (storage->frame.current_rt && storage->frame.current_rt->clear_requested) {
const Color &col = storage->frame.current_rt->clear_color;
if (texture_storage->frame.current_rt && texture_storage->frame.current_rt->clear_requested) {
const Color &col = texture_storage->frame.current_rt->clear_color;
glClearColor(col.r, col.g, col.b, col.a);

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
storage->frame.current_rt->clear_requested = false;
texture_storage->frame.current_rt->clear_requested = false;
}

reset_canvas();
Expand Down Expand Up @@ -934,7 +938,7 @@ void RasterizerCanvasGLES3::_bind_canvas_texture(RID p_texture, RS::CanvasItemTe

ct = t->canvas_texture;
} else {
ct = GLES3::CanvasTextureStorage::get_singleton()->get_canvas_texture(p_texture);
ct = GLES3::TextureStorage::get_singleton()->get_canvas_texture(p_texture);
}

if (!ct) {
Expand Down Expand Up @@ -1041,6 +1045,8 @@ void RasterizerCanvasGLES3::_set_uniforms() {
}

void RasterizerCanvasGLES3::reset_canvas() {
GLES3::TextureStorage *texture_storage = GLES3::TextureStorage::get_singleton();

glDisable(GL_CULL_FACE);
glDisable(GL_DEPTH_TEST);
glDisable(GL_SCISSOR_TEST);
Expand All @@ -1049,7 +1055,7 @@ void RasterizerCanvasGLES3::reset_canvas() {

// Default to Mix.
glBlendEquation(GL_FUNC_ADD);
if (storage->frame.current_rt && storage->frame.current_rt->flags[RendererStorage::RENDER_TARGET_TRANSPARENT]) {
if (texture_storage->frame.current_rt && texture_storage->frame.current_rt->flags[GLES3::TextureStorage::RENDER_TARGET_TRANSPARENT]) {
glBlendFuncSeparate(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
} else {
glBlendFuncSeparate(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_ZERO, GL_ONE);
Expand Down Expand Up @@ -1255,7 +1261,7 @@ void RasterizerCanvasGLES3::_allocate_instance_data_buffer() {
}

void RasterizerCanvasGLES3::initialize() {
GLES3::CanvasTextureStorage *canvas_texture_storage = GLES3::CanvasTextureStorage::get_singleton();
GLES3::TextureStorage *texture_storage = GLES3::TextureStorage::get_singleton();
GLES3::MaterialStorage *material_storage = GLES3::MaterialStorage::get_singleton();

// quad buffer
Expand Down Expand Up @@ -1450,8 +1456,8 @@ void fragment() {
material_storage->material_set_shader(default_canvas_group_material, default_canvas_group_shader);
}

default_canvas_texture = canvas_texture_storage->canvas_texture_allocate();
canvas_texture_storage->canvas_texture_initialize(default_canvas_texture);
default_canvas_texture = texture_storage->canvas_texture_allocate();
texture_storage->canvas_texture_initialize(default_canvas_texture);

state.using_light = nullptr;
state.using_transparent_rt = false;
Expand All @@ -1470,13 +1476,13 @@ RasterizerCanvasGLES3::RasterizerCanvasGLES3() {
}

RasterizerCanvasGLES3::~RasterizerCanvasGLES3() {
GLES3::CanvasTextureStorage *canvas_texture_storage = GLES3::CanvasTextureStorage::get_singleton();
GLES3::TextureStorage *texture_storage = GLES3::TextureStorage::get_singleton();
GLES3::MaterialStorage *material_storage = GLES3::MaterialStorage::get_singleton();

state.canvas_shader.version_free(state.canvas_shader_default_version);
material_storage->material_free(default_canvas_group_material);
material_storage->shader_free(default_canvas_group_shader);
canvas_texture_storage->canvas_texture_free(default_canvas_texture);
texture_storage->canvas_texture_free(default_canvas_texture);
singleton = nullptr;
}

Expand Down
1 change: 0 additions & 1 deletion drivers/gles3/rasterizer_canvas_gles3.h
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,6 @@
#include "rasterizer_storage_gles3.h"
#include "servers/rendering/renderer_canvas_render.h"
#include "servers/rendering/renderer_compositor.h"
#include "storage/canvas_texture_storage.h"
#include "storage/material_storage.h"
#include "storage/texture_storage.h"

Expand Down
21 changes: 13 additions & 8 deletions drivers/gles3/rasterizer_gles3.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@

#include "core/config/project_settings.h"
#include "core/os/os.h"
#include "storage/texture_storage.h"

#define _EXT_DEBUG_OUTPUT_SYNCHRONOUS_ARB 0x8242
#define _EXT_DEBUG_NEXT_LOGGED_MESSAGE_LENGTH_ARB 0x8243
Expand Down Expand Up @@ -87,6 +88,8 @@
#endif

void RasterizerGLES3::begin_frame(double frame_step) {
GLES3::TextureStorage *texture_storage = GLES3::TextureStorage::get_singleton();

frame++;
delta = frame_step;

Expand All @@ -95,9 +98,9 @@ void RasterizerGLES3::begin_frame(double frame_step) {
double time_roll_over = GLOBAL_GET("rendering/limits/time/time_rollover_secs");
time_total = Math::fmod(time_total, time_roll_over);

storage.frame.time = time_total;
storage.frame.count++;
storage.frame.delta = frame_step;
texture_storage->frame.time = time_total;
texture_storage->frame.count++;
texture_storage->frame.delta = frame_step;

storage.update_dirty_resources();

Expand Down Expand Up @@ -269,9 +272,10 @@ void RasterizerGLES3::prepare_for_blitting_render_targets() {
}

void RasterizerGLES3::_blit_render_target_to_screen(RID p_render_target, DisplayServer::WindowID p_screen, const Rect2 &p_screen_rect) {
ERR_FAIL_COND(storage.frame.current_rt);
GLES3::TextureStorage *texture_storage = GLES3::TextureStorage::get_singleton();
ERR_FAIL_COND(texture_storage->frame.current_rt);

GLES3::RenderTarget *rt = storage.render_target_owner.get_or_null(p_render_target);
GLES3::RenderTarget *rt = texture_storage->get_render_target(p_render_target);
ERR_FAIL_COND(!rt);

// TODO: do we need a keep 3d linear option?
Expand All @@ -282,16 +286,17 @@ void RasterizerGLES3::_blit_render_target_to_screen(RID p_render_target, Display
glBindFramebuffer(GL_READ_FRAMEBUFFER, rt->fbo);
}
glReadBuffer(GL_COLOR_ATTACHMENT0);
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, RasterizerStorageGLES3::system_fbo);
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, GLES3::TextureStorage::system_fbo);
glBlitFramebuffer(0, 0, rt->width, rt->height, 0, p_screen_rect.size.y, p_screen_rect.size.x, 0, GL_COLOR_BUFFER_BIT, GL_NEAREST);
}

// is this p_screen useless in a multi window environment?
void RasterizerGLES3::blit_render_targets_to_screen(DisplayServer::WindowID p_screen, const BlitToScreen *p_render_targets, int p_amount) {
// do this once off for all blits
storage.bind_framebuffer_system();
GLES3::TextureStorage *texture_storage = GLES3::TextureStorage::get_singleton();
glBindFramebuffer(GL_FRAMEBUFFER, GLES3::TextureStorage::system_fbo);

storage.frame.current_rt = nullptr;
texture_storage->frame.current_rt = nullptr;

for (int i = 0; i < p_amount; i++) {
const BlitToScreen &blit = p_render_targets[i];
Expand Down
13 changes: 6 additions & 7 deletions drivers/gles3/rasterizer_gles3.h
Original file line number Diff line number Diff line change
Expand Up @@ -37,12 +37,11 @@
#include "rasterizer_scene_gles3.h"
#include "rasterizer_storage_gles3.h"
#include "servers/rendering/renderer_compositor.h"
#include "storage/canvas_texture_storage.h"
#include "storage/config.h"
#include "storage/decal_atlas_storage.h"
#include "storage/light_storage.h"
#include "storage/material_storage.h"
#include "storage/mesh_storage.h"
#include "storage/render_target_storage.h"
#include "storage/particles_storage.h"
#include "storage/texture_storage.h"

class RasterizerGLES3 : public RendererCompositor {
Expand All @@ -54,23 +53,23 @@ class RasterizerGLES3 : public RendererCompositor {

protected:
GLES3::Config config;
GLES3::CanvasTextureStorage canvas_texture_storage;
GLES3::TextureStorage texture_storage;
GLES3::DecalAtlasStorage decal_atlas_storage;
GLES3::MaterialStorage material_storage;
GLES3::MeshStorage mesh_storage;
GLES3::ParticlesStorage particles_storage;
GLES3::LightStorage light_storage;
RasterizerStorageGLES3 storage;
RasterizerCanvasGLES3 canvas;
RasterizerSceneGLES3 scene;

void _blit_render_target_to_screen(RID p_render_target, DisplayServer::WindowID p_screen, const Rect2 &p_screen_rect);

public:
RendererCanvasTextureStorage *get_canvas_texture_storage() { return &canvas_texture_storage; }
RendererLightStorage *get_light_storage() { return &light_storage; }
RendererMaterialStorage *get_material_storage() { return &material_storage; }
RendererMeshStorage *get_mesh_storage() { return &mesh_storage; }
RendererParticlesStorage *get_particles_storage() { return &particles_storage; }
RendererTextureStorage *get_texture_storage() { return &texture_storage; }
RendererDecalAtlasStorage *get_decal_atlas_storage() { return &decal_atlas_storage; }
RendererStorage *get_storage() { return &storage; }
RendererCanvasRender *get_canvas() { return &canvas; }
RendererSceneRender *get_scene() { return &scene; }
Expand Down
Loading

0 comments on commit 1d21779

Please sign in to comment.