a73x

56668744

Reset row GPU spans on render cache resize

a73x   2026-04-08 19:00

Commit message
Reset row GPU spans on render cache resize

src/main.zig
Old New
@@ -731,15 +731,15 @@ test "RenderCache resizeRows preserves surviving row caches" {
731 try cache.resizeRows(std.testing.allocator, 3); 731 try cache.resizeRows(std.testing.allocator, 3);
732 try std.testing.expectEqual(@as(usize, 3), cache.rows.len); 732 try std.testing.expectEqual(@as(usize, 3), cache.rows.len);
733 try std.testing.expectEqual(@as(usize, 1), cache.rows[0].instances.items.len); 733 try std.testing.expectEqual(@as(usize, 1), cache.rows[0].instances.items.len);
734 try std.testing.expectEqual(@as(u32, 17), cache.rows[0].gpu_offset_instances); 734 try std.testing.expectEqual(@as(u32, 0), cache.rows[0].gpu_offset_instances);
735 try std.testing.expectEqual(@as(u32, 1), cache.rows[0].gpu_len_instances); 735 try std.testing.expectEqual(@as(u32, 0), cache.rows[0].gpu_len_instances);
736 try std.testing.expectEqual(@as(usize, 0), cache.rows[2].instances.items.len); 736 try std.testing.expectEqual(@as(usize, 0), cache.rows[2].instances.items.len);
737 737
738 try cache.resizeRows(std.testing.allocator, 1); 738 try cache.resizeRows(std.testing.allocator, 1);
739 try std.testing.expectEqual(@as(usize, 1), cache.rows.len); 739 try std.testing.expectEqual(@as(usize, 1), cache.rows.len);
740 try std.testing.expectEqual(@as(usize, 1), cache.rows[0].instances.items.len); 740 try std.testing.expectEqual(@as(usize, 1), cache.rows[0].instances.items.len);
741 try std.testing.expectEqual(@as(u32, 17), cache.rows[0].gpu_offset_instances); 741 try std.testing.expectEqual(@as(u32, 0), cache.rows[0].gpu_offset_instances);
742 try std.testing.expectEqual(@as(u32, 1), cache.rows[0].gpu_len_instances); 742 try std.testing.expectEqual(@as(u32, 0), cache.rows[0].gpu_len_instances);
743 } 743 }
744 744
745 test "RenderCache deinit resets fields after releasing row storage" { 745 test "RenderCache deinit resets fields after releasing row storage" {
@@ -815,7 +815,8 @@ test "RenderCache resizeRows truncates populated tail rows and preserves prefix
815 815
816 try std.testing.expectEqual(@as(usize, 1), cache.rows.len); 816 try std.testing.expectEqual(@as(usize, 1), cache.rows.len);
817 try std.testing.expectEqual(@as(usize, 1), cache.rows[0].instances.items.len); 817 try std.testing.expectEqual(@as(usize, 1), cache.rows[0].instances.items.len);
818 try std.testing.expectEqual(@as(u32, 10), cache.rows[0].gpu_offset_instances); 818 try std.testing.expectEqual(@as(u32, 0), cache.rows[0].gpu_offset_instances);
819 try std.testing.expectEqual(@as(u32, 0), cache.rows[0].gpu_len_instances);
819 try std.testing.expectEqual(@as(u32, 0), cache.total_instance_count); 820 try std.testing.expectEqual(@as(u32, 0), cache.total_instance_count);
820 try std.testing.expect(cache.layout_dirty); 821 try std.testing.expect(cache.layout_dirty);
821 } 822 }
@@ -889,6 +890,10 @@ const RenderCache = struct {
889 } 890 }
890 891
891 fn invalidateAfterResize(self: *RenderCache) void { 892 fn invalidateAfterResize(self: *RenderCache) void {
893 for (self.rows) |*row| {
894 row.gpu_offset_instances = 0;
895 row.gpu_len_instances = 0;
896 }
892 self.cursor_instances.clearRetainingCapacity(); 897 self.cursor_instances.clearRetainingCapacity();
893 self.packed_instances.clearRetainingCapacity(); 898 self.packed_instances.clearRetainingCapacity();
894 self.total_instance_count = 0; 899 self.total_instance_count = 0;