public void TestMipDimensions() { // Define variables and constants const uint ORIGINAL_WIDTH_TX = 1 << 10; Texture1DArray <TexelFormat.RGBA32UInt> textureArray = TextureFactory.NewTexture1D <TexelFormat.RGBA32UInt>() .WithWidth(ORIGINAL_WIDTH_TX) .WithMipAllocation(true) .WithUsage(ResourceUsage.Write) .CreateArray(10); // Set up context // Execute for (int i = 0; ORIGINAL_WIDTH_TX >> i > 0; ++i) { Assert.AreEqual(ORIGINAL_WIDTH_TX >> i, textureArray.MipWidth((uint)i)); } #if !DEVELOPMENT && !RELEASE try { textureArray.MipWidth(10000U); Assert.Fail(); } catch (AssuranceFailedException) { } #endif // Assert outcome textureArray.Dispose(); }
public void TestCopyTo() { LosgapSystem.InvokeOnMaster(() => { // Define variables and constants const uint MIP0_WIDTH = 512U; const uint ARRAY_LENGTH = 10U; Texture1DArray <TexelFormat.RGBA32UInt> srcArray = TextureFactory.NewTexture1D <TexelFormat.RGBA32UInt>() .WithDynamicDetail(false) .WithInitialData( Enumerable.Repeat( Enumerable.Range(0, (int)TextureUtils.GetSizeTexels(true, MIP0_WIDTH)) .Select(i => (uint)i) .Select(i => new TexelFormat.RGBA32UInt { R = i, G = i * 2, B = i * 3, A = i * 4 }), (int)ARRAY_LENGTH ) .Flatten() .ToArray() ) .WithMipAllocation(true) .WithMipGenerationTarget(false) .WithPermittedBindings(GPUBindings.ReadableShaderResource) .WithUsage(ResourceUsage.Immutable) .WithMipAllocation(true) .WithUsage(ResourceUsage.Write) .WithWidth(MIP0_WIDTH) .CreateArray(ARRAY_LENGTH); // Set up context Texture1DArray <TexelFormat.RGBA32UInt> dstArray = srcArray.Clone() .WithUsage(ResourceUsage.StagingRead) .WithPermittedBindings(GPUBindings.None) .CreateArray(srcArray.ArrayLength); srcArray.CopyTo(dstArray); var data = dstArray[4].ReadAll(); // Execute for (int i = 0, curMipIndex = 0; i < data.Length; ++curMipIndex) { for (int j = 0; j < dstArray.MipWidth((uint)curMipIndex); ++j, ++i) { Assert.AreEqual((uint)i, data[i].R); Assert.AreEqual((uint)i * 2, data[i].G); Assert.AreEqual((uint)i * 3, data[i].B); Assert.AreEqual((uint)i * 4, data[i].A); } } // Assert outcome srcArray.Dispose(); dstArray.Dispose(); }); }
public void TestArrayElementsAreIdentical() { // Define variables and constants const uint MIP0_WIDTH = 512U; const uint ARRAY_LENGTH = 10U; Texture1DArray <TexelFormat.RGBA32UInt> srcArray = TextureFactory.NewTexture1D <TexelFormat.RGBA32UInt>() .WithDynamicDetail(true) .WithInitialData( Enumerable.Repeat( Enumerable.Range(0, (int)TextureUtils.GetSizeTexels(true, MIP0_WIDTH)) .Select(i => (uint)i) .Select(i => new TexelFormat.RGBA32UInt { R = i, G = i * 2, B = i * 3, A = i * 4 }), (int)ARRAY_LENGTH ) .Flatten() .ToArray() ) .WithMipAllocation(true) .WithMipGenerationTarget(false) .WithPermittedBindings(GPUBindings.ReadableShaderResource) .WithUsage(ResourceUsage.Immutable) .WithMipAllocation(true) .WithUsage(ResourceUsage.Write) .WithWidth(MIP0_WIDTH) .CreateArray(ARRAY_LENGTH); // Set up context // Execute // Assert outcome foreach (Texture1D <TexelFormat.RGBA32UInt> arrayElement in srcArray) { Assert.AreEqual(srcArray.IsGlobalDetailTarget, arrayElement.IsGlobalDetailTarget); Assert.AreEqual(srcArray.IsMipGenTarget, arrayElement.IsMipGenTarget); Assert.AreEqual(srcArray.IsMipmapped, arrayElement.IsMipmapped); Assert.AreEqual(srcArray.NumMips, arrayElement.NumMips); Assert.AreEqual(srcArray.PermittedBindings, arrayElement.PermittedBindings); Assert.AreEqual(srcArray.Size / srcArray.ArrayLength, arrayElement.Size); Assert.AreEqual(srcArray.TexelFormat, arrayElement.TexelFormat); Assert.AreEqual(srcArray.TexelSizeBytes, arrayElement.TexelSizeBytes); Assert.AreEqual(srcArray.Usage, arrayElement.Usage); Assert.AreEqual(srcArray.Width, arrayElement.Width); } srcArray.Dispose(); }
public void TestCloneWithInitData() { // Define variables and constants const uint MIP0_WIDTH = 512U; const uint ARRAY_LENGTH = 10U; Texture1DArray <TexelFormat.RGBA32UInt> srcArray = TextureFactory.NewTexture1D <TexelFormat.RGBA32UInt>() .WithDynamicDetail(false) .WithInitialData( Enumerable.Range(0, (int)TextureUtils.GetSizeTexels(true, MIP0_WIDTH) * (int)ARRAY_LENGTH) .Select(i => (uint)i) .Select(i => new TexelFormat.RGBA32UInt { R = i, G = i * 2, B = i * 3, A = i * 4 }) .ToArray() ) .WithMipAllocation(true) .WithMipGenerationTarget(false) .WithPermittedBindings(GPUBindings.None) .WithUsage(ResourceUsage.StagingRead) .WithWidth(MIP0_WIDTH) .CreateArray(ARRAY_LENGTH); // Set up context // Execute var cloneArray = srcArray.Clone(true).CreateArray(ARRAY_LENGTH); // Assert outcome uint curVal = 0U; foreach (Texture1D <TexelFormat.RGBA32UInt> texture1D in cloneArray) { TexelFormat.RGBA32UInt[] texData = texture1D.ReadAll(); for (int i = 0; i < texData.Length; i++) { Assert.AreEqual(curVal, texData[i].R); Assert.AreEqual(curVal * 2, texData[i].G); Assert.AreEqual(curVal * 3, texData[i].B); Assert.AreEqual(curVal * 4, texData[i].A); ++curVal; } } cloneArray.Dispose(); srcArray.Dispose(); }
/// <summary> /// Creates an array of <see cref="Texture1D{TTexel}"/>s; encapsulated as a <see cref="Texture1DArray{TTexel}"/> object. /// By grouping textures that are used together frequently in to an array, you can gain a performance improvement. /// You can not create an array of textures with usage '<see cref="ResourceUsage.DiscardWrite"/>'. /// </summary> /// <param name="numTextures">The number of textures in the array. Must not be zero.</param> /// <returns>A new <see cref="Texture1DArray{TTexel}"/>.</returns> public Texture1DArray <TTexel> CreateArray(uint numTextures) { Assure.False(Usage == ResourceUsage.DiscardWrite, "Can not create an array of discard-write textures."); Texture1DArray <TTexel> result = new Texture1DArray <TTexel>( CreateTexture1D(numTextures, InitialData), Usage, TextureUtils.GetSize(texelSizeBytes, mipAllocation, width) * numTextures, permittedBindings, numTextures, mipGenerationTarget, dynamicDetail, width, texelSizeBytes, mipAllocation, numMips ); if (dynamicDetail) { RenderingModule.DynamicDetailTextures.Value.Add(new WeakReference <IResource>(result)); } return(result); }