using System.Runtime.InteropServices; using AcDream.App.Rendering; namespace AcDream.App.Tests.Rendering; public sealed class ParticleBindlessInstanceTests { [Fact] public void BillboardGpuInstance_MatchesVertexAttributeAbi() { Assert.Equal(72, Marshal.SizeOf()); Assert.Equal( new IntPtr(64), Marshal.OffsetOf( nameof(ParticleRenderer.BillboardGpuInstance.TextureHandleLow))); Assert.Equal( new IntPtr(68), Marshal.OffsetOf( nameof(ParticleRenderer.BillboardGpuInstance.TextureHandleHigh))); } [Fact] public void BillboardShaders_ConsumeOneBindlessTextureHandlePerInstance() { string shadersDirectory = Path.Combine( AppContext.BaseDirectory, "Rendering", "Shaders"); string vertex = File.ReadAllText(Path.Combine(shadersDirectory, "particle.vert")); string fragment = File.ReadAllText(Path.Combine(shadersDirectory, "particle.frag")); Assert.Contains("layout(location = 6) in uvec2 aTextureHandle;", vertex); Assert.Contains("flat out uvec2 vTextureHandle;", vertex); Assert.Contains("#extension GL_ARB_bindless_texture : require", fragment); Assert.Contains("sampler2DArray(vTextureHandle)", fragment); Assert.DoesNotContain("uniform sampler2D uParticleTexture", fragment); } }