Esempio n. 1
0
        public void PerformanceTest(IShaderExecutor shaderExecutor)
        {
            var bytecodeContainer = BytecodeContainer.Parse(File.ReadAllBytes("Shaders/VS/BasicHLSL_VS.o"));

            VirtualMachine.ShaderExecutor = shaderExecutor;
            var vm = new VirtualMachine(bytecodeContainer, 1);

            var globals = new BasicHlsl.ConstantBufferGlobals
            {
                WorldViewProjection = Matrix.LookAtRH(Vector3.UnitZ, Vector3.Zero, Vector3.UnitY)
                                      * Matrix.PerspectiveFovRH(MathUtil.PiOverFour, 1, 1, 10)
            };

            var vertexInput = new VertexPositionNormalTexture
            {
                Position          = new Vector4(3, 0, 2, 1),
                Normal            = new Vector3(0, 1, 0),
                TextureCoordinate = new Vector2(0, 1)
            };

            SetConstantBuffer(vm, 0, globals);

            vm.SetRegister(0, OperandType.ConstantBuffer, new RegisterIndex(1, 0), new Number4
            {
                Number0 = Number.FromInt(3), // nNumLights = 3
                Number1 = Number.FromInt(1)  // bTexture = true
            });

            vm.SetRegister(0, OperandType.Input, new RegisterIndex(0), vertexInput.Position.ToNumber4());
            vm.SetRegister(0, OperandType.Input, new RegisterIndex(1), vertexInput.Normal.ToNumber4());
            vm.SetRegister(0, OperandType.Input, new RegisterIndex(2), vertexInput.TextureCoordinate.ToNumber4());

            // Prime the pump by executing shader once.
            vm.Execute();

            var stopwatch = new Stopwatch();

            stopwatch.Start();

            const int iterations = 100000;

            for (var i = 0; i < iterations; i++)
            {
                vm.Execute();
            }

            stopwatch.Stop();

            Debug.WriteLine("Time: " + stopwatch.Elapsed);
        }
