コード例 #1
0
    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);
    }
コード例 #2
0
ファイル: D3D11Mesh.cs プロジェクト: ousttrue/ShrimpDX
 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);
 }
コード例 #3
0
ファイル: Program.cs プロジェクト: videolan/libvlcsharp
        static ID3D11Buffer *CreateBuffer(D3D11_BUFFER_DESC bd)
        {
            ID3D11Buffer *buffer;

            ThrowIfFailed(_d3dDevice->CreateBuffer(&bd, null, &buffer));

            return(buffer);
        }
コード例 #4
0
ファイル: D3D11Model.cs プロジェクト: ousttrue/ShrimpDX
        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);
        }
    }
}
コード例 #5
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);
        }
コード例 #6
0
        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);
        }
コード例 #7
0
ファイル: ID3D11Device.cs プロジェクト: ousttrue/ShrimpDX
        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));
        }
コード例 #8
0
ファイル: D3D11Reader.cs プロジェクト: ylyking/RdcFileRepack
    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);
    }
コード例 #9
0
ファイル: Chunk.cs プロジェクト: ylyking/RdcFileRepack
        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;
        }
コード例 #10
0
ファイル: Main.cs プロジェクト: zhuowp/DirectN
        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);
        }
コード例 #11
0
ファイル: Program.cs プロジェクト: dkushner/SlimDX
        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();
        }
コード例 #12
0
ファイル: Program.cs プロジェクト: videolan/libvlcsharp
        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);
        }
コード例 #13
0
ファイル: Program.cs プロジェクト: lenkasetGitHub/SlimDX-v2
        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();
        }
コード例 #14
0
        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();
                }
            }
        }