public VertexBuffer(ID3D11Buffer buffer, uint strides, uint length) { _buffer = buffer ?? throw new ArgumentNullException(nameof(buffer)); Strides = strides; NumberOfVertices = length; Offset = 0; // TODO: offset needs to be configurable at some point }
/// <summary> /// Initializes a new instance of the <see cref="RenderTargetViewDescription"/> struct. /// </summary> /// <param name="buffer">Unused <see cref="ID3D11Buffer"/> </param> /// <param name="format"></param> /// <param name="firstElement"></param> /// <param name="numElements"></param> public RenderTargetViewDescription(ID3D11Buffer buffer, Format format, int firstElement, int numElements) : this() { Format = format; ViewDimension = RenderTargetViewDimension.Buffer; Buffer.FirstElement = firstElement; Buffer.NumElements = numElements; }
unsafe public static void UpdatePixelBuffer <T>(ID3D11DeviceContext context, ID3D11Buffer buffer, int slot, T data) where T : struct { MappedSubresource mappedResource = context.Map(buffer, MapMode.WriteDiscard, MapFlags.None); Unsafe.Write((void *)mappedResource.DataPointer, data); context.Unmap(buffer); context.PSSetConstantBuffer(slot, buffer); }
/// <summary> /// Initializes a new instance of the <see cref="ShaderResourceViewDescription1"/> struct. /// </summary> /// <param name="buffer">Unused <see cref="ID3D11Buffer"/> </param> /// <param name="format"></param> /// <param name="firstElement"></param> /// <param name="numElements"></param> /// <param name="flags"></param> public ShaderResourceViewDescription1(ID3D11Buffer buffer, Format format, int firstElement, int numElements, BufferExtendedShaderResourceViewFlags flags = BufferExtendedShaderResourceViewFlags.None) : this() { Format = format; ViewDimension = ShaderResourceViewDimension.BufferExtended; BufferEx.FirstElement = firstElement; BufferEx.NumElements = numElements; BufferEx.Flags = flags; }
public unsafe void CSSetConstantBuffer1(int slot, ID3D11Buffer constantBuffer, int[] firstConstant, int[] numConstants) { IntPtr nativePtr = constantBuffer == null ? IntPtr.Zero : constantBuffer.NativePointer; fixed(void *firstConstantPtr = &firstConstant[0]) fixed(void *numConstantsPtr = &numConstants[0]) { CSSetConstantBuffers1(slot, 1, new IntPtr(&nativePtr), (IntPtr)firstConstantPtr, (IntPtr)numConstantsPtr); } }
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 override bool Init(ID3D11Device Dx11Device, ShaderInitParams InitParams) { if (!base.Init(Dx11Device, InitParams)) { return(false); } ConstantExtraParameterBuffer = ConstantBufferFactory.ConstructBuffer <ExtraParameterBuffer>(Dx11Device, "ExtraBuffer"); return(true); }
public unsafe void DSSetConstantBuffer1(int startSlot, ID3D11Buffer constantBuffer, int[] firstConstant, int[] numConstants) { var constantBufferPtr = constantBuffer.NativePointer; DSSetConstantBuffers1(startSlot, 1, new IntPtr(&constantBufferPtr), (IntPtr)Unsafe.AsPointer(ref firstConstant[0]), (IntPtr)Unsafe.AsPointer(ref numConstants[0]) ); }
public void VSSetConstantBuffer1(int slot, ID3D11Buffer constantBuffer, int[] firstConstant, int[] numConstants) { var nativePtr = constantBuffer == null ? IntPtr.Zero : constantBuffer.NativePointer; unsafe { VSSetConstantBuffers1(slot, 1, new IntPtr(&nativePtr), (IntPtr)Unsafe.AsPointer(ref firstConstant[0]), (IntPtr)Unsafe.AsPointer(ref numConstants[0])); } }
/// <summary> /// Initializes a new instance of the <see cref="UnorderedAccessViewDescription1"/> struct. /// </summary> /// <param name="buffer"></param> /// <param name="format"></param> /// <param name="firstElement"></param> /// <param name="numElements"></param> /// <param name="flags"><see cref="BufferUnorderedAccessViewFlag"/> options flags for the resource.</param> public UnorderedAccessViewDescription1( ID3D11Buffer buffer, Format format, int firstElement = 0, int numElements = 0, BufferUnorderedAccessViewFlag flags = BufferUnorderedAccessViewFlag.None) : this() { Format = format; ViewDimension = UnorderedAccessViewDimension.Buffer; Buffer.FirstElement = firstElement; Buffer.NumElements = numElements; Buffer.Flags = flags; }
public static void IASetIndexBuffer(this ID3D11DeviceContext context, ID3D11Buffer indexBuffer, DXGI_FORMAT format = DXGI_FORMAT.DXGI_FORMAT_R32_UINT, int offset = 0) { if (context == null) { throw new ArgumentNullException(nameof(context)); } if (indexBuffer == null) { throw new ArgumentNullException(nameof(indexBuffer)); } context.IASetIndexBuffer(indexBuffer, format, (uint)offset); }
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 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 Result UpdateTileMappings( ID3D11Resource tiledResource, TiledResourceCoordinate[] tiledResourceRegionStartCoordinates, TileRegionSize[] tiledResourceRegionSizes, ID3D11Buffer tilePool, TileRangeFlags[] rangeFlags, int[] tilePoolStartOffsets, int[] rangeTileCounts, TileMappingFlags flags = TileMappingFlags.None) { return(UpdateTileMappings(tiledResource, tiledResourceRegionStartCoordinates.Length, tiledResourceRegionStartCoordinates, tiledResourceRegionSizes, tilePool, rangeFlags.Length, rangeFlags, tilePoolStartOffsets, rangeTileCounts, flags)); }
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); }
/// <summary> /// Initializes a new instance of the <see cref="VertexBufferView"/> struct. /// </summary> /// <param name="buffer">The <see cref="ID3D11Buffer"/> to bind.</param> /// <param name="stride">Specifies the size in bytes of each vertex entry.</param> /// <param name="offset">Offset.</param> public VertexBufferView(ID3D11Buffer buffer, int stride, int offset = 0) { Buffer = buffer; Stride = stride; Offset = offset; }
public unsafe Span <T> AsSpan <T>(ID3D11Buffer buffer) => new Span <T>(DataPointer.ToPointer(), buffer.Description.SizeInBytes);
public unsafe Span <T> AsSpan <T>(ID3D11Buffer buffer) where T : unmanaged { Span <byte> source = new(DataPointer.ToPointer(), buffer.Description.SizeInBytes); return(MemoryMarshal.Cast <byte, T>(source)); }
void CreateDeviceObjects() { var vertexShaderCode = @" cbuffer vertexBuffer : register(b0) { float4x4 ProjectionMatrix; }; struct VS_INPUT { float2 pos : POSITION; float4 col : COLOR0; float2 uv : TEXCOORD0; }; struct PS_INPUT { float4 pos : SV_POSITION; float4 col : COLOR0; float2 uv : TEXCOORD0; }; PS_INPUT main(VS_INPUT input) { PS_INPUT output; output.pos = mul(ProjectionMatrix, float4(input.pos.xy, 0.f, 1.f)); output.col = input.col; output.uv = input.uv; return output; }"; Compiler.Compile(vertexShaderCode, "main", "vs", "vs_4_0", out vertexShaderBlob, out var errorBlob); if (vertexShaderBlob == null) { throw new Exception("error compiling vertex shader"); } vertexShader = device.CreateVertexShader(vertexShaderBlob.GetBytes()); var inputElements = new[] { new InputElementDescription("POSITION", 0, Format.R32G32_Float, 0, 0, InputClassification.PerVertexData, 0), new InputElementDescription("TEXCOORD", 0, Format.R32G32_Float, 8, 0, InputClassification.PerVertexData, 0), new InputElementDescription("COLOR", 0, Format.R8G8B8A8_UNorm, 16, 0, InputClassification.PerVertexData, 0), }; inputLayout = device.CreateInputLayout(inputElements, vertexShaderBlob); var constBufferDesc = new BufferDescription { SizeInBytes = VertexConstantBufferSize, Usage = Vortice.Direct3D11.Usage.Dynamic, BindFlags = BindFlags.ConstantBuffer, CpuAccessFlags = CpuAccessFlags.Write }; constantBuffer = device.CreateBuffer(constBufferDesc); var pixelShaderCode = @"struct PS_INPUT { float4 pos : SV_POSITION; float4 col : COLOR0; float2 uv : TEXCOORD0; }; sampler sampler0; Texture2D texture0; float4 main(PS_INPUT input) : SV_Target { float4 out_col = input.col * texture0.Sample(sampler0, input.uv); return out_col; }"; Compiler.Compile(pixelShaderCode, "main", "ps", "ps_4_0", out pixelShaderBlob, out errorBlob); if (pixelShaderBlob == null) { throw new Exception("error compiling pixel shader"); } pixelShader = device.CreatePixelShader(pixelShaderBlob.GetBytes()); var blendDesc = new BlendDescription { AlphaToCoverageEnable = false }; blendDesc.RenderTarget[0] = new RenderTargetBlendDescription { IsBlendEnabled = true, SourceBlend = Blend.SourceAlpha, DestinationBlend = Blend.InverseSourceAlpha, BlendOperation = BlendOperation.Add, SourceBlendAlpha = Blend.InverseSourceAlpha, DestinationBlendAlpha = Blend.Zero, BlendOperationAlpha = BlendOperation.Add, RenderTargetWriteMask = ColorWriteEnable.All }; blendState = device.CreateBlendState(blendDesc); var rasterDesc = new RasterizerDescription { FillMode = FillMode.Solid, CullMode = CullMode.None, ScissorEnable = true, DepthClipEnable = true }; rasterizerState = device.CreateRasterizerState(rasterDesc); var stencilOpDesc = new DepthStencilOperationDescription(StencilOperation.Keep, StencilOperation.Keep, StencilOperation.Keep, ComparisonFunction.Always); var depthDesc = new DepthStencilDescription { DepthEnable = false, DepthWriteMask = DepthWriteMask.All, DepthFunc = ComparisonFunction.Always, StencilEnable = false, FrontFace = stencilOpDesc, BackFace = stencilOpDesc }; depthStencilState = device.CreateDepthStencilState(depthDesc); CreateFontsTexture(); }
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; } }
public IndexBuffer(ID3D11Buffer buffer, in int[] indices)
private D3D11GraphicsDevice(Window?window, SizeI size, Format depthStencilFormat = Format.D32_Float) { Window = window; Size = size; Factory = CreateDXGIFactory1 <IDXGIFactory2>(); using (IDXGIAdapter1 adapter = GetHardwareAdapter()) { DeviceCreationFlags creationFlags = DeviceCreationFlags.BgraSupport; #if DEBUG if (SdkLayersAvailable()) { creationFlags |= DeviceCreationFlags.Debug; } #endif if (D3D11CreateDevice( adapter, DriverType.Unknown, creationFlags, s_featureLevels, out ID3D11Device tempDevice, out FeatureLevel, out ID3D11DeviceContext tempContext).Failure) { // If the initialization fails, fall back to the WARP device. // For more information on WARP, see: // http://go.microsoft.com/fwlink/?LinkId=286690 D3D11CreateDevice( IntPtr.Zero, DriverType.Warp, creationFlags, s_featureLevels, out tempDevice, out FeatureLevel, out tempContext).CheckError(); } Device = tempDevice.QueryInterface <ID3D11Device1>(); DeviceContext = tempContext.QueryInterface <ID3D11DeviceContext1>(); tempContext.Dispose(); tempDevice.Dispose(); } if (window != null) { IntPtr hwnd = window.Handle; SwapChainDescription1 swapChainDescription = new() { Width = window.ClientSize.Width, Height = window.ClientSize.Height, Format = Format.R8G8B8A8_UNorm, BufferCount = FrameCount, BufferUsage = Usage.RenderTargetOutput, SampleDescription = SampleDescription.Default, Scaling = Scaling.Stretch, SwapEffect = SwapEffect.FlipDiscard, AlphaMode = AlphaMode.Ignore }; SwapChainFullscreenDescription fullscreenDescription = new SwapChainFullscreenDescription { Windowed = true }; SwapChain = Factory.CreateSwapChainForHwnd(Device, hwnd, swapChainDescription, fullscreenDescription); Factory.MakeWindowAssociation(hwnd, WindowAssociationFlags.IgnoreAltEnter); BackBufferTexture = SwapChain.GetBuffer <ID3D11Texture2D>(0); RenderTargetView = Device.CreateRenderTargetView(BackBufferTexture); } else { // Create offscreen texture OffscreenTexture = Device.CreateTexture2D(Format.R8G8B8A8_UNorm, Size.Width, Size.Height, 1, 1, null, BindFlags.ShaderResource | BindFlags.RenderTarget); RenderTargetView = Device.CreateRenderTargetView(OffscreenTexture); } if (depthStencilFormat != Format.Unknown) { DepthStencilTexture = Device.CreateTexture2D(depthStencilFormat, Size.Width, Size.Height, 1, 1, null, BindFlags.DepthStencil); DepthStencilView = Device.CreateDepthStencilView(DepthStencilTexture !, new DepthStencilViewDescription(DepthStencilTexture, DepthStencilViewDimension.Texture2D)); } ReadOnlySpan <VertexPositionColor> triangleVertices = stackalloc VertexPositionColor[] { new VertexPositionColor(new Vector3(0f, 0.5f, 0.0f), new Color4(1.0f, 0.0f, 0.0f, 1.0f)), new VertexPositionColor(new Vector3(0.5f, -0.5f, 0.0f), new Color4(0.0f, 1.0f, 0.0f, 1.0f)), new VertexPositionColor(new Vector3(-0.5f, -0.5f, 0.0f), new Color4(0.0f, 0.0f, 1.0f, 1.0f)) }; bool dynamic = false; if (dynamic) { _vertexBuffer = Device.CreateBuffer(VertexPositionColor.SizeInBytes * 3, BindFlags.VertexBuffer, ResourceUsage.Dynamic, CpuAccessFlags.Write); MappedSubresource mappedSubresource = DeviceContext.Map(_vertexBuffer, 0, MapMode.WriteDiscard); triangleVertices.CopyTo(mappedSubresource.AsSpan <VertexPositionColor>(3)); DeviceContext.Unmap(_vertexBuffer, 0); } else { _vertexBuffer = Device.CreateBuffer(triangleVertices, BindFlags.VertexBuffer); } InputElementDescription[] inputElementDescs = new[] { new InputElementDescription("POSITION", 0, Format.R32G32B32_Float, 0, 0), new InputElementDescription("COLOR", 0, Format.R32G32B32A32_Float, 12, 0) }; Span <byte> vertexShaderByteCode = CompileBytecode("Triangle.hlsl", "VSMain", "vs_4_0"); Span <byte> pixelShaderByteCode = CompileBytecode("Triangle.hlsl", "PSMain", "ps_4_0"); _vertexShader = Device.CreateVertexShader(vertexShaderByteCode); _pixelShader = Device.CreatePixelShader(pixelShaderByteCode); _inputLayout = Device.CreateInputLayout(inputElementDescs, vertexShaderByteCode); }
CreateBuffer(description, initialData, out ID3D11Buffer buffer).CheckError();
public void CopyTiles(ID3D11Resource tiledResource, TiledResourceCoordinate tileRegionStartCoordinate, TileRegionSize tileRegionSize, ID3D11Buffer buffer, ulong bufferStartOffsetInBytes) { CopyTiles(tiledResource, tileRegionStartCoordinate, tileRegionSize, buffer, bufferStartOffsetInBytes, TileCopyFlags.None); }
public void SetVertexBuffer(uint startSlot, ID3D11Buffer vertexBuffer, uint strides, uint offset) => SetVertexBuffer(startSlot, vertexBuffer.Handle, strides, offset);
internal D3D11Buffer(ID3D11Buffer buffer) { this.buffer = buffer; }
public ConstantBuffer(ID3D11Buffer buffer) { _buffer = buffer; }
public unsafe void CSSetConstantBuffers(int startSlot, ID3D11Buffer constantBuffer) { var constantBufferPtr = constantBuffer.NativePointer; CSSetConstantBuffers(startSlot, 1, new IntPtr(&constantBufferPtr)); }