public void TestCreateDefaultViewForBuffers() { const uint TEST_BUFFER_LEN = 300U; IGeneralBuffer testResource; ShaderResourceView testSRV; testResource = BufferFactory.NewBuffer <int>().WithLength(TEST_BUFFER_LEN) .WithUsage(ResourceUsage.DiscardWrite).WithPermittedBindings(GPUBindings.ReadableShaderResource).Create(); testSRV = testResource.CreateView(); Assert.IsFalse(testSRV.ResourceOrViewDisposed); Assert.AreEqual(testResource, testSRV.Resource); Assert.AreEqual(0U, ((ShaderBufferResourceView)testSRV).FirstElementIndex); Assert.AreEqual(TEST_BUFFER_LEN, ((ShaderBufferResourceView)testSRV).NumElements); testResource.Dispose(); Assert.IsTrue(testSRV.ResourceOrViewDisposed); testSRV.Dispose(); Assert.IsTrue(testSRV.IsDisposed); testResource = BufferFactory.NewBuffer <Matrix>().WithLength(TEST_BUFFER_LEN) .WithUsage(ResourceUsage.DiscardWrite).WithPermittedBindings(GPUBindings.ReadableShaderResource).Create(); testSRV = testResource.CreateView(); Assert.IsFalse(testSRV.ResourceOrViewDisposed); Assert.AreEqual(testResource, testSRV.Resource); Assert.AreEqual(0U, ((ShaderBufferResourceView)testSRV).FirstElementIndex); Assert.AreEqual(TEST_BUFFER_LEN, ((ShaderBufferResourceView)testSRV).NumElements); testResource.Dispose(); Assert.IsTrue(testSRV.ResourceOrViewDisposed); testSRV.Dispose(); Assert.IsTrue(testSRV.IsDisposed); }
public void TestReadWrite() { // Define variables and constants Buffer <long> testBuffer = BufferFactory.NewBuffer <long>() .WithLength(300) .WithUsage(ResourceUsage.StagingReadWrite) .WithPermittedBindings(GPUBindings.None); // Set up context testBuffer.Write(Enumerable.Range(0, 300).Select(i => (long)i).ToArray(), 0); // Execute testBuffer.ReadWrite(dataView => { for (int i = 0; i < dataView.Width; ++i) { dataView[i] *= 2L; } }); // Assert outcome long[] data = testBuffer.Read(); for (int i = 0; i < data.Length; ++i) { Assert.AreEqual(i * 2, data[i]); } testBuffer.Dispose(); }
public void TestCustomSRVForBuffers() { const uint TEST_BUFFER_LEN = 300U; const uint TEST_VIEW_START = 100U; const uint TEST_VIEW_LEN = 50U; IGeneralBuffer testResource; ShaderResourceView testSRV; testResource = BufferFactory.NewBuffer <int>().WithLength(TEST_BUFFER_LEN).WithUsage(ResourceUsage.DiscardWrite).Create(); testSRV = testResource.CreateView(TEST_VIEW_START, TEST_VIEW_LEN); Assert.IsFalse(testSRV.ResourceOrViewDisposed); Assert.AreEqual(testResource, testSRV.Resource); Assert.AreEqual(TEST_VIEW_START, ((ShaderBufferResourceView)testSRV).FirstElementIndex); Assert.AreEqual(TEST_VIEW_LEN, ((ShaderBufferResourceView)testSRV).NumElements); testResource.Dispose(); Assert.IsTrue(testSRV.ResourceOrViewDisposed); testSRV.Dispose(); Assert.IsTrue(testSRV.IsDisposed); testResource = BufferFactory.NewBuffer <Matrix>().WithLength(TEST_BUFFER_LEN).WithUsage(ResourceUsage.DiscardWrite).Create(); testSRV = testResource.CreateView(TEST_VIEW_START, TEST_VIEW_LEN); Assert.IsFalse(testSRV.ResourceOrViewDisposed); Assert.AreEqual(testResource, testSRV.Resource); Assert.AreEqual(TEST_VIEW_START, ((ShaderBufferResourceView)testSRV).FirstElementIndex); Assert.AreEqual(TEST_VIEW_LEN, ((ShaderBufferResourceView)testSRV).NumElements); testResource.Dispose(); Assert.IsTrue(testSRV.ResourceOrViewDisposed); testSRV.Dispose(); Assert.IsTrue(testSRV.IsDisposed); }
public void TestWrite() { LosgapSystem.InvokeOnMaster(() => { // Define variables and constants IBuffer res = BufferFactory.NewBuffer <int>() .WithUsage(ResourceUsage.Write) .WithLength(100) .Create(); IBuffer copyDest = (res as Buffer <int>).Clone() .WithUsage(ResourceUsage.StagingRead) .WithPermittedBindings(GPUBindings.None) .Create(); // Set up context // Execute Assert.IsTrue(res.CanWrite); res.Write(new byte[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }, 10U); res.CopyTo(copyDest); // Assert outcome byte[] readData = copyDest.Read(); for (int i = 10; i < 20; ++i) { Assert.AreEqual(i - 9, readData[i]); } res.Dispose(); copyDest.Dispose(); }); }
public void TestClone() { // Define variables and constants const ResourceUsage USAGE = ResourceUsage.StagingReadWrite; const uint LENGTH = 21515; const GPUBindings GPU_BINDINGS = GPUBindings.None; int[] initialData = new int[LENGTH]; // Set up context for (int i = 0; i < initialData.Length; i++) { initialData[i] = i * 3; } Buffer <int> firstBuffer = BufferFactory.NewBuffer <int>() .WithUsage(USAGE) .WithLength(LENGTH) .WithPermittedBindings(GPU_BINDINGS) .WithInitialData(initialData); // Execute Buffer <int> secondBuffer = firstBuffer.Clone(); Buffer <long> thirdBuffer = secondBuffer.Clone().WithElementType <long>(); Buffer <int> fourthBuffer = firstBuffer.Clone(true); // Assert outcome Assert.AreEqual(USAGE, secondBuffer.Usage); Assert.AreEqual(firstBuffer.Usage, secondBuffer.Usage); Assert.AreEqual(LENGTH, secondBuffer.Length); Assert.AreEqual(firstBuffer.Length, secondBuffer.Length); Assert.AreEqual(GPU_BINDINGS, secondBuffer.PermittedBindings); Assert.AreEqual(firstBuffer.PermittedBindings, secondBuffer.PermittedBindings); Assert.AreEqual(false, secondBuffer.IsStructured); Assert.AreEqual(firstBuffer.IsStructured, secondBuffer.IsStructured); Assert.AreEqual(USAGE, thirdBuffer.Usage); Assert.AreEqual(secondBuffer.Length, thirdBuffer.Length); Assert.AreEqual(secondBuffer.Size * 2U, thirdBuffer.Size); int[] firstBufferData = firstBuffer.Read(); int[] fourthBufferData = fourthBuffer.Read(); for (int i = 0; i < initialData.Length; i++) { Assert.AreEqual(initialData[i], firstBufferData[i]); Assert.AreEqual(firstBufferData[i], fourthBufferData[i]); } firstBuffer.Dispose(); secondBuffer.Dispose(); thirdBuffer.Dispose(); fourthBuffer.Dispose(); }
public void TestCreation() { // Define variables and constants BufferBuilder <int> defaultBufferBuilder = BufferFactory.NewBuffer <int>().WithLength(1); Buffer <int> bufferWithFrequentWrite = defaultBufferBuilder.WithUsage(ResourceUsage.DiscardWrite); Buffer <int> bufferWith300Ele = bufferWithFrequentWrite.Clone().WithLength(300); Buffer <int> bufferWithInitData = defaultBufferBuilder.WithInitialData(Enumerable.Range(0, 10).ToArray()); Buffer <long> bufferWith200LongEle = bufferWithFrequentWrite.Clone().WithElementType <long>().WithLength(200); Buffer <int> bufferWithNoGPUBindings = bufferWithFrequentWrite.Clone() .WithPermittedBindings(GPUBindings.None) .WithUsage(ResourceUsage.StagingRead); // Set up context // Execute // Assert outcome Assert.AreEqual(ResourceUsage.DiscardWrite, bufferWithFrequentWrite.Usage); Assert.AreEqual(300L, bufferWith300Ele.Length); Assert.AreEqual(10L, bufferWithInitData.Length); Assert.AreEqual(200L, bufferWith200LongEle.Length); Assert.IsFalse(bufferWithInitData.IsStructured); Assert.IsTrue(bufferWith200LongEle.IsStructured); Assert.AreEqual(GPUBindings.None, bufferWithNoGPUBindings.PermittedBindings); Assert.AreNotEqual(bufferWithNoGPUBindings.PermittedBindings, bufferWithFrequentWrite.PermittedBindings); #if !DEVELOPMENT && !RELEASE try { defaultBufferBuilder.WithUsage(ResourceUsage.StagingRead).WithPermittedBindings(GPUBindings.ReadableShaderResource).Create(); Assert.Fail(); } catch (AssuranceFailedException) { } #endif try { defaultBufferBuilder.WithPermittedBindings(GPUBindings.RenderTarget); Assert.Fail(); } catch (ArgumentException) { } try { defaultBufferBuilder.WithPermittedBindings(GPUBindings.DepthStencilTarget); Assert.Fail(); } catch (ArgumentException) { } bufferWithFrequentWrite.Dispose(); bufferWith300Ele.Dispose(); bufferWithInitData.Dispose(); bufferWith200LongEle.Dispose(); bufferWithNoGPUBindings.Dispose(); }
public void TestDiscardWrite() { LosgapSystem.InvokeOnMaster(() => { // Define variables and constants Buffer <decimal> testBuffer = BufferFactory.NewBuffer <decimal>() .WithUsage(ResourceUsage.DiscardWrite) .WithLength(300); Buffer <decimal> copyDestBuffer = testBuffer.Clone() .WithUsage(ResourceUsage.StagingRead) .WithPermittedBindings(GPUBindings.None); // Set up context // Execute testBuffer.DiscardWrite(Enumerable.Range(0, 300).Select(i => (decimal)i).ToArray(), 0); testBuffer.DiscardWrite(Enumerable.Range(0, 200).Select(i => (decimal)i).ToArray(), 100); testBuffer.DiscardWrite(new ArraySlice <decimal>(Enumerable.Range(0, 200).Select(i => (decimal)i).ToArray(), 50, 50), 24); #if !DEVELOPMENT && !RELEASE try { testBuffer.DiscardWrite(new ArraySlice <decimal>(Enumerable.Range(0, 200).Select(i => (decimal)i).ToArray(), 50), 250); Assert.Fail(); } catch (AssuranceFailedException) { } #endif testBuffer.CopyTo(copyDestBuffer); decimal[] testData = copyDestBuffer.Read(); for (int i = 24; i < 24 + 50; ++i) { Assert.AreEqual((decimal)(50 + (i - 24)), testData[i]); } // Assert outcome Assert.IsTrue(testBuffer.CanDiscardWrite); Assert.IsFalse(copyDestBuffer.CanDiscardWrite); testBuffer.Dispose(); copyDestBuffer.Dispose(); }); }
public void TestCustomUAVForBuffers() { const uint TEST_BUFFER_LEN = 300U; const uint TEST_VIEW_START = 100U; const uint TEST_VIEW_LEN = 50U; const bool TEST_APPEND_CONSUME = true; const bool TEST_INCLUDE_COUNTER = false; IGeneralBuffer testResource; UnorderedAccessView testUAV; testResource = BufferFactory.NewBuffer <int>().WithLength(TEST_BUFFER_LEN) .WithUsage(ResourceUsage.Write).WithPermittedBindings(GPUBindings.WritableShaderResource).Create(); testUAV = testResource.CreateUnorderedAccessView(TEST_VIEW_START, TEST_VIEW_LEN, false, false); Assert.IsFalse(testUAV.ResourceOrViewDisposed); Assert.AreEqual(testResource, testUAV.Resource); Assert.AreEqual(TEST_VIEW_START, ((UnorderedBufferAccessView)testUAV).FirstElementIndex); Assert.AreEqual(true, ((UnorderedBufferAccessView)testUAV).IsRawAccessView); Assert.AreEqual(TEST_VIEW_LEN, ((UnorderedBufferAccessView)testUAV).NumElements); Assert.AreEqual(false, ((UnorderedBufferAccessView)testUAV).AppendConsumeSupport); Assert.AreEqual(false, ((UnorderedBufferAccessView)testUAV).IncludesCounter); testResource.Dispose(); Assert.IsTrue(testUAV.ResourceOrViewDisposed); testUAV.Dispose(); Assert.IsTrue(testUAV.IsDisposed); testResource = BufferFactory.NewBuffer <Matrix>().WithLength(TEST_BUFFER_LEN) .WithUsage(ResourceUsage.Write).WithPermittedBindings(GPUBindings.WritableShaderResource).Create(); testUAV = testResource.CreateUnorderedAccessView(TEST_VIEW_START, TEST_VIEW_LEN, TEST_APPEND_CONSUME, TEST_INCLUDE_COUNTER); Assert.IsFalse(testUAV.ResourceOrViewDisposed); Assert.AreEqual(testResource, testUAV.Resource); Assert.AreEqual(TEST_VIEW_START, ((UnorderedBufferAccessView)testUAV).FirstElementIndex); Assert.AreEqual(false, ((UnorderedBufferAccessView)testUAV).IsRawAccessView); Assert.AreEqual(TEST_VIEW_LEN, ((UnorderedBufferAccessView)testUAV).NumElements); Assert.AreEqual(TEST_APPEND_CONSUME, ((UnorderedBufferAccessView)testUAV).AppendConsumeSupport); Assert.AreEqual(TEST_INCLUDE_COUNTER, ((UnorderedBufferAccessView)testUAV).IncludesCounter); testResource.Dispose(); Assert.IsTrue(testUAV.ResourceOrViewDisposed); testUAV.Dispose(); Assert.IsTrue(testUAV.IsDisposed); }
public void TestCopyTo() { LosgapSystem.InvokeOnMaster(() => { // Define variables and constants const uint B_COPY_FIRST_ELEMENT = 100U; const uint B_COPY_NUM_ELEMENTS = 2000U; const uint B_COPY_DEST_OFFSET = 500U; Buffer <float> srcBuffer = BufferFactory.NewBuffer <float>() .WithUsage(ResourceUsage.Immutable) .WithInitialData(Enumerable.Range(0, 3000).Select(@int => (float)(@int * 3)).ToArray()); Buffer <float> dstBufferA = srcBuffer.Clone() .WithUsage(ResourceUsage.StagingRead) .WithPermittedBindings(GPUBindings.None); Buffer <float> dstBufferB = dstBufferA.Clone(); // Set up context // Execute srcBuffer.CopyTo(dstBufferA); srcBuffer.CopyTo(dstBufferB, B_COPY_FIRST_ELEMENT, B_COPY_NUM_ELEMENTS, B_COPY_DEST_OFFSET); try { dstBufferA.CopyTo(srcBuffer); Assert.Fail(); } catch (ResourceOperationUnavailableException) { } #if !DEVELOPMENT && !RELEASE try { srcBuffer.CopyTo(dstBufferA, 1600, 2000, 500); Assert.Fail(); } catch (AssuranceFailedException) { } try { srcBuffer.CopyTo(dstBufferB, 0, 2000, 2000); Assert.Fail(); } catch (AssuranceFailedException) { } #endif // Assert outcome float[] dstBufferAData = dstBufferA.Read(); for (int i = 0; i < dstBufferA.Length; i++) { Assert.AreEqual(i * 3, dstBufferAData[i]); } float[] dstBufferBData = dstBufferB.Read(); for (uint i = B_COPY_DEST_OFFSET; i < B_COPY_DEST_OFFSET + B_COPY_NUM_ELEMENTS; ++i) { Assert.AreEqual((i + B_COPY_FIRST_ELEMENT - B_COPY_DEST_OFFSET) * 3, dstBufferBData[i]); } Assert.IsFalse(srcBuffer.CanBeCopyDestination); Assert.IsTrue(dstBufferA.CanBeCopyDestination); Assert.IsTrue(dstBufferB.CanBeCopyDestination); srcBuffer.Dispose(); dstBufferA.Dispose(); dstBufferB.Dispose(); }); }
public void TestWrite() { LosgapSystem.InvokeOnMaster(() => { // Define variables and constants Buffer <int> testBuffer = BufferFactory.NewBuffer <int>() .WithUsage(ResourceUsage.Write) .WithLength(300); Buffer <int> testCopyDest = testBuffer.Clone() .WithUsage(ResourceUsage.StagingRead) .WithPermittedBindings(GPUBindings.None); Buffer <decimal> testBuffer2 = testBuffer.Clone() .WithUsage(ResourceUsage.StagingReadWrite) .WithPermittedBindings(GPUBindings.None) .WithElementType <decimal>(); // Set up context // Execute testBuffer.Write(Enumerable.Range(0, 300).ToArray(), 0); testBuffer.CopyTo(testCopyDest); int[] copiedData = testCopyDest.Read(); for (int i = 0; i < copiedData.Length; ++i) { Assert.AreEqual(i, copiedData[i]); } testBuffer.Write(Enumerable.Range(0, 200).ToArray(), 100); testBuffer.CopyTo(testCopyDest); copiedData = testCopyDest.Read(); for (int i = 0; i < 100; ++i) { Assert.AreEqual(i, copiedData[i]); } for (int i = 100; i < 300; ++i) { Assert.AreEqual(i - 100, copiedData[i]); } testBuffer.Write(new ArraySlice <int>(Enumerable.Range(0, 200).ToArray(), 50, 50), 24); testBuffer.CopyTo(testCopyDest); copiedData = testCopyDest.Read(); for (int i = 24; i < 24 + 50; ++i) { Assert.AreEqual(i + 26, copiedData[i]); } #if !DEVELOPMENT && !RELEASE try { testBuffer.Write(new ArraySlice <int>(Enumerable.Range(0, 200).ToArray(), 50), 250); Assert.Fail(); } catch (AssuranceFailedException) { } #endif testBuffer2.Write(new decimal[] { 3m, 6m, 9m }, 101); decimal[] readData = testBuffer2.Read(); for (int i = 101; i < 1 - 4; ++i) { Assert.AreEqual((i - 100) * 3m, readData[i]); } // Assert outcome Assert.IsTrue(testBuffer.CanWrite); Assert.IsTrue(testBuffer2.CanWrite); testBuffer.Dispose(); testCopyDest.Dispose(); testBuffer2.Dispose(); }); }