Esempio n. 2
0
        public void CanExecuteVertexShaderBasicHlsl(IShaderExecutor shaderExecutor)
        {
            // Arrange.
            VirtualMachine.ShaderExecutor = shaderExecutor;
            var vm = new VirtualMachine(BytecodeContainer.Parse(File.ReadAllBytes("Shaders/VS/BasicHLSL_VS.o")), 1);

            var globals = new BasicHlsl.ConstantBufferGlobals
            {
                WorldViewProjection = Matrix.LookAtRH(Vector3.UnitZ, Vector3.Zero, Vector3.UnitY)
                                      * Matrix.PerspectiveFovRH(MathUtil.PiOverFour, 1, 1, 10),
                NumLights = 3
            };

            var vertexInput = new VertexPositionNormalTexture
            {
                Position          = new Vector4(3, 0, 2, 1),
                Normal            = new Vector3(0, 1, 0),
                TextureCoordinate = new Vector2(0, 1)
            };

            var direct3DResult = Direct3DUtility.ExecuteVertexShader("Shaders/VS/BasicHLSL_VS.o", globals, vertexInput);

            SetConstantBuffer(vm, 0, globals);

            vm.SetConstantBufferRegisterValue(1, 0, new Number4
            {
                Number0 = Number.FromInt(3), // nNumLights = 3
                Number1 = Number.FromInt(1)  // bTexture = true
            });

            vm.SetInputRegisterValue(0, 0, 0, vertexInput.Position.ToNumber4());
            vm.SetInputRegisterValue(0, 0, 1, vertexInput.Normal.ToNumber4());
            vm.SetInputRegisterValue(0, 0, 2, vertexInput.TextureCoordinate.ToNumber4());

            // Act.
            vm.Execute();

            // Assert.
            var output0 = vm.GetOutputRegisterValue(0, 0);

            Assert.That(output0.Number0.Float, Is.EqualTo(direct3DResult.Position.X));
            Assert.That(output0.Number1.Float, Is.EqualTo(direct3DResult.Position.Y));
            Assert.That(output0.Number2.Float, Is.EqualTo(direct3DResult.Position.Z));
            Assert.That(output0.Number3.Float, Is.EqualTo(direct3DResult.Position.W));
        }
        public static BasicHlsl.VertexShaderOutput ExecuteVertexShader(string compiledShaderFile,
                                                                       BasicHlsl.ConstantBufferGlobals globals, VertexPositionNormalTexture vertex)
        {
            var device = new Device(DriverType.Warp);

            var vertexShaderBytes    = File.ReadAllBytes(compiledShaderFile);
            var vertexShaderBytecode = new ShaderBytecode(vertexShaderBytes);
            var vertexShader         = new VertexShader(device, vertexShaderBytecode);

            var layout = new InputLayout(device,
                                         ShaderSignature.GetInputSignature(vertexShaderBytecode),
                                         new[]
            {
                new InputElement("POSITION", 0, Format.R32G32B32A32_Float, 0, 0),
                new InputElement("NORMAL", 0, Format.R32G32B32_Float, 16, 0),
                new InputElement("TEXCOORD", 0, Format.R32G32_Float, 28, 0)
            });

            var vertices = Buffer.Create(device, BindFlags.VertexBuffer, new[] { vertex });

            var constantBuffer = Buffer.Create(device, ref globals, new BufferDescription
            {
                BindFlags      = BindFlags.ConstantBuffer,
                CpuAccessFlags = CpuAccessFlags.None,
                Usage          = ResourceUsage.Default
            });

            var geometryShader = new GeometryShader(device, vertexShaderBytecode,
                                                    new[]
            {
                new StreamOutputElement {
                    SemanticName = "SV_POSITION", ComponentCount = 4
                },
                new StreamOutputElement {
                    SemanticName = "COLOR", ComponentCount = 4
                },
                new StreamOutputElement {
                    SemanticName = "TEXCOORD", ComponentCount = 2
                }
            },
                                                    BasicHlsl.VertexShaderOutput.SizeInBytes);

            var outputBuffer = Buffer.Create(device, new BasicHlsl.VertexShaderOutput[1],
                                             new BufferDescription
            {
                CpuAccessFlags = CpuAccessFlags.None,
                BindFlags      = BindFlags.StreamOutput,
                Usage          = ResourceUsage.Default
            });

            var stagingBuffer = Buffer.Create(device, new BasicHlsl.VertexShaderOutput[1],
                                              new BufferDescription
            {
                CpuAccessFlags = CpuAccessFlags.Read,
                BindFlags      = BindFlags.None,
                Usage          = ResourceUsage.Staging
            });

            device.InputAssembler.InputLayout       = layout;
            device.InputAssembler.PrimitiveTopology = PrimitiveTopology.PointList;
            device.InputAssembler.SetVertexBuffers(0, new VertexBufferBinding(vertices, VertexPositionNormalTexture.SizeInBytes, 0));
            device.VertexShader.SetConstantBuffer(0, constantBuffer);
            device.VertexShader.Set(vertexShader);
            device.GeometryShader.Set(geometryShader);
            device.StreamOutput.SetTargets(new StreamOutputBufferBinding(outputBuffer, 0));

            device.Draw(1, 0);

            device.CopyResource(outputBuffer, stagingBuffer);
            device.Flush();

            var stream = stagingBuffer.Map(MapMode.Read, SharpDX.Direct3D10.MapFlags.None);
            var bytes  = new byte[BasicHlsl.VertexShaderOutput.SizeInBytes];

            stream.Read(bytes, 0, bytes.Length);
            stream.Dispose();

            outputBuffer.Dispose();
            vertices.Dispose();
            layout.Dispose();
            geometryShader.Dispose();
            vertexShader.Dispose();
            vertexShaderBytecode.Dispose();
            device.Dispose();

            return(StructUtility.FromBytes <BasicHlsl.VertexShaderOutput>(bytes));
        }