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); }
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)); }