Ejemplo n.º 1
0
        public void TestTextureCopy()
        {
            var shader = _framework.Graphics.Shaders.FromMemory <GorgonPixelShader>("PS",
                                                                                    "TestPSGeneric",
                                                                                    Resources.TextureShaders);

            var destTexture = _framework.Graphics.Textures.CreateTexture("Texture",
                                                                         new GorgonTexture2DSettings
            {
                ArrayCount = 1,
                Format     = BufferFormat.R8G8B8A8_UIntNormal,
                MipCount   = 4,
                Height     = 64,
                Width      = 64,
                Usage      = BufferUsage.Default
            });

            var sourceTexture = _framework.Graphics.Textures.CreateTexture <GorgonTexture2D>("Source", Resources.Glass, new GorgonGDIOptions
            {
                MipCount = 4
            });

            _framework.CreateTestScene(Shaders, Shaders, true);
            _framework.Graphics.Shaders.PixelShader.Current      = shader;
            _framework.Graphics.Shaders.PixelShader.Resources[1] = destTexture;

            destTexture.CopySubResource(sourceTexture);
            destTexture.CopySubResource(sourceTexture, new Rectangle(0, 0, 128, 128));
            destTexture.CopySubResource(sourceTexture, new Rectangle(0, 0, 128, 128), 4, 4);
            destTexture.CopySubResource(sourceTexture, new Rectangle(0, 0, 64, 64), 8, 8);
            destTexture.CopySubResource(sourceTexture, new Rectangle(0, 0, 64, 64), -4, -4);
            destTexture.CopySubResource(sourceTexture, new Rectangle(32, 32, 32, 32), 32, 32);
            destTexture.CopySubResource(sourceTexture, new Rectangle(16, 16, 16, 16), 0, 0);
            destTexture.CopySubResource(sourceTexture, new Rectangle(0, 0, 64, 64), 0, 1, 128);
            destTexture.CopySubResource(sourceTexture, new Rectangle(0, 0, 32, 32), 0, 2, 192);
            destTexture.CopySubResource(sourceTexture, new Rectangle(0, 0, 16, 16), 0, 3, 224);

            /*_framework.IdleFunc = () =>
             * {
             *  return false;
             * };*/

            Assert.IsTrue(_framework.Run() == DialogResult.Yes);
        }
Ejemplo n.º 2
0
        public void BindStructBuffer()
        {
            _framework.CreateTestScene(_sbShaders, _sbShaders, false);

            using (var buffer = _framework.Graphics.Buffers.CreateStructuredBuffer("SB", new GorgonStructuredBufferSettings
            {
                SizeInBytes = 48,
                StructureSize = 12
            }))
            {
                _bufferStream = new GorgonDataStream(48);

                _framework.Graphics.Shaders.VertexShader.Resources[0] = buffer;

                _framework.MaxTimeout = 10000;

                _framework.IdleFunc = () =>
                {
                    for (int i = 0; i < 4; i++)
                    {
                        var rnd = new Vector3(GorgonRandom.RandomSingle() * GorgonTiming.Delta,
                                              GorgonRandom.RandomSingle() * GorgonTiming.Delta,
                                              GorgonRandom.RandomSingle() * GorgonTiming.Delta);

                        _bufferStream.Write(rnd);
                    }

                    _bufferStream.Position = 0;
                    // ReSharper disable AccessToDisposedClosure
                    buffer.Update(_bufferStream);
                    // ReSharper restore AccessToDisposedClosure

                    return(false);
                };

                _framework.Run();
            }
        }
