Fix memory leak in Compute Texture demo (#1275)

* Rearrange uniform set creation
* Remove unnecessary `TEXTURE_USAGE_CAN_COPY_FROM_BIT`
* Restore `input_event` param name
* Restore code comment
This commit is contained in:
1hue
2026-02-02 19:09:19 +00:00
committed by GitHub
parent 0ece7eaf26
commit d2a6a64b9c

View File

@@ -141,14 +141,13 @@ var pipeline: RID
# - One that contains the last frame rendered
# - One for the frame before that
var texture_rds: Array[RID] = [RID(), RID(), RID()]
var texture_sets: Array[RID] = [RID(), RID(), RID()]
var texture_sets: Array[RID] = [RID(), RID(), RID(), RID(), RID(), RID(), RID(), RID(), RID()]
func _create_uniform_set(texture_rd: RID, uniform_set: int) -> RID:
var uniform := RDUniform.new()
uniform.uniform_type = RenderingDevice.UNIFORM_TYPE_IMAGE
uniform.binding = 0
uniform.add_id(texture_rd)
# Even though we're using 3 sets, they are identical, so we're kinda cheating.
return rd.uniform_set_create([uniform], shader, uniform_set)
@@ -185,6 +184,16 @@ func _initialize_compute_code(init_with_texture_size: Vector2i) -> void:
# Make sure our textures are cleared.
rd.texture_clear(texture_rds[i], Color(0, 0, 0, 0), 0, 1, 0, 1)
# Ensure all 3 textures have been initialized before creating the uniform sets.
for i in 3:
var next_texture_rd := texture_rds[i]
var current_texture_rd := texture_rds[(i + 2) % 3]
var previous_texture_rd := texture_rds[(i + 1) % 3]
texture_sets[i * 3 + 0] = _create_uniform_set(current_texture_rd, 0)
texture_sets[i * 3 + 1] = _create_uniform_set(previous_texture_rd, 1)
texture_sets[i * 3 + 2] = _create_uniform_set(next_texture_rd, 2)
func _render_process(with_next_texture: int, wave_point: Vector4, tex_size: Vector2i, p_damp: float) -> void:
# We don't have structures (yet) so we need to build our push constant
@@ -211,14 +220,12 @@ func _render_process(with_next_texture: int, wave_point: Vector4, tex_size: Vect
var y_groups := (tex_size.y - 1) / 8 + 1
# Figure out which texture to assign to which set.
var current_texture_rd := texture_rds[(with_next_texture - 1) % 3]
var previous_texture_rd := texture_rds[(with_next_texture - 2) % 3]
var next_texture_rd := texture_rds[with_next_texture]
var current_set := texture_sets[with_next_texture * 3]
var previous_set := texture_sets[with_next_texture * 3 + 1]
var next_set := texture_sets[with_next_texture * 3 + 2]
# Create our uniform sets so we can use these textures in our shader.
var current_set := _create_uniform_set(current_texture_rd, 0)
var previous_set := _create_uniform_set(previous_texture_rd, 1)
var next_set := _create_uniform_set(next_texture_rd, 2)
if not (pipeline.is_valid() and current_set.is_valid() and previous_set.is_valid() and next_set.is_valid()):
return
# Run our compute shader.
var compute_list := rd.compute_list_begin()
@@ -242,5 +249,9 @@ func _free_compute_resources() -> void:
if texture_rds[i]:
rd.free_rid(texture_rds[i])
for i in 9:
if texture_sets[i] and texture_sets[i].is_valid():
rd.free_rid(texture_sets[i])
if shader:
rd.free_rid(shader)