Skip to content

Commit f8aa1f8

Browse files
committed
Merge pull request godotengine#96502 from clayjohn/GLES3-screen-texture-angle
Only use backbuffer mipmaps in `SCREEN_TEXTURE` when generated.
2 parents 9bcb9ad + d2f5c1a commit f8aa1f8

File tree

2 files changed

+10
-9
lines changed

2 files changed

+10
-9
lines changed

drivers/gles3/rasterizer_canvas_gles3.cpp

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -468,7 +468,7 @@ void RasterizerCanvasGLES3::canvas_render_items(RID p_to_render_target, Item *p_
468468
update_skeletons = false;
469469
}
470470
// Canvas group begins here, render until before this item
471-
_render_items(p_to_render_target, item_count, canvas_transform_inverse, p_light_list, r_sdf_used, false, r_render_info);
471+
_render_items(p_to_render_target, item_count, canvas_transform_inverse, p_light_list, r_sdf_used, false, r_render_info, material_screen_texture_mipmaps_cached);
472472
item_count = 0;
473473

474474
if (ci->canvas_group_owner->canvas_group->mode != RS::CANVAS_GROUP_MODE_TRANSPARENT) {
@@ -499,7 +499,7 @@ void RasterizerCanvasGLES3::canvas_render_items(RID p_to_render_target, Item *p_
499499
mesh_storage->update_mesh_instances();
500500
update_skeletons = false;
501501
}
502-
_render_items(p_to_render_target, item_count, canvas_transform_inverse, p_light_list, r_sdf_used, true, r_render_info);
502+
_render_items(p_to_render_target, item_count, canvas_transform_inverse, p_light_list, r_sdf_used, true, r_render_info, material_screen_texture_mipmaps_cached);
503503
item_count = 0;
504504

505505
if (ci->canvas_group->blur_mipmaps) {
@@ -523,7 +523,7 @@ void RasterizerCanvasGLES3::canvas_render_items(RID p_to_render_target, Item *p_
523523
}
524524
//render anything pending, including clearing if no items
525525

526-
_render_items(p_to_render_target, item_count, canvas_transform_inverse, p_light_list, r_sdf_used, false, r_render_info);
526+
_render_items(p_to_render_target, item_count, canvas_transform_inverse, p_light_list, r_sdf_used, false, r_render_info, material_screen_texture_mipmaps_cached);
527527
item_count = 0;
528528

529529
texture_storage->render_target_copy_to_back_buffer(p_to_render_target, back_buffer_rect, backbuffer_gen_mipmaps);
@@ -553,7 +553,7 @@ void RasterizerCanvasGLES3::canvas_render_items(RID p_to_render_target, Item *p_
553553
mesh_storage->update_mesh_instances();
554554
update_skeletons = false;
555555
}
556-
_render_items(p_to_render_target, item_count, canvas_transform_inverse, p_light_list, r_sdf_used, canvas_group_owner != nullptr, r_render_info);
556+
_render_items(p_to_render_target, item_count, canvas_transform_inverse, p_light_list, r_sdf_used, canvas_group_owner != nullptr, r_render_info, material_screen_texture_mipmaps_cached);
557557
//then reset
558558
item_count = 0;
559559
}
@@ -573,10 +573,10 @@ void RasterizerCanvasGLES3::canvas_render_items(RID p_to_render_target, Item *p_
573573
state.current_instance_buffer_index = 0;
574574
}
575575

576-
void RasterizerCanvasGLES3::_render_items(RID p_to_render_target, int p_item_count, const Transform2D &p_canvas_transform_inverse, Light *p_lights, bool &r_sdf_used, bool p_to_backbuffer, RenderingMethod::RenderInfo *r_render_info) {
576+
void RasterizerCanvasGLES3::_render_items(RID p_to_render_target, int p_item_count, const Transform2D &p_canvas_transform_inverse, Light *p_lights, bool &r_sdf_used, bool p_to_backbuffer, RenderingMethod::RenderInfo *r_render_info, bool p_backbuffer_has_mipmaps) {
577577
GLES3::MaterialStorage *material_storage = GLES3::MaterialStorage::get_singleton();
578578

579-
canvas_begin(p_to_render_target, p_to_backbuffer);
579+
canvas_begin(p_to_render_target, p_to_backbuffer, p_backbuffer_has_mipmaps);
580580

581581
if (p_item_count <= 0) {
582582
// Nothing to draw, just call canvas_begin() to clear the render target and return.
@@ -2169,7 +2169,7 @@ bool RasterizerCanvasGLES3::free(RID p_rid) {
21692169
void RasterizerCanvasGLES3::update() {
21702170
}
21712171

2172-
void RasterizerCanvasGLES3::canvas_begin(RID p_to_render_target, bool p_to_backbuffer) {
2172+
void RasterizerCanvasGLES3::canvas_begin(RID p_to_render_target, bool p_to_backbuffer, bool p_backbuffer_has_mipmaps) {
21732173
GLES3::TextureStorage *texture_storage = GLES3::TextureStorage::get_singleton();
21742174
GLES3::Config *config = GLES3::Config::get_singleton();
21752175

@@ -2184,6 +2184,7 @@ void RasterizerCanvasGLES3::canvas_begin(RID p_to_render_target, bool p_to_backb
21842184
glBindFramebuffer(GL_FRAMEBUFFER, render_target->fbo);
21852185
glActiveTexture(GL_TEXTURE0 + config->max_texture_image_units - 4);
21862186
glBindTexture(GL_TEXTURE_2D, render_target->backbuffer);
2187+
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, p_backbuffer_has_mipmaps ? render_target->mipmap_count - 1 : 0);
21872188
}
21882189

21892190
if (render_target->is_transparent || p_to_backbuffer) {

drivers/gles3/rasterizer_canvas_gles3.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -335,7 +335,7 @@ class RasterizerCanvasGLES3 : public RendererCanvasRender {
335335

336336
typedef void Texture;
337337

338-
void canvas_begin(RID p_to_render_target, bool p_to_backbuffer);
338+
void canvas_begin(RID p_to_render_target, bool p_to_backbuffer, bool p_backbuffer_has_mipmaps);
339339

340340
//virtual void draw_window_margins(int *black_margin, RID *black_image) override;
341341
void draw_lens_distortion_rect(const Rect2 &p_rect, float p_k1, float p_k2, const Vector2 &p_eye_center, float p_oversample);
@@ -361,7 +361,7 @@ class RasterizerCanvasGLES3 : public RendererCanvasRender {
361361
void _prepare_canvas_texture(RID p_texture, RS::CanvasItemTextureFilter p_base_filter, RS::CanvasItemTextureRepeat p_base_repeat, uint32_t &r_index, Size2 &r_texpixel_size);
362362

363363
void 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, RenderingMethod::RenderInfo *r_render_info = nullptr) override;
364-
void _render_items(RID p_to_render_target, int p_item_count, const Transform2D &p_canvas_transform_inverse, Light *p_lights, bool &r_sdf_used, bool p_to_backbuffer = false, RenderingMethod::RenderInfo *r_render_info = nullptr);
364+
void _render_items(RID p_to_render_target, int p_item_count, const Transform2D &p_canvas_transform_inverse, Light *p_lights, bool &r_sdf_used, bool p_to_backbuffer = false, RenderingMethod::RenderInfo *r_render_info = nullptr, bool p_backbuffer_has_mipmaps = false);
365365
void _record_item_commands(const Item *p_item, RID p_render_target, const Transform2D &p_canvas_transform_inverse, Item *&current_clip, GLES3::CanvasShaderData::BlendMode p_blend_mode, Light *p_lights, uint32_t &r_index, bool &r_break_batch, bool &r_sdf_used, const Point2 &p_repeat_offset);
366366
void _render_batch(Light *p_lights, uint32_t p_index, RenderingMethod::RenderInfo *r_render_info = nullptr);
367367
bool _bind_material(GLES3::CanvasMaterialData *p_material_data, CanvasShaderGLES3::ShaderVariant p_variant, uint64_t p_specialization);

0 commit comments

Comments
 (0)