Ejemplo n.º 3
0
        public void ConcurrentRendering()
        {
            _tasks = new List <Task>();

            _wvp.World      = Matrix.Identity;
            _wvp.Projection = Matrix.Identity;
            _wvp.View       = Matrix.Identity;

            _framework.CreateTestScene(BaseShaders, BaseShaders, true);

            using (var constantBuffer = _framework.Graphics.Buffers.CreateConstantBuffer("WVP",
                                                                                         new GorgonConstantBufferSettings
            {
                SizeInBytes = DirectAccess.SizeOf <WVPBuffer>()
            }))
            {
                _commands     = new GorgonRenderCommands[2];
                _positions    = new Vector3[_commands.Length];
                _positions[0] = new Vector3(2.0f, 0, 6.0f);
                _bouncy       = new bool[_commands.Length];
                _deferred     = new[]
                {
                    _framework.Graphics.CreateDeferredGraphics(),
                        _framework.Graphics.CreateDeferredGraphics()
                };
                _framework.Graphics.Shaders.VertexShader.ConstantBuffers[0] = constantBuffer;

                _framework.Screen.BeforeSwapChainResized += (sender, e) =>
                {
                    for (int i = 0; i < _commands.Length; i++)
                    {
                        if (_commands[i] == null)
                        {
                            continue;
                        }

                        _commands[i].Dispose();
                        _commands[i] = null;
                    }

                    if (_deferred == null)
                    {
                        return;
                    }

                    for (int i = 0; i < _deferred.Length; i++)
                    {
                        _deferred[i].Dispose();
                        _deferred[i] = null;
                    }

                    _deferred = null;
                };

                _framework.Screen.AfterSwapChainResized += (sender, e) =>
                {
                    if (_deferred == null)
                    {
                        _deferred = new[]
                        {
                            _framework.Graphics.CreateDeferredGraphics(),
                                _framework.Graphics.CreateDeferredGraphics()
                        };
                    }

                    Matrix.PerspectiveFovLH(80.0f.Radians(), (float)_framework.Screen.Settings.Width / _framework.Screen.Settings.Height, 0.1f, 100.0f, out _wvp.Projection);
                    Matrix.Transpose(ref _wvp.Projection, out _wvp.Projection);

                    foreach (GorgonGraphics deferred in _deferred)
                    {
                        deferred.Shaders.VertexShader.ConstantBuffers[0] = constantBuffer;
                        deferred.Shaders.VertexShader.Current            = _framework.VertexShader;
                        deferred.Shaders.PixelShader.Current             = _framework.PixelShader;

                        deferred.Input.IndexBuffer      = _framework.Indices;
                        deferred.Input.Layout           = _framework.Layout;
                        deferred.Input.PrimitiveType    = PrimitiveType.TriangleList;
                        deferred.Input.VertexBuffers[0] = new GorgonVertexBufferBinding(_framework.Vertices, 40);

                        deferred.Output.SetRenderTarget(_framework.Screen, _framework.Screen.DepthStencilBuffer);

                        deferred.Rasterizer.SetViewport(new GorgonViewport(0,
                                                                           0,
                                                                           _framework.Screen.Settings.Width,
                                                                           _framework.Screen.Settings.Height,
                                                                           0,
                                                                           1));
                    }
                };

                _framework.IdleFunc = () =>
                {
                    _tasks.Clear();

                    UpdateDeferred(constantBuffer);

                    for (int i = 0; i < _commands.Length; i++)
                    {
                        var command = _commands[i];

                        using (command)
                        {
                            _framework.Graphics.ExecuteDeferred(command);
                        }
                        _commands[i] = null;
                    }

                    return(true);
                };

                Assert.IsTrue(_framework.Run() == DialogResult.Yes);
            }
        }
