public override void InitBuffers(ID3D11Device d3d, ID3D11DeviceContext d3dContext) { vertexBuffer = d3d.CreateBuffer(BindFlags.VertexBuffer, LODs[0].Vertices, 0, ResourceUsage.Default, CpuAccessFlags.None); indexBuffer = d3d.CreateBuffer(BindFlags.IndexBuffer, LODs[0].Indices, 0, ResourceUsage.Default, CpuAccessFlags.None); InitTextures(d3d, d3dContext); }
private void UpdateBBox(ID3D11Device InDevice, ID3D11DeviceContext InDContext) { // Update vertex buffer VertexLayouts.BasicLayout.Vertex[] BBoxVertices = new VertexLayouts.BasicLayout.Vertex[Objects.Count * 8]; int CurrentBBoxIndex = 0; foreach (RenderBoundingBox BBox in Objects.Values) { VertexLayouts.BasicLayout.Vertex[] Cached = BBox.GetTransformVertices(); System.Array.Copy(Cached, 0, BBoxVertices, CurrentBBoxIndex * Cached.Length, Cached.Length); CurrentBBoxIndex++; } // Update index buffer uint[] BBoxIndices = new uint[Objects.Count * 24]; CurrentBBoxIndex = 0; foreach (RenderBoundingBox BBox in Objects.Values) { uint[] CopiedIndices = new uint[BBox.Indices.Length]; for (int i = 0; i < CopiedIndices.Length; i++) { int BBoxOffset = (CurrentBBoxIndex * 8); CopiedIndices[i] = (ushort)(BBox.Indices[i] + BBoxOffset); } System.Array.Copy(CopiedIndices, 0, BBoxIndices, CurrentBBoxIndex * BBox.Indices.Length, BBox.Indices.Length); CurrentBBoxIndex++; } SizeToRender = Objects.Count * 24; if (VertexBuffer == null && IndexBuffer == null) { VertexBuffer = InDevice.CreateBuffer(BindFlags.VertexBuffer, BBoxVertices, 0, ResourceUsage.Dynamic, CpuAccessFlags.Write); IndexBuffer = InDevice.CreateBuffer(BindFlags.IndexBuffer, BBoxIndices, 0, ResourceUsage.Dynamic, CpuAccessFlags.Write); } else { // TODO: Templatize this MappedSubresource mappedResource = InDContext.Map(VertexBuffer, MapMode.WriteDiscard, MapFlags.None); unsafe { UnsafeUtilities.Write(mappedResource.DataPointer, BBoxVertices); } InDContext.Unmap(VertexBuffer); mappedResource = InDContext.Map(IndexBuffer, MapMode.WriteDiscard, MapFlags.None); unsafe { UnsafeUtilities.Write(mappedResource.DataPointer, BBoxIndices); } InDContext.Unmap(IndexBuffer); } }
public void Draw(ID3D11Device device, ID3D11DeviceContext context, Span <D3D11_INPUT_ELEMENT_DESC> _layout) { if (!m_vertexBuffer) { using (var pin = PinPtr.Create(m_vertices)) { var desc = new D3D11_BUFFER_DESC { ByteWidth = (uint)m_vertices.Length, Usage = D3D11_USAGE._DEFAULT, BindFlags = (uint)D3D11_BIND_FLAG._VERTEX_BUFFER, }; var data = new D3D11_SUBRESOURCE_DATA { pSysMem = pin.Ptr }; device.CreateBuffer(ref desc, ref data, out m_vertexBuffer).ThrowIfFailed(); } } Span <IntPtr> pBufferTbl = stackalloc IntPtr[] { m_vertexBuffer.Ptr }; Span <uint> SizeTbl = stackalloc uint[] { (uint)m_vertexSize }; Span <uint> OffsetTbl = stackalloc uint[] { 0 }; context.IASetVertexBuffers(0, 1, ref MemoryMarshal.GetReference(pBufferTbl), ref MemoryMarshal.GetReference(SizeTbl), ref MemoryMarshal.GetReference(OffsetTbl)); if (!m_indexBuffer) { using (var pin = PinPtr.Create(m_indices)) { var desc = new D3D11_BUFFER_DESC { ByteWidth = (uint)m_indices.Length, Usage = D3D11_USAGE._DEFAULT, BindFlags = (uint)D3D11_BIND_FLAG._INDEX_BUFFER, }; var data = new D3D11_SUBRESOURCE_DATA { pSysMem = pin.Ptr }; device.CreateBuffer(ref desc, ref data, out m_indexBuffer).ThrowIfFailed(); } } context.IASetIndexBuffer(m_indexBuffer, m_indexFormat, 0); context.IASetPrimitiveTopology(D3D_PRIMITIVE_TOPOLOGY._TRIANGLELIST); context.DrawIndexed((uint)m_indexCount, 0, 0); } } }
private void UpdateLines(ID3D11Device InDevice, ID3D11DeviceContext InDContext) { // Update buffers List <VertexLayouts.BasicLayout.Vertex> TempLineVertices = new List <VertexLayouts.BasicLayout.Vertex>(); List <ushort> TempLineIndices = new List <ushort>(); int CurrentVertexCount = 0; foreach (RenderLine Line in Objects.Values) { TempLineVertices.AddRange(Line.GetVertices); ushort[] CopiedIndices = Line.GetStrippedIndices; for (uint x = 0; x < CopiedIndices.Length; x++) { CopiedIndices[x] += (ushort)(CurrentVertexCount); } TempLineIndices.AddRange(CopiedIndices.ToList()); TempLineIndices.Add(ushort.MaxValue); CurrentVertexCount = TempLineVertices.Count; } SizeToRender = TempLineIndices.Count; if (VertexBuffer == null && IndexBuffer == null) { VertexBuffer = InDevice.CreateBuffer(BindFlags.VertexBuffer, TempLineVertices.ToArray(), 0, ResourceUsage.Dynamic, CpuAccessFlags.Write); IndexBuffer = InDevice.CreateBuffer(BindFlags.IndexBuffer, TempLineIndices.ToArray(), 0, ResourceUsage.Dynamic, CpuAccessFlags.Write); } else { // TODO: Templatize this MappedSubresource mappedResource = InDContext.Map(VertexBuffer, MapMode.WriteDiscard, MapFlags.None); unsafe { UnsafeUtilities.Write(mappedResource.DataPointer, TempLineVertices.ToArray()); } InDContext.Unmap(VertexBuffer); mappedResource = InDContext.Map(IndexBuffer, MapMode.WriteDiscard, MapFlags.None); unsafe { UnsafeUtilities.Write(mappedResource.DataPointer, TempLineIndices.ToArray()); } InDContext.Unmap(IndexBuffer); } }
public override void InitBuffers(ID3D11Device d3d, ID3D11DeviceContext context) { if (vertices.Length != 0) { vertexBuffer = d3d.CreateBuffer(BindFlags.VertexBuffer, vertices, 0, ResourceUsage.Dynamic, CpuAccessFlags.Write); } }
public IntPtr GetPtr(ID3D11Device device) { if (!m_buffer) { var desc = new D3D11_BUFFER_DESC { ByteWidth = (uint)m_bytes.Length, Usage = D3D11_USAGE._DEFAULT, BindFlags = (uint)m_bind, }; if (MemoryMarshal.TryGetArray(m_bytes, out ArraySegment <byte> bytes)) { using (var pin = PinPtr.Create(bytes)) { var data = new D3D11_SUBRESOURCE_DATA { pSysMem = pin.Ptr }; device.CreateBuffer(ref desc, ref data, out m_buffer).ThrowIfFailed(); } } } return(m_buffer.Ptr); }
public static ID3D11Buffer ConstructBuffer <T>(ID3D11Device device, string debugName = "") where T : struct { var bufferDesc = new BufferDescription() { Usage = ResourceUsage.Dynamic, SizeInBytes = Unsafe.SizeOf <T>(), BindFlags = BindFlags.ConstantBuffer, CpuAccessFlags = CpuAccessFlags.Write, OptionFlags = ResourceOptionFlags.None, StructureByteStride = 0 }; ID3D11Buffer buffer = device.CreateBuffer(bufferDesc); buffer.DebugName = debugName; return(buffer); }
public D3D11Buffer(ID3D11Device device, uint sizeInBytes, BufferUsage usage, uint structureByteStride, bool rawBuffer) { _device = device; SizeInBytes = sizeInBytes; Usage = usage; _structureByteStride = structureByteStride; _rawBuffer = rawBuffer; Vortice.Direct3D11.BufferDescription bd = new Vortice.Direct3D11.BufferDescription( (int)sizeInBytes, D3D11Formats.VdToD3D11BindFlags(usage), ResourceUsage.Default); if ((usage & BufferUsage.StructuredBufferReadOnly) == BufferUsage.StructuredBufferReadOnly || (usage & BufferUsage.StructuredBufferReadWrite) == BufferUsage.StructuredBufferReadWrite) { if (rawBuffer) { bd.OptionFlags = ResourceOptionFlags.BufferAllowRawViews; } else { bd.OptionFlags = ResourceOptionFlags.BufferStructured; bd.StructureByteStride = (int)structureByteStride; } } if ((usage & BufferUsage.IndirectBuffer) == BufferUsage.IndirectBuffer) { bd.OptionFlags = ResourceOptionFlags.DrawIndirectArguments; } if ((usage & BufferUsage.Dynamic) == BufferUsage.Dynamic) { bd.Usage = ResourceUsage.Dynamic; bd.CpuAccessFlags = CpuAccessFlags.Write; } else if ((usage & BufferUsage.Staging) == BufferUsage.Staging) { bd.Usage = ResourceUsage.Staging; bd.CpuAccessFlags = CpuAccessFlags.Read | CpuAccessFlags.Write; } _buffer = device.CreateBuffer(bd); }
public override void InitBuffers(ID3D11Device d3d, ID3D11DeviceContext context) { vertexBuffer = d3d.CreateBuffer(BindFlags.VertexBuffer, Vertices, 0, ResourceUsage.Default, CpuAccessFlags.None); indexBuffer = d3d.CreateBuffer(BindFlags.IndexBuffer, Indices, 0, ResourceUsage.Default, CpuAccessFlags.None); Shader = RenderStorageSingleton.Instance.ShaderManager.shaders[2]; }
public override void InitBuffers(ID3D11Device d3d, ID3D11DeviceContext deviceContext) { vertexBuffer = d3d.CreateBuffer(BindFlags.VertexBuffer, vertices); indexBuffer = d3d.CreateBuffer(BindFlags.IndexBuffer, indices); }
static void Main() { ReferenceTracker.TrackReferences = true; Form form = new Form(); IDXGIFactory factory = DXGI.CreateFactory(); IDXGIAdapter adapter = null; factory.EnumAdapters(0, out adapter); DXGI_SWAP_CHAIN_DESC swapChainDescription = new DXGI_SWAP_CHAIN_DESC { BufferCount = 1, BufferDesc = new DXGI_MODE_DESC { Format = DXGI_FORMAT.DXGI_FORMAT_R8G8B8A8_UNORM, Height = form.ClientSize.Height, RefreshRate = new DXGI_RATIONAL { Denominator = 1, Numerator = 60 }, Scaling = DXGI_MODE_SCALING.DXGI_MODE_SCALING_UNSPECIFIED, ScanlineOrdering = DXGI_MODE_SCANLINE_ORDER.DXGI_MODE_SCANLINE_ORDER_UNSPECIFIED, Width = form.ClientSize.Width }, BufferUsage = (int)DXGI_USAGE.DXGI_USAGE_RENDER_TARGET_OUTPUT, Flags = 0, OutputWindow = form.Handle, SampleDesc = new DXGI_SAMPLE_DESC { Count = 1, Quality = 0 }, SwapEffect = DXGI_SWAP_EFFECT.DXGI_SWAP_EFFECT_DISCARD, Windowed = true }; ID3D11Device device = SlimDX.Direct3D11.Direct3D11.CreateDevice(adapter); IDXGISwapChain swapChain = null; factory.CreateSwapChain(device, swapChainDescription, out swapChain); ID3D11Texture2D backbuffer = swapChain.GetBuffer <ID3D11Texture2D>(0); ID3D11RenderTargetView view = null; device.CreateRenderTargetView(backbuffer, null, out view); ID3DBlob vertexShaderBytecode = ShaderCompiler.CompileFromString(File.ReadAllText("MiniTri11.fx"), "MiniTri11.fx", "VS", "vs_4_0"); ID3DBlob pixelShaderBytecode = ShaderCompiler.CompileFromString(File.ReadAllText("MiniTri11.fx"), "MiniTri11.fx", "PS", "ps_4_0"); D3D11_INPUT_ELEMENT_DESC[] inputElements = new[] { new D3D11_INPUT_ELEMENT_DESC { SemanticName = "POSITION", AlignedByteOffset = 0, SemanticIndex = 0, Format = DXGI_FORMAT.DXGI_FORMAT_R32G32B32A32_FLOAT, InstanceDataStepRate = 0, InputSlot = 0, InputSlotClass = D3D11_INPUT_CLASSIFICATION.D3D11_INPUT_PER_VERTEX_DATA }, new D3D11_INPUT_ELEMENT_DESC { SemanticName = "COLOR", AlignedByteOffset = 16, SemanticIndex = 0, Format = DXGI_FORMAT.DXGI_FORMAT_R32G32B32A32_FLOAT, InstanceDataStepRate = 0, InputSlot = 0, InputSlotClass = D3D11_INPUT_CLASSIFICATION.D3D11_INPUT_PER_VERTEX_DATA } }; ID3DBlob inputSignature; ShaderCompiler.D3DGetInputSignatureBlob(vertexShaderBytecode.GetBufferPointer(), vertexShaderBytecode.GetBufferSize(), out inputSignature); ID3D11InputLayout inputLayout; device.CreateInputLayout(inputElements, inputElements.Length, inputSignature.GetBufferPointer(), inputSignature.GetBufferSize(), out inputLayout); ByteBuffer vertexData = new ByteBuffer(3 * 32); vertexData.Write(0 * Vector4.SizeInBytes, new Vector4(0.0f, 0.5f, 0.5f, 1.0f)); vertexData.Write(1 * Vector4.SizeInBytes, new Vector4(1.0f, 0.0f, 0.0f, 1.0f)); vertexData.Write(2 * Vector4.SizeInBytes, new Vector4(0.5f, -0.5f, 0.5f, 1.0f)); vertexData.Write(3 * Vector4.SizeInBytes, new Vector4(0.0f, 1.0f, 0.0f, 1.0f)); vertexData.Write(4 * Vector4.SizeInBytes, new Vector4(-0.5f, -0.5f, 0.5f, 1.0f)); vertexData.Write(5 * Vector4.SizeInBytes, new Vector4(0.0f, 0.0f, 1.0f, 1.0f)); D3D11_BUFFER_DESC vertexBufferDescription = new D3D11_BUFFER_DESC { BindFlags = 1, //vertex buffer ByteWidth = 3 * 32, CPUAccessFlags = 0, MiscFlags = 0, Usage = D3D11_USAGE.D3D11_USAGE_DEFAULT, StructureByteStride = 0 }; ID3D11Buffer vertexBuffer; D3D11_SUBRESOURCE_DATA srd = new D3D11_SUBRESOURCE_DATA { pSysMem = vertexData.Pin(), SysMemPitch = 0, SysMemSlicePitch = 0 }; device.CreateBuffer(vertexBufferDescription, srd, out vertexBuffer); vertexData.Unpin(); RenderLoop loop = new RenderLoop(); ID3D11DeviceContext context = null; device.GetImmediateContext(out context); ID3D11VertexShader vertexShader; ID3D11PixelShader pixelShader; device.CreateVertexShader(vertexShaderBytecode.GetBufferPointer(), vertexShaderBytecode.GetBufferSize(), null, out vertexShader); device.CreatePixelShader(pixelShaderBytecode.GetBufferPointer(), pixelShaderBytecode.GetBufferSize(), null, out pixelShader); context.IASetInputLayout(inputLayout); context.VSSetShader(vertexShader, null, 0); context.PSSetShader(pixelShader, null, 0); context.IASetPrimitiveTopology(4); //triangle list context.IASetVertexBuffers(0, 1, new ID3D11Buffer[] { vertexBuffer }, new int[] { 32 }, new int[] { 0 }); context.OMSetRenderTargets(1, new ID3D11RenderTargetView[] { view }, IntPtr.Zero); D3D11_VIEWPORT vp = new D3D11_VIEWPORT { Height = form.ClientSize.Height, Width = form.ClientSize.Width, TopLeftX = 0, TopLeftY = 0, MinDepth = 0.0f, MaxDepth = 1.0f }; context.RSSetViewports(1, new D3D11_VIEWPORT [] { vp }); loop.Run(form, () => { var clearColor = new SlimDX.Color4 { R = 0.0f, G = 0.0f, B = 0.0f, A = 1.0f }; context.ClearRenderTargetView(view, clearColor); context.Draw(3, 0); swapChain.Present(0, 0); }); view.ReleaseReference(); backbuffer.ReleaseReference(); swapChain.ReleaseReference(); device.ReleaseReference(); adapter.ReleaseReference(); factory.ReleaseReference(); }
public void Render(ImDrawDataPtr data) { // Avoid rendering when minimized if (data.DisplaySize.X <= 0.0f || data.DisplaySize.Y <= 0.0f) { return; } ID3D11DeviceContext ctx = deviceContext; if (vertexBuffer == null || vertexBufferSize < data.TotalVtxCount) { vertexBuffer?.Release(); vertexBufferSize = data.TotalVtxCount + 5000; BufferDescription desc = new BufferDescription(); desc.Usage = Vortice.Direct3D11.Usage.Dynamic; desc.SizeInBytes = vertexBufferSize * sizeof(ImDrawVert); desc.BindFlags = BindFlags.VertexBuffer; desc.CpuAccessFlags = CpuAccessFlags.Write; vertexBuffer = device.CreateBuffer(desc); } if (indexBuffer == null || indexBufferSize < data.TotalIdxCount) { indexBuffer?.Release(); indexBufferSize = data.TotalIdxCount + 10000; BufferDescription desc = new BufferDescription(); desc.Usage = Vortice.Direct3D11.Usage.Dynamic; desc.SizeInBytes = indexBufferSize * sizeof(ImDrawIdx); desc.BindFlags = BindFlags.IndexBuffer; desc.CpuAccessFlags = CpuAccessFlags.Write; indexBuffer = device.CreateBuffer(desc); } // Upload vertex/index data into a single contiguous GPU buffer var vertexResource = ctx.Map(vertexBuffer, 0, MapMode.WriteDiscard, Vortice.Direct3D11.MapFlags.None); var indexResource = ctx.Map(indexBuffer, 0, MapMode.WriteDiscard, Vortice.Direct3D11.MapFlags.None); var vertexResourcePointer = (ImDrawVert *)vertexResource.DataPointer; var indexResourcePointer = (ImDrawIdx *)indexResource.DataPointer; for (int n = 0; n < data.CmdListsCount; n++) { var cmdlList = data.CmdListsRange[n]; var vertBytes = cmdlList.VtxBuffer.Size * sizeof(ImDrawVert); Buffer.MemoryCopy((void *)cmdlList.VtxBuffer.Data, vertexResourcePointer, vertBytes, vertBytes); var idxBytes = cmdlList.IdxBuffer.Size * sizeof(ImDrawIdx); Buffer.MemoryCopy((void *)cmdlList.IdxBuffer.Data, indexResourcePointer, idxBytes, idxBytes); vertexResourcePointer += cmdlList.VtxBuffer.Size; indexResourcePointer += cmdlList.IdxBuffer.Size; } ctx.Unmap(vertexBuffer, 0); ctx.Unmap(indexBuffer, 0); // Setup orthographic projection matrix into our constant buffer // Our visible imgui space lies from draw_data.DisplayPos (top left) to draw_data.DisplayPos+data_data.DisplaySize (bottom right). DisplayPos is (0,0) for single viewport apps. var constResource = ctx.Map(constantBuffer, 0, MapMode.WriteDiscard, Vortice.Direct3D11.MapFlags.None); var span = constResource.AsSpan <float>(VertexConstantBufferSize); float L = data.DisplayPos.X; float R = data.DisplayPos.X + data.DisplaySize.X; float T = data.DisplayPos.Y; float B = data.DisplayPos.Y + data.DisplaySize.Y; float[] mvp = { 2.0f / (R - L), 0.0f, 0.0f, 0.0f, 0.0f, 2.0f / (T - B), 0.0f, 0.0f, 0.0f, 0.0f, 0.5f, 0.0f, (R + L) / (L - R), (T + B) / (B - T), 0.5f, 1.0f, }; mvp.CopyTo(span); ctx.Unmap(constantBuffer, 0); SetupRenderState(data, ctx); // Render command lists // (Because we merged all buffers into a single one, we maintain our own offset into them) int global_idx_offset = 0; int global_vtx_offset = 0; Vector2 clip_off = data.DisplayPos; for (int n = 0; n < data.CmdListsCount; n++) { var cmdList = data.CmdListsRange[n]; for (int i = 0; i < cmdList.CmdBuffer.Size; i++) { var cmd = cmdList.CmdBuffer[i]; if (cmd.UserCallback != IntPtr.Zero) { throw new NotImplementedException("user callbacks not implemented"); } else { var rect = new Rect((int)(cmd.ClipRect.X - clip_off.X), (int)(cmd.ClipRect.Y - clip_off.Y), (int)(cmd.ClipRect.Z - clip_off.X), (int)(cmd.ClipRect.W - clip_off.Y)); ctx.RSSetScissorRects(rect); textureResources.TryGetValue(cmd.TextureId, out var texture); if (texture != null) { ctx.PSSetShaderResources(0, texture); } ctx.DrawIndexed((int)cmd.ElemCount, (int)(cmd.IdxOffset + global_idx_offset), (int)(cmd.VtxOffset + global_vtx_offset)); } } global_idx_offset += cmdList.IdxBuffer.Size; global_vtx_offset += cmdList.VtxBuffer.Size; } }