using AcDream.App.Rendering.Gpu.Vk; namespace AcDream.App.Tests.Rendering.Gpu.Vk; public sealed class VulkanDrawBindingStateTests { [Fact] public void FirstDrawBinds_IdenticalDrawReuses_ChangedInputsRebind() { var state = new VulkanDrawBindingState(); Assert.True(state.RequiresBind(pipelineLayout: 10, packGeneration: 3)); state.MarkBound(pipelineLayout: 10, packGeneration: 3); Assert.False(state.RequiresBind(pipelineLayout: 10, packGeneration: 3)); state.MarkDirty(); Assert.True(state.RequiresBind(pipelineLayout: 10, packGeneration: 3)); state.MarkBound(pipelineLayout: 10, packGeneration: 3); Assert.True(state.RequiresBind(pipelineLayout: 11, packGeneration: 3)); Assert.True(state.RequiresBind(pipelineLayout: 10, packGeneration: 4)); } [Fact] public void PackAndRetailLayoutsCannotReuseEachOthersBinding() { var state = new VulkanDrawBindingState(); state.MarkBound(pipelineLayout: 20, packGeneration: 7); Assert.True(state.RequiresBind(pipelineLayout: 21, packGeneration: 0)); state.MarkBound(pipelineLayout: 21, packGeneration: 0); Assert.True(state.RequiresBind(pipelineLayout: 20, packGeneration: 7)); } [Fact] public void WarmChecksAllocateZero() { var state = new VulkanDrawBindingState(); state.MarkBound(pipelineLayout: 30, packGeneration: 8); long before = GC.GetAllocatedBytesForCurrentThread(); for (int iteration = 0; iteration < 10_000; iteration++) { Assert.False(state.RequiresBind( pipelineLayout: 30, packGeneration: 8)); } long allocated = GC.GetAllocatedBytesForCurrentThread() - before; Assert.Equal(0, allocated); } }