diff options
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/gles3/rasterizer_canvas_gles3.cpp | 5 | ||||
-rw-r--r-- | drivers/gles3/rasterizer_gles3.cpp | 20 | ||||
-rw-r--r-- | drivers/gles3/rasterizer_gles3.h | 4 | ||||
-rw-r--r-- | drivers/gles3/shaders/sky.glsl | 10 | ||||
-rw-r--r-- | drivers/gles3/storage/material_storage.cpp | 3 |
5 files changed, 25 insertions, 17 deletions
diff --git a/drivers/gles3/rasterizer_canvas_gles3.cpp b/drivers/gles3/rasterizer_canvas_gles3.cpp index 2703d77167..2f7e68e463 100644 --- a/drivers/gles3/rasterizer_canvas_gles3.cpp +++ b/drivers/gles3/rasterizer_canvas_gles3.cpp @@ -115,7 +115,7 @@ void RasterizerCanvasGLES3::canvas_render_items(RID p_to_render_target, Item *p_ if (state.canvas_instance_data_buffers[state.current_data_buffer_index].fence != GLsync()) { GLint syncStatus; - glGetSynciv(state.canvas_instance_data_buffers[state.current_data_buffer_index].fence, GL_SYNC_STATUS, sizeof(GLint), nullptr, &syncStatus); + glGetSynciv(state.canvas_instance_data_buffers[state.current_data_buffer_index].fence, GL_SYNC_STATUS, 1, nullptr, &syncStatus); if (syncStatus == GL_UNSIGNALED) { // If older than 2 frames, wait for sync OpenGL can have up to 3 frames in flight, any more and we need to sync anyway. if (state.canvas_instance_data_buffers[state.current_data_buffer_index].last_frame_used < RSG::rasterizer->get_frame_number() - 2) { @@ -1950,11 +1950,12 @@ void RasterizerCanvasGLES3::occluder_polygon_set_shape(RID p_occluder, const Vec glBufferData(GL_ELEMENT_ARRAY_BUFFER, 3 * lc * sizeof(uint16_t), indices.ptr(), GL_STATIC_DRAW); glBindVertexArray(0); } else { - glBindVertexArray(oc->vertex_array); glBindBuffer(GL_ARRAY_BUFFER, oc->vertex_buffer); glBufferData(GL_ARRAY_BUFFER, lc * 6 * sizeof(float), geometry.ptr(), GL_STATIC_DRAW); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, oc->index_buffer); glBufferData(GL_ELEMENT_ARRAY_BUFFER, 3 * lc * sizeof(uint16_t), indices.ptr(), GL_STATIC_DRAW); + glBindBuffer(GL_ARRAY_BUFFER, 0); + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); } } diff --git a/drivers/gles3/rasterizer_gles3.cpp b/drivers/gles3/rasterizer_gles3.cpp index 600aa908cc..7cbce428cb 100644 --- a/drivers/gles3/rasterizer_gles3.cpp +++ b/drivers/gles3/rasterizer_gles3.cpp @@ -198,7 +198,11 @@ void RasterizerGLES3::finalize() { memdelete(config); } +RasterizerGLES3 *RasterizerGLES3::singleton = nullptr; + RasterizerGLES3::RasterizerGLES3() { + singleton = this; + #ifdef GLAD_ENABLED if (!gladLoaderLoadGL()) { ERR_PRINT("Error initializing GLAD"); @@ -281,7 +285,7 @@ void RasterizerGLES3::prepare_for_blitting_render_targets() { utils->capture_timestamps_end(); } -void RasterizerGLES3::_blit_render_target_to_screen(RID p_render_target, DisplayServer::WindowID p_screen, const Rect2 &p_screen_rect, uint32_t p_layer) { +void RasterizerGLES3::_blit_render_target_to_screen(RID p_render_target, DisplayServer::WindowID p_screen, const Rect2 &p_screen_rect, uint32_t p_layer, bool p_first) { GLES3::RenderTarget *rt = GLES3::TextureStorage::get_singleton()->get_render_target(p_render_target); ERR_FAIL_COND(!rt); @@ -307,12 +311,14 @@ void RasterizerGLES3::_blit_render_target_to_screen(RID p_render_target, Display glReadBuffer(GL_COLOR_ATTACHMENT0); glBindFramebuffer(GL_DRAW_FRAMEBUFFER, GLES3::TextureStorage::system_fbo); - if (p_screen_rect.position != Vector2()) { - // Viewport doesn't cover entire window so clear window to black before blitting. + if (p_first) { Size2i win_size = DisplayServer::get_singleton()->window_get_size(); - glViewport(0, 0, win_size.width, win_size.height); - glClearColor(0.0, 0.0, 0.0, 1.0); - glClear(GL_COLOR_BUFFER_BIT); + if (p_screen_rect.position != Vector2() || p_screen_rect.size != rt->size) { + // Viewport doesn't cover entire window so clear window to black before blitting. + glViewport(0, 0, win_size.width, win_size.height); + glClearColor(0.0, 0.0, 0.0, 1.0); + glClear(GL_COLOR_BUFFER_BIT); + } } Vector2i screen_rect_end = p_screen_rect.get_end(); @@ -334,7 +340,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, p_screen, dst_rect, blit.multi_view.use_layer ? blit.multi_view.layer : 0); + _blit_render_target_to_screen(rid_rt, p_screen, dst_rect, blit.multi_view.use_layer ? blit.multi_view.layer : 0, i == 0); } } diff --git a/drivers/gles3/rasterizer_gles3.h b/drivers/gles3/rasterizer_gles3.h index 446c6af338..e29ccefdbd 100644 --- a/drivers/gles3/rasterizer_gles3.h +++ b/drivers/gles3/rasterizer_gles3.h @@ -67,8 +67,9 @@ protected: GLES3::CopyEffects *copy_effects = nullptr; RasterizerCanvasGLES3 *canvas = nullptr; RasterizerSceneGLES3 *scene = nullptr; + static RasterizerGLES3 *singleton; - void _blit_render_target_to_screen(RID p_render_target, DisplayServer::WindowID p_screen, const Rect2 &p_screen_rect, uint32_t p_layer); + void _blit_render_target_to_screen(RID p_render_target, DisplayServer::WindowID p_screen, const Rect2 &p_screen_rect, uint32_t p_layer, bool p_first = true); public: RendererUtilities *get_utilities() { return utilities; } @@ -107,6 +108,7 @@ public: _ALWAYS_INLINE_ double get_frame_delta_time() const { return delta; } _ALWAYS_INLINE_ double get_total_time() const { return time_total; } + static RasterizerGLES3 *get_singleton() { return singleton; } RasterizerGLES3(); ~RasterizerGLES3(); }; diff --git a/drivers/gles3/shaders/sky.glsl b/drivers/gles3/shaders/sky.glsl index e59bca8b07..2455ffb8e2 100644 --- a/drivers/gles3/shaders/sky.glsl +++ b/drivers/gles3/shaders/sky.glsl @@ -21,12 +21,13 @@ out vec2 uv_interp; /* clang-format on */ void main() { - uv_interp = vertex_attrib; #ifdef USE_INVERTED_Y - gl_Position = vec4(uv_interp, 1.0, 1.0); + uv_interp = vertex_attrib; #else - gl_Position = vec4(uv_interp.x, uv_interp.y * -1.0, 1.0, 1.0); + // We're doing clockwise culling so flip the order + uv_interp = vec2(vertex_attrib.x, vertex_attrib.y * -1.0); #endif + gl_Position = vec4(uv_interp, 1.0, 1.0); } /* clang-format off */ @@ -145,9 +146,6 @@ void main() { cube_normal.x = (uv_interp.x + projection.x) / projection.y; cube_normal.y = (-uv_interp.y - projection.z) / projection.w; #endif -#ifndef USE_INVERTED_Y - cube_normal.y *= -1.0; -#endif cube_normal = mat3(orientation) * cube_normal; cube_normal = normalize(cube_normal); diff --git a/drivers/gles3/storage/material_storage.cpp b/drivers/gles3/storage/material_storage.cpp index 2c530e3ae6..c585895f4b 100644 --- a/drivers/gles3/storage/material_storage.cpp +++ b/drivers/gles3/storage/material_storage.cpp @@ -38,6 +38,7 @@ #include "texture_storage.h" #include "drivers/gles3/rasterizer_canvas_gles3.h" +#include "drivers/gles3/rasterizer_gles3.h" using namespace GLES3; @@ -1721,7 +1722,7 @@ MaterialStorage::MaterialStorage() { actions.default_filter = ShaderLanguage::FILTER_LINEAR_MIPMAP; actions.default_repeat = ShaderLanguage::REPEAT_ENABLE; - actions.check_multiview_samplers = true; + actions.check_multiview_samplers = RasterizerGLES3::get_singleton()->is_xr_enabled(); actions.global_buffer_array_variable = "global_shader_uniforms"; shaders.compiler_scene.initialize(actions); |