Ejemplo n.º 4
0
        public void TestComputeShader()
        {
            _framework.CreateTestScene(BaseShaders, BaseShaders, true, true);

            using (var compShader = _framework.Graphics.Shaders.CreateShader <GorgonComputeShader>("CompShader",
                                                                                                   "TestCS",
                                                                                                   BaseShaders))
            {
                var cbuffer = _framework.Graphics.Buffers.CreateConstantBuffer("CBuffer", new GorgonConstantBufferSettings
                {
                    SizeInBytes = 16
                });
                var cbuffer2 = _framework.Graphics.Buffers.CreateConstantBuffer("CBuffer2", new GorgonConstantBufferSettings
                {
                    SizeInBytes = 16
                });



                var view = ((GorgonTexture2D)_framework.Screen).GetUnorderedAccessView(BufferFormat.R8G8B8A8_UIntNormal);

                _framework.Screen.AfterSwapChainResized += (sender, e) =>
                {
                    view = ((GorgonTexture2D)_framework.Screen).GetUnorderedAccessView(BufferFormat.R8G8B8A8_UIntNormal);
                    using (var data = new GorgonDataStream(16))
                    {
                        data.Write(new Vector2(e.Width, e.Height));
                        data.Position = 0;
                        cbuffer.Update(data);
                    }
                };

                var texture = _framework.Graphics.Textures.CreateTexture <GorgonTexture2D>("Test", Resources.Glass,
                                                                                           new GorgonGDIOptions
                {
                    AllowUnorderedAccess = true,
                    Format =
                        BufferFormat.R8G8B8A8_UIntNormal
                });
                var test    = new Vector3(GorgonRandom.RandomSingle(0, 180.0f), GorgonRandom.RandomSingle(0, 180.0f), GorgonRandom.RandomSingle(0, 180.0f));
                var speed   = new Vector3(GorgonRandom.RandomSingle(5, 45), GorgonRandom.RandomSingle(5, 45), GorgonRandom.RandomSingle(5, 45));
                var testDir = new Vector3(1);
                _framework.IdleFunc = () =>
                {
                    //_framework.Screen.Clear(GorgonColor.White);
                    _framework.Graphics.Output.SetRenderTarget(null);
                    _framework.Graphics.Shaders.PixelShader.Resources[0] = null;

                    _framework.Graphics.Shaders.ComputeShader.Current                 = compShader;
                    _framework.Graphics.Shaders.ComputeShader.ConstantBuffers[0]      = cbuffer;
                    _framework.Graphics.Shaders.ComputeShader.ConstantBuffers[1]      = cbuffer2;
                    _framework.Graphics.Shaders.ComputeShader.UnorderedAccessViews[0] = view;
                    _framework.Graphics.Shaders.ComputeShader.Dispatch((_framework.Screen.Settings.Width + 10) / 10,
                                                                       (_framework.Screen.Settings.Height + 10) / 10, 1);

                    _framework.Graphics.Shaders.ComputeShader.UnorderedAccessViews[0] = null;
                    _framework.Graphics.Output.SetRenderTarget(_framework.Screen);

                    _framework.Graphics.Shaders.PixelShader.Resources[0] = texture;

                    test += Vector3.Modulate(testDir * GorgonTiming.Delta, speed);

                    /*if ((test >= 1.0f) || (test <= 0.0f))
                     * {
                     *      testDir *= -1.0f;
                     * }*/

                    if ((test.X > 359.9f) || (test.X <= 0.0f))
                    {
                        test.X     = test.X - 359.9f * -testDir.X;
                        speed.X    = GorgonRandom.RandomSingle(5, 180.0f);
                        testDir.X *= -1.0f;
                    }

                    if ((test.Y > 359.9f) || (test.Y <= 0.0f))
                    {
                        test.Y     = test.Y - 359.9f * -testDir.X;
                        speed.Y    = GorgonRandom.RandomSingle(5, 180);
                        testDir.Y *= -1.0f;
                    }

                    if ((test.Z > 359.9f) || (test.Z <= 0.0f))
                    {
                        test.Z     = test.Z - 359.9f * -testDir.Y;
                        speed.Z    = GorgonRandom.RandomSingle(5, 180);
                        testDir.Z *= -1.0f;
                    }

                    var animVal = new Vector3(test.X.Radians().Cos(), test.Y.Radians().Sin(), test.Z.Radians().Cos() * test.Z.Radians().Cos());
                    cbuffer2.Update(ref animVal);

                    return(false);
                };

                Assert.IsTrue(_framework.Run() == DialogResult.Yes);
            }
        }