Merge pull request #96502 from clayjohn/GLES3-screen-texture-angle
Only use backbuffer mipmaps in `SCREEN_TEXTURE` when generated.
This commit is contained in:
commit
f8aa1f8c57
2 changed files with 10 additions and 9 deletions
|
@ -468,7 +468,7 @@ void RasterizerCanvasGLES3::canvas_render_items(RID p_to_render_target, Item *p_
|
||||||
update_skeletons = false;
|
update_skeletons = false;
|
||||||
}
|
}
|
||||||
// Canvas group begins here, render until before this item
|
// Canvas group begins here, render until before this item
|
||||||
_render_items(p_to_render_target, item_count, canvas_transform_inverse, p_light_list, r_sdf_used, false, r_render_info);
|
_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);
|
||||||
item_count = 0;
|
item_count = 0;
|
||||||
|
|
||||||
if (ci->canvas_group_owner->canvas_group->mode != RS::CANVAS_GROUP_MODE_TRANSPARENT) {
|
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_
|
||||||
mesh_storage->update_mesh_instances();
|
mesh_storage->update_mesh_instances();
|
||||||
update_skeletons = false;
|
update_skeletons = false;
|
||||||
}
|
}
|
||||||
_render_items(p_to_render_target, item_count, canvas_transform_inverse, p_light_list, r_sdf_used, true, r_render_info);
|
_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);
|
||||||
item_count = 0;
|
item_count = 0;
|
||||||
|
|
||||||
if (ci->canvas_group->blur_mipmaps) {
|
if (ci->canvas_group->blur_mipmaps) {
|
||||||
|
@ -523,7 +523,7 @@ void RasterizerCanvasGLES3::canvas_render_items(RID p_to_render_target, Item *p_
|
||||||
}
|
}
|
||||||
//render anything pending, including clearing if no items
|
//render anything pending, including clearing if no items
|
||||||
|
|
||||||
_render_items(p_to_render_target, item_count, canvas_transform_inverse, p_light_list, r_sdf_used, false, r_render_info);
|
_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);
|
||||||
item_count = 0;
|
item_count = 0;
|
||||||
|
|
||||||
texture_storage->render_target_copy_to_back_buffer(p_to_render_target, back_buffer_rect, backbuffer_gen_mipmaps);
|
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_
|
||||||
mesh_storage->update_mesh_instances();
|
mesh_storage->update_mesh_instances();
|
||||||
update_skeletons = false;
|
update_skeletons = false;
|
||||||
}
|
}
|
||||||
_render_items(p_to_render_target, item_count, canvas_transform_inverse, p_light_list, r_sdf_used, canvas_group_owner != nullptr, r_render_info);
|
_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);
|
||||||
//then reset
|
//then reset
|
||||||
item_count = 0;
|
item_count = 0;
|
||||||
}
|
}
|
||||||
|
@ -573,10 +573,10 @@ void RasterizerCanvasGLES3::canvas_render_items(RID p_to_render_target, Item *p_
|
||||||
state.current_instance_buffer_index = 0;
|
state.current_instance_buffer_index = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
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) {
|
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) {
|
||||||
GLES3::MaterialStorage *material_storage = GLES3::MaterialStorage::get_singleton();
|
GLES3::MaterialStorage *material_storage = GLES3::MaterialStorage::get_singleton();
|
||||||
|
|
||||||
canvas_begin(p_to_render_target, p_to_backbuffer);
|
canvas_begin(p_to_render_target, p_to_backbuffer, p_backbuffer_has_mipmaps);
|
||||||
|
|
||||||
if (p_item_count <= 0) {
|
if (p_item_count <= 0) {
|
||||||
// Nothing to draw, just call canvas_begin() to clear the render target and return.
|
// Nothing to draw, just call canvas_begin() to clear the render target and return.
|
||||||
|
@ -2169,7 +2169,7 @@ bool RasterizerCanvasGLES3::free(RID p_rid) {
|
||||||
void RasterizerCanvasGLES3::update() {
|
void RasterizerCanvasGLES3::update() {
|
||||||
}
|
}
|
||||||
|
|
||||||
void RasterizerCanvasGLES3::canvas_begin(RID p_to_render_target, bool p_to_backbuffer) {
|
void RasterizerCanvasGLES3::canvas_begin(RID p_to_render_target, bool p_to_backbuffer, bool p_backbuffer_has_mipmaps) {
|
||||||
GLES3::TextureStorage *texture_storage = GLES3::TextureStorage::get_singleton();
|
GLES3::TextureStorage *texture_storage = GLES3::TextureStorage::get_singleton();
|
||||||
GLES3::Config *config = GLES3::Config::get_singleton();
|
GLES3::Config *config = GLES3::Config::get_singleton();
|
||||||
|
|
||||||
|
@ -2184,6 +2184,7 @@ void RasterizerCanvasGLES3::canvas_begin(RID p_to_render_target, bool p_to_backb
|
||||||
glBindFramebuffer(GL_FRAMEBUFFER, render_target->fbo);
|
glBindFramebuffer(GL_FRAMEBUFFER, render_target->fbo);
|
||||||
glActiveTexture(GL_TEXTURE0 + config->max_texture_image_units - 4);
|
glActiveTexture(GL_TEXTURE0 + config->max_texture_image_units - 4);
|
||||||
glBindTexture(GL_TEXTURE_2D, render_target->backbuffer);
|
glBindTexture(GL_TEXTURE_2D, render_target->backbuffer);
|
||||||
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, p_backbuffer_has_mipmaps ? render_target->mipmap_count - 1 : 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (render_target->is_transparent || p_to_backbuffer) {
|
if (render_target->is_transparent || p_to_backbuffer) {
|
||||||
|
|
|
@ -335,7 +335,7 @@ public:
|
||||||
|
|
||||||
typedef void Texture;
|
typedef void Texture;
|
||||||
|
|
||||||
void canvas_begin(RID p_to_render_target, bool p_to_backbuffer);
|
void canvas_begin(RID p_to_render_target, bool p_to_backbuffer, bool p_backbuffer_has_mipmaps);
|
||||||
|
|
||||||
//virtual void draw_window_margins(int *black_margin, RID *black_image) override;
|
//virtual void draw_window_margins(int *black_margin, RID *black_image) override;
|
||||||
void draw_lens_distortion_rect(const Rect2 &p_rect, float p_k1, float p_k2, const Vector2 &p_eye_center, float p_oversample);
|
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 @@ public:
|
||||||
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);
|
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);
|
||||||
|
|
||||||
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;
|
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;
|
||||||
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);
|
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);
|
||||||
void _record_item_commands(const Item *p_item, RID p_render_target, const Transform2D &p_canvas_transform_inverse, Item *¤t_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);
|
void _record_item_commands(const Item *p_item, RID p_render_target, const Transform2D &p_canvas_transform_inverse, Item *¤t_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);
|
||||||
void _render_batch(Light *p_lights, uint32_t p_index, RenderingMethod::RenderInfo *r_render_info = nullptr);
|
void _render_batch(Light *p_lights, uint32_t p_index, RenderingMethod::RenderInfo *r_render_info = nullptr);
|
||||||
bool _bind_material(GLES3::CanvasMaterialData *p_material_data, CanvasShaderGLES3::ShaderVariant p_variant, uint64_t p_specialization);
|
bool _bind_material(GLES3::CanvasMaterialData *p_material_data, CanvasShaderGLES3::ShaderVariant p_variant, uint64_t p_specialization);
|
||||||
|
|
Loading…
Reference in a new issue