static void render(SwapChainPanel swapChainPanel) { ICommandListFactory commandListFactory = GetCommandListFactory(swapChainPanel); if (commandListFactory == null) { return; } RenderData _renderData = RenderData.Find(swapChainPanel, false); if (_renderData == null) { return; } Debug.WriteLine($"{nameof(SwapChainPanelPainter)}.{nameof(render)} _renderData={_renderData}"); GraphicsDevice _graphicsDevice = _renderData.graphicsDevice; if (_graphicsDevice == null) { return; } Veldrid.Swapchain _swapchain = _renderData.swapchain; if (_swapchain == null) { return; } Framebuffer _framebuffer = _renderData.framebuffer; if (_framebuffer == null) { return; } { Veldrid.CommandList _commandList = null; try { _commandList = commandListFactory.BuildCommandList(_graphicsDevice, _framebuffer); if (_commandList == null) { return; } _graphicsDevice.SubmitCommands(_commandList); _graphicsDevice.SwapBuffers(_swapchain); } catch (Exception E) { } finally { _commandList?.Dispose(); } } }
public void cleanup() { gd.WaitForIdle(); controller.Dispose(); cl.Dispose(); gd.Dispose(); }
public CommandList BuildCommandList(GraphicsDevice graphicsDevice, Framebuffer framebuffer) { Veldrid.CommandList _commandList = null; try { _commandList = graphicsDevice.ResourceFactory.CreateCommandList(); if (_commandList == null) { return(null); } _commandList.Begin(); _commandList.SetFramebuffer(framebuffer); _commandList.SetFullViewports(); _commandList.ClearColorTarget(0, RgbaFloat.DarkRed); _commandList.End(); Veldrid.CommandList vret = _commandList; _commandList = null; return(vret); } finally { _commandList?.Dispose(); } }
public override void Dispose() { base.Dispose(); Renderer.GraphicsDevice.WaitForIdle(); CommandList?.Dispose(); ModelBuffer?.Dispose(); ModelResourceSet?.Dispose(); }
unsafe public CommandList BuildCommandList(GraphicsDevice graphicsDevice, Framebuffer framebuffer) { ResourceFactory factory = graphicsDevice.ResourceFactory; Shader _vsShader = null; Shader _psShader = null; DeviceBuffer _vertexBuffer = null; Pipeline _pipeline = null; Veldrid.CommandList _commandList = null; try { #region --- try #region --- shaders { string _vsname = null; string _psname = null; switch (graphicsDevice.BackendType) { case GraphicsBackend.Direct3D11: _vsname = "Test_Colored2DVertices.vs"; _psname = "Test_Colored2DVertices.ps"; break; case GraphicsBackend.Metal: _vsname = "Test_Colored2DVertices_vs.msl"; _psname = "Test_Colored2DVertices_ps.msl"; break; case GraphicsBackend.Vulkan: _vsname = "Test_Colored2DVertices_vs.spv"; _psname = "Test_Colored2DVertices_ps.spv"; break; case GraphicsBackend.OpenGL: _vsname = "Test_Colored2DVertices_vs.glsl"; _psname = "Test_Colored2DVertices_ps.glsl"; break; case GraphicsBackend.OpenGLES: _vsname = "Test_Colored2DVertices_vs_es.glsl"; _psname = "Test_Colored2DVertices_ps_es.glsl"; break; } string _vs = loadResourceString(Assembly.GetExecutingAssembly(), _vsname); if (string.IsNullOrEmpty(_vs)) { return(null); } string _ps = loadResourceString(Assembly.GetExecutingAssembly(), _psname); if (string.IsNullOrEmpty(_ps)) { return(null); } ShaderDescription vertexShaderDesc = new ShaderDescription( ShaderStages.Vertex, Encoding.UTF8.GetBytes(_vs), "_VertexShader"); ShaderDescription fragmentShaderDesc = new ShaderDescription( ShaderStages.Fragment, Encoding.UTF8.GetBytes(_ps), "_PixelShader"); _vsShader = factory.CreateShader(vertexShaderDesc); _psShader = factory.CreateShader(fragmentShaderDesc); } #endregion VertexLayoutDescription _vertexLayout = new VertexLayoutDescription(); int _vertexCount; #region --- _vertexBuffer + _vertexLayout { int _count = 10; byte[] _data = Build_2DColoredQuads_16SNorm_8UNorm(_count, _count, out _vertexCount); // Veldrid.BufferDescription vbDescription = new Veldrid.BufferDescription( (uint)_data.Length, BufferUsage.VertexBuffer); _vertexBuffer = factory.CreateBuffer(vbDescription); fixed(byte *_pdata = _data) { graphicsDevice.UpdateBuffer(_vertexBuffer, bufferOffsetInBytes: 0, (IntPtr)_pdata, (uint)_data.Length); } _vertexLayout = new VertexLayoutDescription( new VertexElementDescription("Position", VertexElementSemantic.Position, VertexElementFormat.Short2_Norm, offset: 0), new VertexElementDescription("Color", VertexElementSemantic.Color, VertexElementFormat.Byte4_Norm, offset: 2 * sizeof(short))); } #endregion #region --- pipeline { GraphicsPipelineDescription _pipelineDescription = new GraphicsPipelineDescription(); _pipelineDescription.BlendState = Veldrid.BlendStateDescription.SingleOverrideBlend; _pipelineDescription.DepthStencilState = new Veldrid.DepthStencilStateDescription( depthTestEnabled: false, depthWriteEnabled: false, comparisonKind: ComparisonKind.LessEqual); _pipelineDescription.RasterizerState = new Veldrid.RasterizerStateDescription( cullMode: FaceCullMode.None, fillMode: PolygonFillMode.Solid, frontFace: FrontFace.Clockwise, depthClipEnabled: true, // Android ? scissorTestEnabled: false); _pipelineDescription.PrimitiveTopology = Veldrid.PrimitiveTopology.TriangleList; _pipelineDescription.ResourceLayouts = System.Array.Empty <ResourceLayout>(); _pipelineDescription.ShaderSet = new ShaderSetDescription( vertexLayouts: new VertexLayoutDescription[] { _vertexLayout }, shaders: new Shader[] { _vsShader, _psShader }); _pipelineDescription.Outputs = framebuffer.OutputDescription; // _offscreenFB.OutputDescription; _pipeline = factory.CreateGraphicsPipeline(_pipelineDescription); } #endregion #region --- commandList { _commandList = factory.CreateCommandList(); // Begin() must be called before commands can be issued. _commandList.Begin(); _commandList.SetPipeline(_pipeline); // We want to render directly to the output window. _commandList.SetFramebuffer(framebuffer); _commandList.SetFullViewports(); _commandList.ClearColorTarget(0, RgbaFloat.DarkRed); // Set all relevant state to draw our quad. _commandList.SetVertexBuffer(0, _vertexBuffer); _commandList.Draw(vertexCount: (uint)_vertexCount); // End() must be called before commands can be submitted for execution. _commandList.End(); } #endregion CommandList vret = _commandList; _commandList = null; return(vret); #endregion } catch (Exception e) { return(null); } finally { _vsShader?.Dispose(); _psShader?.Dispose(); _vertexBuffer?.Dispose(); _pipeline?.Dispose(); _commandList?.Dispose(); } }
static void PropertyChangedCallback(DependencyObject d, DependencyPropertyChangedEventArgs e) { D3D11Image d3D11Image = d as D3D11Image; if (d3D11Image == null) { return; } d3D11Image.OnRender = null; ICommandListFactory commandListFactory = e.NewValue as ICommandListFactory; if (commandListFactory == null) { return; } RenderData _renderData = RenderData.Find(d3D11Image, true); if (_renderData == null) { return; } GraphicsDevice _graphicsDevice = _renderData.graphicsDevice; if (_graphicsDevice == null) { return; } SharpDX.Direct3D11.Device _device = _renderData.device; if (_device == null) { return; } d3D11Image.OnRender = (IntPtr surface, bool isNewSurface) => { #region --- OnRender Framebuffer _framebuffer = _renderData.FrameBuffer(surface, isNewSurface); if (_framebuffer == null) { return; } Veldrid.CommandList commandList = null; try { commandList = commandListFactory.BuildCommandList(_graphicsDevice, _framebuffer); if (commandList == null) { return; } _graphicsDevice.SubmitCommands(commandList); } finally { commandList?.Dispose(); } _device.ImmediateContext.Flush(); #endregion }; }
static void Main(string[] args) { //AppDomain.CurrentDomain.ProcessExit+= (s,e)=>{} var path = Path.GetTempFileName(); System.IO.File.WriteAllText(path, testVGAOutputProgram); var assemblerInst = new assembler.Assembler(path); var assembledResult = assemblerInst.ConvertToBinary(); var binaryProgram = assembledResult.Select(x => Convert.ToInt32(x, 16)); //lets convert our final assembled program back to assembly instructions so we can view it. //dissasembly) var assembler2 = new assembler.Assembler(path); expandedCode = assembler2.ExpandMacros().ToArray(); simulatorInstance = new simulator.eightChipsSimulator(16, (int)Math.Pow(2, 16)); simulatorInstance.setUserCode(binaryProgram.ToArray()); //TODO use cancellation token here. simulationThread = Task.Run(() => { simulatorInstance.ProgramCounter = (int)assembler.Assembler.MemoryMap[assembler.Assembler.MemoryMapKeys.user_code].AbsoluteStart; simulatorInstance.runSimulation(); }); // Create window, GraphicsDevice, and all resources necessary for the demo. VeldridStartup.CreateWindowAndGraphicsDevice( new WindowCreateInfo(50, 50, 1280, 720, WindowState.Normal, "8 chips simulator 2"), new GraphicsDeviceOptions(true, null, true), out mainWindow, out gd); mainWindow.Resized += () => { gd.MainSwapchain.Resize((uint)mainWindow.Width, (uint)mainWindow.Height); controller.WindowResized(mainWindow.Width, mainWindow.Height); }; commandList = gd.ResourceFactory.CreateCommandList(); controller = new Veldrid.ImGuiRenderer(gd, gd.MainSwapchain.Framebuffer.OutputDescription, mainWindow.Width, mainWindow.Height); var data = simulatorInstance.mainMemory.Select(x => convertShortFormatToFullColor(Convert.ToInt32(x).ToBinary())).ToArray(); //try creating an texture and binding it to an image which imgui will draw... //we'll need to modify this image every frame potentially... var texture = gd.ResourceFactory.CreateTexture(TextureDescription.Texture2D(width, height, 1, 1, PixelFormat.R8_G8_B8_A8_UNorm, TextureUsage.Sampled)); CPUframeBufferTextureId = controller.GetOrCreateImGuiBinding(gd.ResourceFactory, texture); gd.UpdateTexture(texture, data, 0, 0, 0, width, height, 1, 0, 0); textureMap.Add(CPUframeBufferTextureId, texture); /* * var state = new object(); * var timer = new System.Threading.Timer((o) => * { * int[] newdata = simulatorInstance.mainMemory.Select(x => convertShortFormatToFullColor(x)).ToArray(); * var currenttexture = textureMap[CPUframeBufferTextureId]; * gd.UpdateTexture(currenttexture, newdata, 0, 0, 0, 256, 256, 1, 0, 0); * }, state, 1000, 150); * */ // Main application loop while (mainWindow.Exists) { InputSnapshot snapshot = mainWindow.PumpEvents(); if (!mainWindow.Exists) { break; } controller.Update(1f / 60f, snapshot); // Feed the input events to our ImGui controller, which passes them through to ImGui. SubmitUI(); commandList.Begin(); commandList.SetFramebuffer(gd.MainSwapchain.Framebuffer); commandList.ClearColorTarget(0, new RgbaFloat(.1f, .1f, .1f, .2f)); controller.Render(gd, commandList); commandList.End(); gd.SubmitCommands(commandList); gd.SwapBuffers(gd.MainSwapchain); } // Clean up Veldrid resources gd.WaitForIdle(); controller.Dispose(); commandList.Dispose(); gd.Dispose(); }