summaryrefslogtreecommitdiff
path: root/drivers/gles3/rasterizer_gles3.cpp
diff options
context:
space:
mode:
authorclayjohn <claynjohn@gmail.com>2021-11-16 07:25:42 -0800
committerclayjohn <claynjohn@gmail.com>2022-01-11 22:26:18 -0800
commit99064d57db563f85f0585aac3fa056b980b63cfe (patch)
treee0e4aa8e76668cb8399f7c8452a8bad443396c63 /drivers/gles3/rasterizer_gles3.cpp
parent98ac002c3430b1ff50052b19d16fe6fa8fecf0c3 (diff)
New OpenGL batching canvas renderer
Diffstat (limited to 'drivers/gles3/rasterizer_gles3.cpp')
-rw-r--r--drivers/gles3/rasterizer_gles3.cpp71
1 files changed, 25 insertions, 46 deletions
diff --git a/drivers/gles3/rasterizer_gles3.cpp b/drivers/gles3/rasterizer_gles3.cpp
index 5f103c34eb..32ead8aa7e 100644
--- a/drivers/gles3/rasterizer_gles3.cpp
+++ b/drivers/gles3/rasterizer_gles3.cpp
@@ -30,8 +30,7 @@
#include "rasterizer_gles3.h"
-#ifdef GLES3_BACKEND_ENABLED
-#include "shader_old_gles3.h"
+#ifdef GLES3_ENABLED
#include "core/config/project_settings.h"
#include "core/os/os.h"
@@ -91,21 +90,12 @@ void RasterizerGLES3::begin_frame(double frame_step) {
frame++;
delta = frame_step;
- // from 3.2
- time_total += frame_step * time_scale;
-
- if (frame_step == 0) {
- //to avoid hiccups
- frame_step = 0.001;
- }
+ time_total += 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[0] = time_total;
- storage.frame.time[1] = Math::fmod(time_total, 3600);
- storage.frame.time[2] = Math::fmod(time_total, 900);
- storage.frame.time[3] = Math::fmod(time_total, 60);
+ storage.frame.time = time_total;
storage.frame.count++;
storage.frame.delta = frame_step;
@@ -131,10 +121,11 @@ void RasterizerGLES3::end_frame(bool p_swap_buffers) {
// glClearColor(1, 0, 0, 1);
// glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_ACCUM_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
- if (p_swap_buffers)
+ if (p_swap_buffers) {
DisplayServer::get_singleton()->swap_buffers();
- else
+ } else {
glFinish();
+ }
}
#ifdef CAN_DEBUG
@@ -272,32 +263,22 @@ RasterizerGLES3::RasterizerGLES3() {
void RasterizerGLES3::prepare_for_blitting_render_targets() {
}
-void RasterizerGLES3::_blit_render_target_to_screen(RID p_render_target, const Rect2 &p_screen_rect) {
+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);
- // print_line("_blit_render_target_to_screen " + itos (p_screen) + ", rect " + String(Variant(p_screen_rect)));
-
RasterizerStorageGLES3::RenderTarget *rt = storage.render_target_owner.get_or_null(p_render_target);
ERR_FAIL_COND(!rt);
- canvas._set_texture_rect_mode(true);
- canvas.state.canvas_shader.set_custom_shader(0);
- canvas.state.canvas_shader.bind();
-
- canvas.canvas_begin();
+ // TODO: do we need a keep 3d linear option?
- glDisable(GL_BLEND);
- storage.bind_framebuffer_system();
- glActiveTexture(GL_TEXTURE0 + storage.config.max_texture_image_units - 1);
if (rt->external.fbo != 0) {
- glBindTexture(GL_TEXTURE_2D, rt->external.color);
+ glBindFramebuffer(GL_READ_FRAMEBUFFER, rt->external.fbo);
} else {
- glBindTexture(GL_TEXTURE_2D, rt->color);
+ glBindFramebuffer(GL_READ_FRAMEBUFFER, rt->fbo);
}
- canvas.draw_generic_textured_rect(p_screen_rect, Rect2(0, 0, 1, -1));
- glBindTexture(GL_TEXTURE_2D, 0);
-
- canvas.canvas_end();
+ glReadBuffer(GL_COLOR_ATTACHMENT0);
+ glBindFramebuffer(GL_DRAW_FRAMEBUFFER, RasterizerStorageGLES3::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?
@@ -313,7 +294,7 @@ void RasterizerGLES3::blit_render_targets_to_screen(DisplayServer::WindowID p_sc
RID rid_rt = blit.render_target;
Rect2 dst_rect = blit.dst_rect;
- _blit_render_target_to_screen(rid_rt, dst_rect);
+ _blit_render_target_to_screen(rid_rt, p_screen, dst_rect);
}
}
@@ -321,11 +302,10 @@ void RasterizerGLES3::set_boot_image(const Ref<Image> &p_image, const Color &p_c
if (p_image.is_null() || p_image->is_empty())
return;
- int window_w = 640; //OS::get_singleton()->get_video_mode(0).width;
- int window_h = 480; //OS::get_singleton()->get_video_mode(0).height;
+ Size2i win_size = DisplayServer::get_singleton()->screen_get_size();
glBindFramebuffer(GL_FRAMEBUFFER, 0);
- glViewport(0, 0, window_w, window_h);
+ glViewport(0, 0, win_size.width, win_size.height);
glDisable(GL_BLEND);
glDepthMask(GL_FALSE);
if (false) {
@@ -346,27 +326,26 @@ void RasterizerGLES3::set_boot_image(const Ref<Image> &p_image, const Color &p_c
Rect2 imgrect(0, 0, p_image->get_width(), p_image->get_height());
Rect2 screenrect;
if (p_scale) {
- if (window_w > window_h) {
+ if (win_size.width > win_size.height) {
//scale horizontally
- screenrect.size.y = window_h;
- screenrect.size.x = imgrect.size.x * window_h / imgrect.size.y;
- screenrect.position.x = (window_w - screenrect.size.x) / 2;
+ screenrect.size.y = win_size.height;
+ screenrect.size.x = imgrect.size.x * win_size.height / imgrect.size.y;
+ screenrect.position.x = (win_size.width - screenrect.size.x) / 2;
} else {
//scale vertically
- screenrect.size.x = window_w;
- screenrect.size.y = imgrect.size.y * window_w / imgrect.size.x;
- screenrect.position.y = (window_h - screenrect.size.y) / 2;
+ screenrect.size.x = win_size.width;
+ screenrect.size.y = imgrect.size.y * win_size.width / imgrect.size.x;
+ screenrect.position.y = (win_size.height - screenrect.size.y) / 2;
}
} else {
screenrect = imgrect;
- screenrect.position += ((Size2(window_w, window_h) - screenrect.size) / 2.0).floor();
+ screenrect.position += ((Size2(win_size.width, win_size.height) - screenrect.size) / 2.0).floor();
}
RasterizerStorageGLES3::Texture *t = storage.texture_owner.get_or_null(texture);
glActiveTexture(GL_TEXTURE0 + storage.config.max_texture_image_units - 1);
glBindTexture(GL_TEXTURE_2D, t->tex_id);
- canvas.draw_generic_textured_rect(screenrect, Rect2(0, 0, 1, 1));
glBindTexture(GL_TEXTURE_2D, 0);
canvas.canvas_end();
@@ -375,4 +354,4 @@ void RasterizerGLES3::set_boot_image(const Ref<Image> &p_image, const Color &p_c
end_frame(true);
}
-#endif // GLES3_BACKEND_ENABLED
+#endif // GLES3_ENABLED