Skip to content

Commit

Permalink
Unbind used texture bindings when changing framebuffer
Browse files Browse the repository at this point in the history
  • Loading branch information
clayjohn committed Jun 21, 2022
1 parent 3c35617 commit baf691a
Show file tree
Hide file tree
Showing 5 changed files with 17 additions and 0 deletions.
2 changes: 2 additions & 0 deletions drivers/gles3/rasterizer_canvas_gles3.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -182,6 +182,7 @@ void RasterizerCanvasGLES3::_legacy_canvas_render_item(Item *p_ci, RenderItemSta
}

int tc = material_ptr->textures.size();
storage->frame.max_texture_binding = MAX(tc, storage->frame.max_texture_binding);
RID *textures = material_ptr->textures.ptrw();
ShaderLanguage::ShaderNode::Uniform::Hint *texture_hints = shader_ptr->texture_hints.ptrw();

Expand Down Expand Up @@ -1262,6 +1263,7 @@ void RasterizerCanvasGLES3::render_joined_item(const BItemJoined &p_bij, RenderI
}

int tc = material_ptr->textures.size();
storage->frame.max_texture_binding = MAX(tc, storage->frame.max_texture_binding);
RID *textures = material_ptr->textures.ptrw();
ShaderLanguage::ShaderNode::Uniform::Hint *texture_hints = shader_ptr->texture_hints.ptrw();

Expand Down
12 changes: 12 additions & 0 deletions drivers/gles3/rasterizer_gles3.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -248,6 +248,18 @@ void RasterizerGLES3::set_current_render_target(RID p_render_target) {
glViewport(0, 0, OS::get_singleton()->get_window_size().width, OS::get_singleton()->get_window_size().height);
glBindFramebuffer(GL_FRAMEBUFFER, RasterizerStorageGLES3::system_fbo);
}
// Unbind user textures that have been set since the last render target change.
// Unbind the internal slots that may have been used by Godot.
for (int i = 1; i <= 13; i++) {
glActiveTexture(GL_TEXTURE0 + storage->config.max_texture_image_units - i);
glBindTexture(GL_TEXTURE_2D, 0);
}
// Unbind from 0 up to the max texture slot used by the user.
for (int i = 0; i < storage->frame.max_texture_binding + 2; i++) {
glActiveTexture(GL_TEXTURE0 + i);
glBindTexture(GL_TEXTURE_2D, 0);
}
storage->frame.max_texture_binding = 0;
}

void RasterizerGLES3::restore_render_target(bool p_3d_was_drawn) {
Expand Down
1 change: 1 addition & 0 deletions drivers/gles3/rasterizer_scene_gles3.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1145,6 +1145,7 @@ bool RasterizerSceneGLES3::_setup_material(RasterizerStorageGLES3::Material *p_m
}

int tc = p_material->textures.size();
storage->frame.max_texture_binding = MAX(tc, storage->frame.max_texture_binding);
RID *textures = p_material->textures.ptrw();
ShaderLanguage::ShaderNode::Uniform::Hint *texture_hints = p_material->shader->texture_hints.ptrw();
const ShaderLanguage::DataType *texture_types = p_material->shader->texture_types.ptr();
Expand Down
1 change: 1 addition & 0 deletions drivers/gles3/rasterizer_storage_gles3.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -8337,6 +8337,7 @@ void RasterizerStorageGLES3::initialize() {
frame.count = 0;
frame.delta = 0;
frame.current_rt = nullptr;
frame.max_texture_binding = 0;
config.keep_original_textures = false;
config.generate_wireframes = false;
config.use_texture_array_environment = GLOBAL_GET("rendering/quality/reflections/texture_array_reflections");
Expand Down
1 change: 1 addition & 0 deletions drivers/gles3/rasterizer_storage_gles3.h
Original file line number Diff line number Diff line change
Expand Up @@ -1491,6 +1491,7 @@ class RasterizerStorageGLES3 : public RasterizerStorage {
float time[4];
float delta;
uint64_t count;
int max_texture_binding;

} frame;

Expand Down

0 comments on commit baf691a

Please sign in to comment.