Ejemplo n.º 1
0
        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);
        }
Ejemplo n.º 2
0
        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();
        }
Ejemplo n.º 3
0
        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();
            });
        }
Ejemplo n.º 5
0
        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();
        }
Ejemplo n.º 6
0
        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();
        }
Ejemplo n.º 7
0
        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();
            });
        }
Ejemplo n.º 8
0
        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);
        }
Ejemplo n.º 9
0
        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();
            });
        }
Ejemplo n.º 10
0
        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();
            });
        }