protected virtual ID3D11Buffer *CreateVertexBuffer() { var triangleVertices = stackalloc Vertex[3]; { triangleVertices[0] = new Vertex { Position = new Vector3(0.0f, 0.25f * AspectRatio, 0.0f), Color = new Vector4(1.0f, 0.0f, 0.0f, 1.0f) }; triangleVertices[1] = new Vertex { Position = new Vector3(0.25f, -0.25f * AspectRatio, 0.0f), Color = new Vector4(0.0f, 1.0f, 0.0f, 1.0f) }; triangleVertices[2] = new Vertex { Position = new Vector3(-0.25f, -0.25f * AspectRatio, 0.0f), Color = new Vector4(0.0f, 0.0f, 1.0f, 1.0f) }; } var vertexBufferSize = (uint)sizeof(Vertex) * 3; var vertexBufferDesc = new D3D11_BUFFER_DESC { ByteWidth = vertexBufferSize, Usage = D3D11_USAGE_DEFAULT, BindFlags = (uint)D3D11_BIND_VERTEX_BUFFER }; var vertexBufferData = new D3D11_SUBRESOURCE_DATA { pSysMem = triangleVertices }; ID3D11Buffer *vertexBuffer; ThrowIfFailed(D3DDevice->CreateBuffer(&vertexBufferDesc, &vertexBufferData, &vertexBuffer)); return(vertexBuffer); }
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); }
static ID3D11Buffer *CreateBuffer(D3D11_BUFFER_DESC bd) { ID3D11Buffer *buffer; ThrowIfFailed(_d3dDevice->CreateBuffer(&bd, null, &buffer)); return(buffer); }
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); } } }
public Handle <ResourceBuffer> Create(BufferCreation args) { Logger.Trace <BufferManager>($"Create {args.Type} with stride {args.Stride} usage {args.Usage}. InitialData: {args.InitialData.HasValue()}"); var handle = _resourcePool.CreateResource(); if (!handle.IsValid()) { throw new InvalidOperationException("Failed to Create a Buffer Handle"); } var bindFlag = args.Type switch { BufferTypes.ConstantBuffer => D3D11_BIND_FLAG.D3D11_BIND_CONSTANT_BUFFER, BufferTypes.IndexBuffer => D3D11_BIND_FLAG.D3D11_BIND_INDEX_BUFFER, BufferTypes.VertexBuffer => D3D11_BIND_FLAG.D3D11_BIND_VERTEX_BUFFER, _ => throw new ArgumentOutOfRangeException() }; var desc = new D3D11_BUFFER_DESC { BindFlags = bindFlag, Usage = args.Usage, CpuAccessFlags = args.CpuAccessFlags, MiscFlags = args.MiscFlags, ByteWidth = args.Count * args.Stride, StructureByteStride = args.Stride }; var buffer = _resourcePool.GetResourcePointer(handle); buffer->Handle = handle; buffer->BindFlag = bindFlag; buffer->Count = args.Count; buffer->CpuAccessFlag = args.CpuAccessFlags; buffer->MiscFlag = args.MiscFlags; buffer->Stride = args.Stride; buffer->Usage = args.Usage; if (args.InitialData.HasValue()) { var subResource = new D3D11_SUBRESOURCE_DATA { pSysMem = args.InitialData }; Common.CheckAndThrow(_device->CreateBuffer(&desc, &subResource, &buffer->Resource), nameof(ID3D11Device.CreateBuffer)); } else { Common.CheckAndThrow(_device->CreateBuffer(&desc, null, &buffer->Resource), nameof(ID3D11Device.CreateBuffer)); } return(handle); }
public virtual void GetDesc( out D3D11_BUFFER_DESC pDesc ) { var fp = GetFunctionPointer(10); if (m_GetDescFunc == null) { m_GetDescFunc = (GetDescFunc)Marshal.GetDelegateForFunctionPointer(fp, typeof(GetDescFunc)); } m_GetDescFunc(m_ptr, out pDesc); }
public virtual int CreateBuffer( ref D3D11_BUFFER_DESC pDesc, ref D3D11_SUBRESOURCE_DATA pInitialData, out ID3D11Buffer ppBuffer ) { var fp = GetFunctionPointer(3); if (m_CreateBufferFunc == null) { m_CreateBufferFunc = (CreateBufferFunc)Marshal.GetDelegateForFunctionPointer(fp, typeof(CreateBufferFunc)); } ppBuffer = new ID3D11Buffer(); return(m_CreateBufferFunc(m_ptr, ref pDesc, ref pInitialData, out ppBuffer.PtrForNew)); }
public static object Read_D3D11_BUFFER_DESC(BinaryReader br) { D3D11_BUFFER_DESC desc = new D3D11_BUFFER_DESC(); desc.offset = br.BaseStream.Position; desc.ByteWidth = br.ReadUInt32(); desc.Usage = (D3D11_USAGE)br.ReadUInt32(); desc.BindFlags = br.ReadUInt32(); desc.CPUAccessFlags = br.ReadUInt32(); desc.MiscFlags = br.ReadUInt32(); desc.StructureByteStride = br.ReadUInt32(); desc.length = br.BaseStream.Position - desc.offset; return(desc); }
public override void Load(ChunkMeta meta, BinaryReader br) { base.Load(meta, br); Descriptor = D3D11Reader.Read_D3D11_BUFFER_DESC(br) as D3D11_BUFFER_DESC; // Descriptor pInitialData = D3D11Reader.Read_D3D11_Nullable <D3D11_SUBRESOURCE_DATA>(br); // pInitialData resourceId = br.ReadUInt64(); // pBuffer int dataOffset; int count; D3D11Reader.Read_BytesArray(br, out dataOffset, out count, true); ulong InitialDataLength = br.ReadUInt64(); Debug.Assert((int)InitialDataLength == count); data = new D3D11_SUBRESOURCE_DATA(); data.pSysMem = null; data.SysMemPitch = Descriptor.ByteWidth; data.SysMemSlicePitch = Descriptor.ByteWidth; data.sysMemDataOffset = dataOffset; data.sysMemLength = count; }
private void Init() { // this code is ported from https://gist.github.com/d7samurai/261c69490cce0620d0bfc93003cd1052 var fac = DXGIFunctions.CreateDXGIFactory2(); var flags = D3D11_CREATE_DEVICE_FLAG.D3D11_CREATE_DEVICE_BGRA_SUPPORT; #if DEBUG flags |= D3D11_CREATE_DEVICE_FLAG.D3D11_CREATE_DEVICE_DEBUG; #endif var d3D11Device = D3D11Functions.D3D11CreateDevice(null, D3D_DRIVER_TYPE.D3D_DRIVER_TYPE_HARDWARE, flags, out _deviceContext); var mt = d3D11Device.As <ID3D11Multithread>(); mt?.SetMultithreadProtected(true); var desc = new DXGI_SWAP_CHAIN_DESC1(); desc.Format = DXGI_FORMAT.DXGI_FORMAT_B8G8R8A8_UNORM_SRGB; desc.SampleDesc.Count = 1; desc.BufferUsage = Constants.DXGI_USAGE_RENDER_TARGET_OUTPUT; desc.BufferCount = 2; // note: this causes a warning in debug // DXGI WARNING: IDXGIFactory::CreateSwapChain: Blt-model swap effects (DXGI_SWAP_EFFECT_DISCARD and DXGI_SWAP_EFFECT_SEQUENTIAL) are legacy swap effects that are predominantly superceded by their flip-model counterparts (DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL and DXGI_SWAP_EFFECT_FLIP_DISCARD). Please consider updating your application to leverage flip-model swap effects to benefit from modern presentation enhancements. More information is available at http://aka.ms/dxgiflipmodel. [ MISCELLANEOUS WARNING #294: ] _swapChain = fac.CreateSwapChainForHwnd <IDXGISwapChain1>(d3D11Device, Handle, desc); var frameBuffer = _swapChain.GetBuffer <ID3D11Texture2D>(0); _renderTargetView = d3D11Device.CreateRenderTargetView(frameBuffer); frameBuffer.Object.GetDesc(out var depthBufferDesc); _width = depthBufferDesc.Width; _height = depthBufferDesc.Height; depthBufferDesc.Format = DXGI_FORMAT.DXGI_FORMAT_D24_UNORM_S8_UINT; depthBufferDesc.BindFlags = (uint)D3D11_BIND_FLAG.D3D11_BIND_DEPTH_STENCIL; var depthBuffer = d3D11Device.CreateTexture2D <ID3D11Texture2D>(depthBufferDesc); _depthBufferView = d3D11Device.CreateDepthStencilView(depthBuffer); var vsBlob = D3D11Functions.D3DCompileFromFile("shaders.hlsl", "vs_main", "vs_5_0"); _vertexShader = d3D11Device.CreateVertexShader(vsBlob); var inputElements = new D3D11_INPUT_ELEMENT_DESC[] { new D3D11_INPUT_ELEMENT_DESC { SemanticName = "POS", Format = DXGI_FORMAT.DXGI_FORMAT_R32G32B32_FLOAT }, new D3D11_INPUT_ELEMENT_DESC { SemanticName = "NOR", Format = DXGI_FORMAT.DXGI_FORMAT_R32G32B32_FLOAT, AlignedByteOffset = unchecked ((uint)Constants.D3D11_APPEND_ALIGNED_ELEMENT) }, new D3D11_INPUT_ELEMENT_DESC { SemanticName = "TEX", Format = DXGI_FORMAT.DXGI_FORMAT_R32G32_FLOAT, AlignedByteOffset = unchecked ((uint)Constants.D3D11_APPEND_ALIGNED_ELEMENT) }, new D3D11_INPUT_ELEMENT_DESC { SemanticName = "COL", Format = DXGI_FORMAT.DXGI_FORMAT_R32G32B32A32_FLOAT, AlignedByteOffset = unchecked ((uint)Constants.D3D11_APPEND_ALIGNED_ELEMENT) }, }; _inputLayout = d3D11Device.CreateInputLayout(inputElements, vsBlob); var psBlob = D3D11Functions.D3DCompileFromFile("shaders.hlsl", "ps_main", "ps_5_0"); _pixelShader = d3D11Device.CreatePixelShader(psBlob); var rasterizerDesc = new D3D11_RASTERIZER_DESC(); rasterizerDesc.FillMode = D3D11_FILL_MODE.D3D11_FILL_SOLID; rasterizerDesc.CullMode = D3D11_CULL_MODE.D3D11_CULL_BACK; _rasterizerState = d3D11Device.CreateRasterizerState(rasterizerDesc); var samplerDesc = new D3D11_SAMPLER_DESC(); samplerDesc.Filter = D3D11_FILTER.D3D11_FILTER_MIN_MAG_MIP_POINT; samplerDesc.AddressU = D3D11_TEXTURE_ADDRESS_MODE.D3D11_TEXTURE_ADDRESS_BORDER; samplerDesc.AddressV = D3D11_TEXTURE_ADDRESS_MODE.D3D11_TEXTURE_ADDRESS_BORDER; samplerDesc.AddressW = D3D11_TEXTURE_ADDRESS_MODE.D3D11_TEXTURE_ADDRESS_BORDER; samplerDesc.BorderColor = new float[4]; samplerDesc.BorderColor[0] = 1; samplerDesc.BorderColor[1] = 1; samplerDesc.BorderColor[2] = 1; samplerDesc.BorderColor[3] = 1; samplerDesc.ComparisonFunc = D3D11_COMPARISON_FUNC.D3D11_COMPARISON_NEVER; _samplerState = d3D11Device.CreateSamplerState(samplerDesc); var depthStencilDesc = new D3D11_DEPTH_STENCIL_DESC(); depthStencilDesc.DepthEnable = true; depthStencilDesc.DepthWriteMask = D3D11_DEPTH_WRITE_MASK.D3D11_DEPTH_WRITE_MASK_ALL; depthStencilDesc.DepthFunc = D3D11_COMPARISON_FUNC.D3D11_COMPARISON_LESS; _depthStencilState = d3D11Device.CreateDepthStencilState(depthStencilDesc); var blendDesc = new D3D11_BLEND_DESC(); blendDesc.RenderTarget = new D3D11_RENDER_TARGET_BLEND_DESC[8]; blendDesc.RenderTarget[0].BlendEnable = true; blendDesc.RenderTarget[0].SrcBlend = D3D11_BLEND.D3D11_BLEND_SRC_ALPHA; blendDesc.RenderTarget[0].DestBlend = D3D11_BLEND.D3D11_BLEND_INV_SRC_ALPHA; blendDesc.RenderTarget[0].BlendOp = D3D11_BLEND_OP.D3D11_BLEND_OP_ADD; blendDesc.RenderTarget[0].SrcBlendAlpha = D3D11_BLEND.D3D11_BLEND_ZERO; blendDesc.RenderTarget[0].DestBlendAlpha = D3D11_BLEND.D3D11_BLEND_ZERO; blendDesc.RenderTarget[0].BlendOpAlpha = D3D11_BLEND_OP.D3D11_BLEND_OP_ADD; blendDesc.RenderTarget[0].RenderTargetWriteMask = (byte)(D3D11_COLOR_WRITE_ENABLE.D3D11_COLOR_WRITE_ENABLE_ALL); _blendState = d3D11Device.CreateBlendState(blendDesc); var constantBufferDesc = new D3D11_BUFFER_DESC(); constantBufferDesc.ByteWidth = (uint)Marshal.SizeOf <VS_CONSTANT_BUFFER>(); constantBufferDesc.Usage = D3D11_USAGE.D3D11_USAGE_DYNAMIC; constantBufferDesc.BindFlags = (uint)D3D11_BIND_FLAG.D3D11_BIND_CONSTANT_BUFFER; constantBufferDesc.CPUAccessFlags = (uint)D3D11_CPU_ACCESS_FLAG.D3D11_CPU_ACCESS_WRITE; if ((constantBufferDesc.ByteWidth % 16) != 0) { throw new InvalidOperationException("Constant buffer size must be a multiple of 16."); } _constantBuffer = d3D11Device.CreateBuffer(constantBufferDesc); var vertexBufferDesc = new D3D11_BUFFER_DESC(); var gc = GCHandle.Alloc(Data.VertexData, GCHandleType.Pinned); vertexBufferDesc.ByteWidth = (uint)Data.VertexData.SizeOf(); vertexBufferDesc.Usage = D3D11_USAGE.D3D11_USAGE_IMMUTABLE; vertexBufferDesc.BindFlags = (uint)D3D11_BIND_FLAG.D3D11_BIND_VERTEX_BUFFER; var vertexData = new D3D11_SUBRESOURCE_DATA(); vertexData.pSysMem = gc.AddrOfPinnedObject(); _vertexBuffer = d3D11Device.CreateBuffer(vertexBufferDesc, vertexData); gc.Free(); var indexBufferDesc = new D3D11_BUFFER_DESC(); gc = GCHandle.Alloc(Data.IndexData, GCHandleType.Pinned); indexBufferDesc.ByteWidth = (uint)Data.IndexData.SizeOf(); indexBufferDesc.Usage = D3D11_USAGE.D3D11_USAGE_IMMUTABLE; indexBufferDesc.BindFlags = (uint)D3D11_BIND_FLAG.D3D11_BIND_INDEX_BUFFER; var indexData = new D3D11_SUBRESOURCE_DATA(); indexData.pSysMem = gc.AddrOfPinnedObject(); _indexBuffer = d3D11Device.CreateBuffer(indexBufferDesc, indexData); gc.Free(); var textureDesc = new D3D11_TEXTURE2D_DESC(); textureDesc.Width = 20; textureDesc.Height = 20; textureDesc.MipLevels = 1; textureDesc.ArraySize = 1; textureDesc.Format = DXGI_FORMAT.DXGI_FORMAT_R8G8B8A8_UNORM_SRGB; textureDesc.SampleDesc.Count = 1; textureDesc.Usage = D3D11_USAGE.D3D11_USAGE_IMMUTABLE; textureDesc.BindFlags = (uint)D3D11_BIND_FLAG.D3D11_BIND_SHADER_RESOURCE; gc = GCHandle.Alloc(Data.TextureData, GCHandleType.Pinned); var textureData = new D3D11_SUBRESOURCE_DATA(); textureData.pSysMem = gc.AddrOfPinnedObject(); textureData.SysMemPitch = 20 * 4; // 4 bytes per pixel gc.Free(); var texture = d3D11Device.CreateTexture2D <ID3D11Texture2D>(textureDesc, textureData); _shaderResourceView = d3D11Device.CreateShaderResourceView(texture); }
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(); }
static void InitializeDirect3D() { var desc = new DXGI_SWAP_CHAIN_DESC { BufferDesc = new DXGI_MODE_DESC { Width = WIDTH, Height = HEIGHT, Format = DXGI_FORMAT_R8G8B8A8_UNORM, }, SampleDesc = new DXGI_SAMPLE_DESC { Count = 1 }, BufferCount = 1, Windowed = TRUE, OutputWindow = form.Handle, BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT, Flags = (uint)DXGI_SWAP_CHAIN_FLAG.DXGI_SWAP_CHAIN_FLAG_ALLOW_MODE_SWITCH }; uint creationFlags = 0; #if DEBUG creationFlags |= (uint)D3D11_CREATE_DEVICE_FLAG.D3D11_CREATE_DEVICE_DEBUG; #endif fixed(IDXGISwapChain **swapchain = &_swapchain) fixed(ID3D11Device **device = &_d3dDevice) fixed(ID3D11DeviceContext **context = &_d3dctx) { ThrowIfFailed(D3D11CreateDeviceAndSwapChain(null, D3D_DRIVER_TYPE_HARDWARE, IntPtr.Zero, creationFlags, null, 0, D3D11_SDK_VERSION, &desc, swapchain, device, null, context)); } ID3D10Multithread *pMultithread; var iid = IID_ID3D10Multithread; ThrowIfFailed(_d3dDevice->QueryInterface(&iid, (void **)&pMultithread)); pMultithread->SetMultithreadProtected(TRUE); pMultithread->Release(); var viewport = new D3D11_VIEWPORT { Height = HEIGHT, Width = WIDTH }; _d3dctx->RSSetViewports(1, &viewport); fixed(ID3D11Device **device = &_d3deviceVLC) fixed(ID3D11DeviceContext **context = &_d3dctxVLC) { ThrowIfFailed(D3D11CreateDevice(null, D3D_DRIVER_TYPE_HARDWARE, IntPtr.Zero, creationFlags | (uint)D3D11_CREATE_DEVICE_FLAG.D3D11_CREATE_DEVICE_VIDEO_SUPPORT, /* needed for hardware decoding */ null, 0, D3D11_SDK_VERSION, device, null, context)); } using ComPtr <ID3D11Resource> pBackBuffer = null; iid = IID_ID3D11Texture2D; ThrowIfFailed(_swapchain->GetBuffer(0, &iid, (void **)pBackBuffer.GetAddressOf())); fixed(ID3D11RenderTargetView **swapchainRenderTarget = &_swapchainRenderTarget) ThrowIfFailed(_d3dDevice->CreateRenderTargetView(pBackBuffer.Get(), null, swapchainRenderTarget)); pBackBuffer.Dispose(); fixed(ID3D11RenderTargetView **swapchainRenderTarget = &_swapchainRenderTarget) _d3dctx->OMSetRenderTargets(1, swapchainRenderTarget, null); ID3DBlob *VS, PS, pErrBlob; using ComPtr <ID3DBlob> vertexShaderBlob = null; fixed(byte *shader = Encoding.ASCII.GetBytes(DefaultShaders.HLSL)) fixed(byte *vshader = Encoding.ASCII.GetBytes("VShader")) fixed(byte *vs4 = Encoding.ASCII.GetBytes("vs_4_0")) fixed(byte *pshader = Encoding.ASCII.GetBytes("PShader")) fixed(byte *ps4 = Encoding.ASCII.GetBytes("ps_4_0")) { var result = D3DCompile(shader, (nuint)DefaultShaders.HLSL.Length, null, null, null, (sbyte *)vshader, (sbyte *)vs4, 0, 0, &VS, &pErrBlob); if (FAILED(result) && pErrBlob != null) { var errorMessage = Encoding.ASCII.GetString((byte *)pErrBlob->GetBufferPointer(), (int)pErrBlob->GetBufferSize()); Debug.WriteLine(errorMessage); ThrowIfFailed(result); } result = D3DCompile(shader, (nuint)DefaultShaders.HLSL.Length, null, null, null, (sbyte *)pshader, (sbyte *)ps4, 0, 0, &PS, &pErrBlob); if (FAILED(result) && pErrBlob != null) { var errorMessage = Encoding.ASCII.GetString((byte *)pErrBlob->GetBufferPointer(), (int)pErrBlob->GetBufferSize()); Debug.WriteLine(errorMessage); ThrowIfFailed(result); } } fixed(ID3D11VertexShader **vertexShader = &pVS) fixed(ID3D11PixelShader **pixelShader = &pPS) { ThrowIfFailed(_d3dDevice->CreateVertexShader(VS->GetBufferPointer(), VS->GetBufferSize(), null, vertexShader)); ThrowIfFailed(_d3dDevice->CreatePixelShader(PS->GetBufferPointer(), PS->GetBufferSize(), null, pixelShader)); } fixed(byte *position = Encoding.ASCII.GetBytes("POSITION")) fixed(byte *textcoord = Encoding.ASCII.GetBytes("TEXCOORD")) fixed(ID3D11InputLayout **shadersInputLayout = &pShadersInputLayout) { var inputElementDescs = stackalloc D3D11_INPUT_ELEMENT_DESC[2]; { inputElementDescs[0] = new D3D11_INPUT_ELEMENT_DESC { SemanticName = (sbyte *)position, SemanticIndex = 0, Format = DXGI_FORMAT_R32G32B32_FLOAT, InputSlot = 0, AlignedByteOffset = D3D11_APPEND_ALIGNED_ELEMENT, InputSlotClass = D3D11_INPUT_PER_VERTEX_DATA, InstanceDataStepRate = 0 }; inputElementDescs[1] = new D3D11_INPUT_ELEMENT_DESC { SemanticName = (sbyte *)textcoord, SemanticIndex = 0, Format = DXGI_FORMAT_R32G32_FLOAT, InputSlot = 0, AlignedByteOffset = D3D11_APPEND_ALIGNED_ELEMENT, InputSlotClass = D3D11_INPUT_PER_VERTEX_DATA, InstanceDataStepRate = 0 }; } ThrowIfFailed(_d3dDevice->CreateInputLayout(inputElementDescs, 2, VS->GetBufferPointer(), VS->GetBufferSize(), shadersInputLayout)); } var ourVerticles = new ShaderInput[4]; ourVerticles[0] = new ShaderInput { position = new Position { x = BORDER_LEFT, y = BORDER_BOTTOM, z = 0.0f }, texture = new Texture { x = 0.0f, y = 1.0f } }; ourVerticles[1] = new ShaderInput { position = new Position { x = BORDER_RIGHT, y = BORDER_BOTTOM, z = 0.0f }, texture = new Texture { x = 1.0f, y = 1.0f } }; ourVerticles[2] = new ShaderInput { position = new Position { x = BORDER_RIGHT, y = BORDER_TOP, z = 0.0f }, texture = new Texture { x = 1.0f, y = 0.0f } }; ourVerticles[3] = new ShaderInput { position = new Position { x = BORDER_LEFT, y = BORDER_TOP, z = 0.0f }, texture = new Texture { x = 0.0f, y = 0.0f } }; var verticlesSize = (uint)sizeof(ShaderInput) * 4; var bd = new D3D11_BUFFER_DESC { Usage = D3D11_USAGE_DYNAMIC, ByteWidth = verticlesSize, BindFlags = (uint)D3D11_BIND_VERTEX_BUFFER, CPUAccessFlags = (uint)D3D11_CPU_ACCESS_WRITE }; pVertexBuffer = CreateBuffer(bd); vertexBufferStride = Marshal.SizeOf(ourVerticles[0]); D3D11_MAPPED_SUBRESOURCE ms; ID3D11Resource *res; iid = IID_ID3D11Resource; ThrowIfFailed(pVertexBuffer->QueryInterface(&iid, (void **)&res)); ThrowIfFailed(_d3dctx->Map(res, 0, D3D11_MAP_WRITE_DISCARD, 0, &ms)); for (var i = 0; i < ourVerticles.Length; i++) { Marshal.StructureToPtr(ourVerticles[i], (IntPtr)ms.pData + (i * vertexBufferStride), false); } //Buffer.MemoryCopy(ms.pData, ourVerticles, verticlesSize, verticlesSize); _d3dctx->Unmap(res, 0); quadIndexCount = 6; var bufferDesc = new D3D11_BUFFER_DESC { Usage = D3D11_USAGE_DYNAMIC, ByteWidth = sizeof(ushort) * quadIndexCount, BindFlags = (uint)D3D11_BIND_INDEX_BUFFER, CPUAccessFlags = (uint)D3D11_CPU_ACCESS_WRITE }; pIndexBuffer = CreateBuffer(bufferDesc); ThrowIfFailed(pIndexBuffer->QueryInterface(&iid, (void **)&res)); ThrowIfFailed(_d3dctx->Map(res, 0, D3D11_MAP_WRITE_DISCARD, 0, &ms)); Marshal.WriteInt16((IntPtr)ms.pData, 0 * sizeof(ushort), 3); Marshal.WriteInt16((IntPtr)ms.pData, 1 * sizeof(ushort), 1); Marshal.WriteInt16((IntPtr)ms.pData, 2 * sizeof(ushort), 0); Marshal.WriteInt16((IntPtr)ms.pData, 3 * sizeof(ushort), 2); Marshal.WriteInt16((IntPtr)ms.pData, 4 * sizeof(ushort), 1); Marshal.WriteInt16((IntPtr)ms.pData, 5 * sizeof(ushort), 3); _d3dctx->Unmap(res, 0); _d3dctx->IASetPrimitiveTopology(D3D10_PRIMITIVE_TOPOLOGY_TRIANGLELIST); _d3dctx->IASetInputLayout(pShadersInputLayout); uint offset = 0; var vv = (uint)vertexBufferStride; fixed(ID3D11Buffer **buffer = &pVertexBuffer) _d3dctx->IASetVertexBuffers(0, 1, buffer, &vv, &offset); _d3dctx->IASetIndexBuffer(pIndexBuffer, DXGI_FORMAT_R16_UINT, 0); _d3dctx->VSSetShader(pVS, null, 0); _d3dctx->PSSetShader(pPS, null, 0); var samplerDesc = new D3D11_SAMPLER_DESC { Filter = D3D11_FILTER_MIN_MAG_LINEAR_MIP_POINT, AddressU = D3D11_TEXTURE_ADDRESS_CLAMP, AddressV = D3D11_TEXTURE_ADDRESS_CLAMP, AddressW = D3D11_TEXTURE_ADDRESS_CLAMP, ComparisonFunc = D3D11_COMPARISON_ALWAYS, MinLOD = 0, MaxLOD = D3D11_FLOAT32_MAX }; fixed(ID3D11SamplerState **ss = &samplerState) { ThrowIfFailed(_d3dDevice->CreateSamplerState(&samplerDesc, ss)); _d3dctx->PSSetSamplers(0, 1, ss); } fixed(RTL_CRITICAL_SECTION *sl = &sizeLock) InitializeCriticalSection(sl); }
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 override void OnInit() { Guid iid; IDXGIFactory1 * factory = null; IDXGIAdapter * adapter = null; ID3D11Texture2D *backBuffer = null; ID3DBlob * vertexShaderBlob = null; ID3DBlob * pixelShaderBlob = null; try { iid = IID_IDXGIFactory1; ThrowIfFailed(nameof(CreateDXGIFactory1), CreateDXGIFactory1(&iid, (void **)&factory)); if (UseWarpDevice) { throw new NotImplementedException("WARP Device not supported for D3D11."); } else { adapter = GetHardwareAdapter(factory); } fixed(ID3D11Device **device = &_device) fixed(ID3D11DeviceContext **immediateContext = &_immediateContext) { var featureLevel = D3D_FEATURE_LEVEL_11_0; ThrowIfFailed(nameof(D3D11CreateDevice), D3D11CreateDevice(adapter, D3D_DRIVER_TYPE_HARDWARE, Software: IntPtr.Zero, Flags: 0, &featureLevel, FeatureLevels: 1, D3D11_SDK_VERSION, device, pFeatureLevel: null, immediateContext)); } // Describe and create the swap chain. var swapChainDesc = new DXGI_SWAP_CHAIN_DESC { BufferDesc = new DXGI_MODE_DESC { Width = Width, Height = Height, Format = DXGI_FORMAT_R8G8B8A8_UNORM, }, SampleDesc = new DXGI_SAMPLE_DESC { Count = 1 }, BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT, BufferCount = FrameCount, OutputWindow = Win32Application.Hwnd, Windowed = TRUE, SwapEffect = DXGI_SWAP_EFFECT_DISCARD, }; fixed(IDXGISwapChain **swapChain = &_swapChain) { ThrowIfFailed(nameof(IDXGIFactory1.CreateSwapChain), factory->CreateSwapChain( (IUnknown *)_device, &swapChainDesc, swapChain )); } // This sample does not support fullscreen transitions. ThrowIfFailed(nameof(IDXGIFactory.MakeWindowAssociation), factory->MakeWindowAssociation(Win32Application.Hwnd, DXGI_MWA_NO_ALT_ENTER)); fixed(ID3D11RenderTargetView **renderTarget = &_renderTarget) { iid = IID_ID3D11Texture2D; ThrowIfFailed(nameof(IDXGISwapChain.GetBuffer), _swapChain->GetBuffer(0, &iid, (void **)&backBuffer)); ThrowIfFailed(nameof(ID3D11Device.CreateRenderTargetView), _device->CreateRenderTargetView((ID3D11Resource *)backBuffer, null, renderTarget)); _immediateContext->OMSetRenderTargets(1, renderTarget, pDepthStencilView: null); } var vp = new D3D11_VIEWPORT { Width = Width, Height = Height, MinDepth = 0.0f, MaxDepth = 1.0f, TopLeftX = 0, TopLeftY = 0, }; _immediateContext->RSSetViewports(1, &vp); var compileFlags = 0u; fixed(char *fileName = GetAssetFullPath(@"D3D11\Assets\Shaders\HelloTriangle.hlsl")) fixed(ID3D11VertexShader **vertexShader = &_vertexShader) fixed(ID3D11PixelShader **pixelShader = &_pixelShader) { var entryPoint = 0x00006E69614D5356; // VSMain var target = 0x0000305F345F7376; // vs_4_0 ThrowIfFailed(nameof(D3DCompileFromFile), D3DCompileFromFile((ushort *)fileName, null, null, (sbyte *)&entryPoint, (sbyte *)&target, compileFlags, 0, &vertexShaderBlob, null)); ThrowIfFailed(nameof(ID3D11Device.CreateVertexShader), _device->CreateVertexShader(vertexShaderBlob->GetBufferPointer(), vertexShaderBlob->GetBufferSize(), pClassLinkage: null, vertexShader)); entryPoint = 0x00006E69614D5350; // PSMain target = 0x0000305F345F7370; // ps_4_0 ThrowIfFailed(nameof(D3DCompileFromFile), D3DCompileFromFile((ushort *)fileName, null, null, (sbyte *)&entryPoint, (sbyte *)&target, compileFlags, 0, &pixelShaderBlob, null)); ThrowIfFailed(nameof(ID3D11Device.CreatePixelShader), _device->CreatePixelShader(pixelShaderBlob->GetBufferPointer(), pixelShaderBlob->GetBufferSize(), pClassLinkage: null, pixelShader)); } var inputElementDescs = stackalloc D3D11_INPUT_ELEMENT_DESC[2]; { var semanticName0 = stackalloc sbyte[9]; { ((ulong *)semanticName0)[0] = 0x4E4F495449534F50; // POSITION } inputElementDescs[0] = new D3D11_INPUT_ELEMENT_DESC { SemanticName = semanticName0, SemanticIndex = 0, Format = DXGI_FORMAT_R32G32B32_FLOAT, InputSlot = 0, AlignedByteOffset = 0, InputSlotClass = D3D11_INPUT_PER_VERTEX_DATA, InstanceDataStepRate = 0 }; var semanticName1 = 0x000000524F4C4F43; // COLOR inputElementDescs[1] = new D3D11_INPUT_ELEMENT_DESC { SemanticName = (sbyte *)&semanticName1, SemanticIndex = 0, Format = DXGI_FORMAT_R32G32B32A32_FLOAT, InputSlot = 0, AlignedByteOffset = 12, InputSlotClass = D3D11_INPUT_PER_VERTEX_DATA, InstanceDataStepRate = 0 }; } fixed(ID3D11InputLayout **inputLayout = &_inputLayout) { ThrowIfFailed(nameof(ID3D11Device.CreateInputLayout), _device->CreateInputLayout(inputElementDescs, NumElements: 2, vertexShaderBlob->GetBufferPointer(), vertexShaderBlob->GetBufferSize(), inputLayout)); } _immediateContext->IASetInputLayout(_inputLayout); var triangleVertices = stackalloc Vertex[3]; { triangleVertices[0] = new Vertex { Position = new Vector3(0.0f, 0.25f * AspectRatio, 0.0f), Color = new Vector4(1.0f, 0.0f, 0.0f, 1.0f) }; triangleVertices[1] = new Vertex { Position = new Vector3(0.25f, -0.25f * AspectRatio, 0.0f), Color = new Vector4(0.0f, 1.0f, 0.0f, 1.0f) }; triangleVertices[2] = new Vertex { Position = new Vector3(-0.25f, -0.25f * AspectRatio, 0.0f), Color = new Vector4(0.0f, 0.0f, 1.0f, 1.0f) }; } var vertexBufferSize = (uint)sizeof(Vertex) * 3; var vertexBufferDesc = new D3D11_BUFFER_DESC { ByteWidth = vertexBufferSize, Usage = D3D11_USAGE_DEFAULT, BindFlags = (uint)D3D11_BIND_VERTEX_BUFFER }; var vertexBufferData = new D3D11_SUBRESOURCE_DATA { pSysMem = triangleVertices }; fixed(ID3D11Buffer **vertexBuffer = &_vertexBuffer) { ThrowIfFailed(nameof(ID3D11Device.CreateBuffer), _device->CreateBuffer(&vertexBufferDesc, &vertexBufferData, vertexBuffer)); var stride = (uint)sizeof(Vertex); var offset = 0u; _immediateContext->IASetVertexBuffers(0, 1, vertexBuffer, &stride, &offset); } _immediateContext->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST); } finally { if (pixelShaderBlob != null) { _ = pixelShaderBlob->Release(); } if (vertexShaderBlob != null) { _ = vertexShaderBlob->Release(); } if (backBuffer != null) { _ = backBuffer->Release(); } if (adapter != null) { _ = adapter->Release(); } if (factory != null) { _ = factory->Release(); } } }