public static ID3D11Device CreateD3Device() { Vortice.Direct3D.FeatureLevel[] supportedFeatureLevels = new[] { Vortice.Direct3D.FeatureLevel.Level_11_1, Vortice.Direct3D.FeatureLevel.Level_11_0, Vortice.Direct3D.FeatureLevel.Level_10_1, Vortice.Direct3D.FeatureLevel.Level_10_0, }; DriverType[] supportedDrivers = new[] { DriverType.Hardware, DriverType.Warp, }; Result result = default; foreach (DriverType driver in supportedDrivers) { result = D3D11.D3D11CreateDevice(null, driver, DeviceCreationFlags.BgraSupport, supportedFeatureLevels, out ID3D11Device device); if (result.Success) { return(device); } } throw new SharpGenException(result); }
/// <inheritdoc/> public override int CalculateSubResourceIndex(int mipSlice, int arraySlice, out int mipSize) { var desc = GetDescription(); mipSize = D3D11.CalculateMipSize(mipSlice, desc.Depth); return(D3D11.CalculateSubResourceIndex(mipSlice, arraySlice, desc.MipLevels)); }
public Rectangle(D3D11 d3d, SelectionManager items, OrthogonalCamera camera) { //_models = items; _items = items; _camera = camera; Device device = d3d.Device; //_color = new Vector4(0.0f, 0.0f, 0.0f, 0.1f); _color = new ColorVM(0.9f, 0.4f, 0.0f, 0.4f); //_color = new Vector4(0.9f, 0.4f, 0.0f, 0.4f); _isVisible = false; using (var bytecode = ShaderBytecodeExtension.CompileFromResource("pack://*****:*****@"Shader\Tools.Rectangle.hlsl", "VS", "vs_5_0", shaderFlags, EffectFlags.None)) { _vertexShader = ToDispose(new VertexShader(device, bytecode)); _inputLayout = ToDispose(new InputLayout(device, bytecode, new[] { new InputElement("POSITION", 0, Format.R32G32B32_Float, 0, 0, InputClassification.PerVertexData, 0) })); } using (var bytecode = ShaderBytecodeExtension.CompileFromResource("pack://*****:*****@"Shader\Tools.Rectangle.hlsl", "PS", "ps_5_0", shaderFlags, EffectFlags.None)) { _pixelShader = ToDispose(new PixelShader(device, bytecode)); } _globalBuffer = ToDispose(new Buffer(device, Matrix.SizeInBytes + Vector4.SizeInBytes, ResourceUsage.Dynamic, BindFlags.ConstantBuffer, CpuAccessFlags.Write, ResourceOptionFlags.None, 0)); using (var dataStream = new DataStream(Vector3.SizeInBytes * 4, true, true)) { dataStream.Write(new Vector3(0.0f, 0.0f, 1.0f)); dataStream.Write(new Vector3(0.0f, 1.0f, 1.0f)); dataStream.Write(new Vector3(1.0f, 1.0f, 1.0f)); dataStream.Write(new Vector3(1.0f, 0.0f, 1.0f)); dataStream.Position = 0; _buffer = ToDispose(new Buffer(device, dataStream, Vector3.SizeInBytes * 4, ResourceUsage.Default, BindFlags.VertexBuffer, CpuAccessFlags.None, ResourceOptionFlags.None, 0)); _bufferBinding = new VertexBufferBinding(_buffer, Vector3.SizeInBytes, 0); } using (var dataStream = new DataStream(sizeof(int) * 6, true, true)) { dataStream.Write(0); dataStream.Write(1); dataStream.Write(2); dataStream.Write(2); dataStream.Write(3); dataStream.Write(0); dataStream.Position = 0; _indexBuffer = ToDispose(new Buffer(device, dataStream, sizeof(int) * 6, ResourceUsage.Default, BindFlags.IndexBuffer, CpuAccessFlags.None, ResourceOptionFlags.None, 0)); } }
protected virtual void Dispose(bool disposing) { if (!isDisposed) { if (disposing) { if (D3D11 != null) { D3D11.Dispose(); D3D11 = null; } } isDisposed = true; } }
private void StartDesktopDuplicator(int adapterId, int outputId) { var adapter = factory.GetAdapter1(adapterId); D3D11.D3D11CreateDevice(adapter, DriverType.Unknown, DeviceCreationFlags.None, s_featureLevels, out device); var output = adapter.GetOutput(outputId); var output1 = output.QueryInterface <IDXGIOutput1>(); var bounds = output1.Description.DesktopCoordinates; var width = bounds.Right - bounds.Left; var height = bounds.Bottom - bounds.Top; var textureDesc = new Texture2DDescription { CpuAccessFlags = CpuAccessFlags.Read, BindFlags = BindFlags.None, Format = Format.B8G8R8A8_UNorm, Width = width / 2, Height = height / 2, OptionFlags = ResourceOptionFlags.None, MipLevels = 1, ArraySize = 1, SampleDescription = { Count = 1, Quality = 0 }, Usage = Usage.Staging }; stagingTexture = device.CreateTexture2D(textureDesc); var smallerTextureDesc = new Texture2DDescription { CpuAccessFlags = CpuAccessFlags.None, BindFlags = BindFlags.RenderTarget | BindFlags.ShaderResource, Format = Format.B8G8R8A8_UNorm, Width = width, Height = height, OptionFlags = ResourceOptionFlags.GenerateMips, MipLevels = 4, ArraySize = 1, SampleDescription = { Count = 1, Quality = 0 }, Usage = Usage.Default }; smallerTexture = device.CreateTexture2D(smallerTextureDesc); smallerTextureView = device.CreateShaderResourceView(smallerTexture); duplication = output1.DuplicateOutput(device); }
public static Bitmap CaptureScreenFrames(int screenId) { var factory = DXGI.CreateDXGIFactory1 <IDXGIFactory1>(); var adapter = factory.GetAdapter(0); var output = adapter.GetOutput(screenId); var output1 = output.QueryInterface <IDXGIOutput1>(); D3D11.D3D11CreateDevice(adapter, DriverType.Unknown, DeviceCreationFlags.None, s_featureLevels, out var device); var bounds = output1.Description.DesktopCoordinates; var textureDesc = new Texture2DDescription { CpuAccessFlags = CpuAccessFlags.Read, BindFlags = BindFlags.None, Format = Format.B8G8R8A8_UNorm, Width = bounds.Right - bounds.Left, Height = bounds.Bottom - bounds.Top, OptionFlags = ResourceOptionFlags.None, MipLevels = 1, ArraySize = 1, SampleDescription = { Count = 1, Quality = 0 }, Usage = Vortice.Direct3D11.Usage.Staging }; var duplication = output1.DuplicateOutput(device); var currentFrame = device.CreateTexture2D(textureDesc); Thread.Sleep(100); duplication.AcquireNextFrame(500, out var frameInfo, out var desktopResource); var tempTexture = desktopResource.QueryInterface <ID3D11Texture2D>(); device.ImmediateContext.CopyResource(currentFrame, tempTexture); var dataBox = device.ImmediateContext.Map(currentFrame, 0, MapMode.Read, Vortice.Direct3D11.MapFlags.None); var frame = new Bitmap(1920, 1080, PixelFormat.Format32bppRgb); var mapDest = frame.LockBits(new Rectangle(0, 0, 1920, 1080), ImageLockMode.WriteOnly, frame.PixelFormat); for (int y = 0, sizeInBytesToCopy = 1920 * 4; y < 1080; y++) { MemoryHelpers.CopyMemory(mapDest.Scan0 + y * mapDest.Stride, dataBox.DataPointer + y * dataBox.RowPitch, sizeInBytesToCopy); } frame.UnlockBits(mapDest); return(frame); }
void Run() { D3D11.D3D11CreateDevice(null, DriverType.Hardware, DeviceCreationFlags.None, null, out device, out deviceContext); var moduleHandle = GetModuleHandle(null); var wndClass = new WNDCLASSEX { Size = Unsafe.SizeOf <WNDCLASSEX>(), Styles = WindowClassStyles.CS_HREDRAW | WindowClassStyles.CS_VREDRAW | WindowClassStyles.CS_OWNDC, WindowProc = WndProc, InstanceHandle = moduleHandle, CursorHandle = LoadCursor(IntPtr.Zero, SystemCursor.IDC_ARROW), BackgroundBrushHandle = IntPtr.Zero, IconHandle = IntPtr.Zero, ClassName = "WndClass", }; RegisterClassEx(ref wndClass); var win32window = new Win32Window(wndClass.ClassName, "Vortice ImGui", 800, 600); var mainWindow = new MainWindow(win32window, device, deviceContext); windows.Add(mainWindow.Win32Window.Handle, mainWindow); mainWindow.Show(); while (!quitRequested) { if (PeekMessage(out var msg, IntPtr.Zero, 0, 0, PM_REMOVE)) { TranslateMessage(ref msg); DispatchMessage(ref msg); if (msg.Value == (uint)WindowMessage.Quit) { quitRequested = true; break; } } foreach (var window in windows.Values) { window.UpdateAndDraw(); } } }
public void Init(D3D11 d3d) { _device = d3d.Device; using (var bytecode = ShaderBytecodeExtension.CompileFromResource("pack://*****:*****@"Shader\Models.Polygon.hlsl", "VS", "vs_5_0", shaderFlags, EffectFlags.None)) { _vertexShader = ToDispose(new VertexShader(_device, bytecode)); _inputLayout = ToDispose(new InputLayout(_device, bytecode, new[] { new InputElement("POSITION", 0, Format.R32G32B32_Float, 0, 0, InputClassification.PerVertexData, 0) })); } //using (var bytecode = ShaderBytecode.CompileFromFile(@"Shader\Models.Polygon.hlsl", "PS", "ps_5_0", shaderFlags, EffectFlags.None)) using (var bytecode = ShaderBytecodeExtension.CompileFromResource("pack://application:,,,/Shader/Models.Polygon.hlsl", "PS", "ps_5_0")) { _pixelShader = ToDispose(new PixelShader(_device, bytecode)); } _globalBuffer = ToDispose(new Buffer(_device, Matrix.SizeInBytes + Vector4.SizeInBytes, ResourceUsage.Dynamic, BindFlags.ConstantBuffer, CpuAccessFlags.Write, ResourceOptionFlags.None, 0)); }
public D3DGraphic(SystemConfiguration windowConfig) { this.windowConfig = windowConfig; ShaderName shaderName = ShaderName.Texture; IShape shape = new Box2(); ModelShader.Get(shaderName, shape); d3d = new D3D11(windowConfig); camera = new Camera(); model = new Bitmap(d3d.Device, ModelShader.GetShaderEffect, shaderName, this.windowConfig, new Vector2(256, 256)); //model = new D3DModel(d3d.Device, ModelShader.GetModelForRender, ModelShader.GetIndexes); shader = new D3DShader(d3d.Device, ModelShader.GetShaderEffect, shaderName); graph.Add(d3d); graph.Add(model); graph.Add(shader); //camera.Position = new Vector3(-2, 1, -3); camera.Position = new Vector3(0.0f, 0.0f, -10.0f); }
public void Render(D3D11 renderer) { device = renderer.Device; context = device.ImmediateContext; target = renderer.RenderTargetView; context.InputAssembler.InputLayout = vertLayout; context.VertexShader.Set(vertexShader); context.PixelShader.Set(pixelShader); spin += 0.05f; SetShaderConstants(context, new GlobalConstants() { Spin = spin }); /* * for (int i = 0; i < 100; i ++) { * buffer[i * 3 + 0] = new VertexStruct(new Vector2((float)random.NextDouble() * 2 - 1, (float)random.NextDouble() * 2 - 1), new Color4((float) random.NextDouble(), (float)random.NextDouble(), (float)random.NextDouble(), 1)); * buffer[i * 3 + 1] = new VertexStruct(new Vector2((float)random.NextDouble() * 2 - 1, (float)random.NextDouble() * 2 - 1), new Color4((float)random.NextDouble(), (float)random.NextDouble(), (float)random.NextDouble(), 1)); * buffer[i * 3 + 2] = new VertexStruct(new Vector2((float)random.NextDouble() * 2 - 1, (float)random.NextDouble() * 2 - 1), new Color4((float)random.NextDouble(), (float)random.NextDouble(), (float)random.NextDouble(), 1)); * } */ buffer[0] = new VertexStruct(new Vector2(0, 0), new Color4(1, 1, 1, 1)); buffer[1] = new VertexStruct(new Vector2(1, 0), new Color4(1, 1, 1, 1)); buffer[2] = new VertexStruct(new Vector2(1, 1), new Color4(1, 0, 1, 1)); buffer[3] = new VertexStruct(new Vector2(0, 0), new Color4(1, 1, 1, 1)); buffer[4] = new VertexStruct(new Vector2(-1, -1), new Color4(0, 1, 1, 1)); buffer[5] = new VertexStruct(new Vector2(-1, 0), new Color4(1, 1, 1, 1)); context.ClearRenderTargetView(target, new Color4(0, 0, 0, 1)); FlushNoteBuffer(context, buffer, 6); }
public DefaultRenderer(D3D11 renderer) { random = new Random(); device = renderer.Device; context = device.ImmediateContext; target = renderer.RenderTargetView; unsafe { dxBuffer = new Buffer(device, new BufferDescription() { BindFlags = BindFlags.VertexBuffer, CpuAccessFlags = CpuAccessFlags.Write, OptionFlags = ResourceOptionFlags.None, SizeInBytes = sizeof(VertexStruct) * buffer.Length, Usage = ResourceUsage.Dynamic, StructureByteStride = 0 }); var constantsSize = sizeof(GlobalConstants); if (constantsSize % 16 != 0) { constantsSize += 16 - (constantsSize % 16); } globalConstants = new Buffer(device, new BufferDescription() { BindFlags = BindFlags.ConstantBuffer, CpuAccessFlags = CpuAccessFlags.Write, OptionFlags = ResourceOptionFlags.None, SizeInBytes = constantsSize, Usage = ResourceUsage.Dynamic, StructureByteStride = 0 }); } vertexShaderByteCode = ShaderBytecode.Compile(noteShaderData, "VS", "vs_4_0", ShaderFlags.None, EffectFlags.None); pixelShaderByteCode = ShaderBytecode.Compile(noteShaderData, "PS", "ps_4_0", ShaderFlags.None, EffectFlags.None); vertexShader = new VertexShader(device, vertexShaderByteCode); pixelShader = new PixelShader(device, pixelShaderByteCode); noteShader = new ShaderManager( device, ShaderBytecode.Compile(noteShaderData, "VS", "vs_4_0", ShaderFlags.None, EffectFlags.None), ShaderBytecode.Compile(noteShaderData, "PS", "ps_4_0", ShaderFlags.None, EffectFlags.None) ); vertLayout = new InputLayout(device, ShaderSignature.GetInputSignature(vertexShaderByteCode), new[] { new InputElement("POSITION", 0, Format.R32G32_Float, 0, 0), new InputElement("COLOR", 0, Format.R32G32B32A32_Float, 8, 0), }); //disabling backface culling, as well as some other stuff RasterizerStateDescription renderStateDesc = new RasterizerStateDescription { CullMode = CullMode.None, DepthBias = 0, DepthBiasClamp = 0, FillMode = FillMode.Solid, IsAntialiasedLineEnabled = false, IsDepthClipEnabled = false, IsFrontCounterClockwise = false, IsMultisampleEnabled = true, IsScissorEnabled = false, SlopeScaledDepthBias = 0 }; var rasterStateSolid = new RasterizerState(device, renderStateDesc); device.ImmediateContext.Rasterizer.State = rasterStateSolid; //transparency mode var renderTargetDesc = new RenderTargetBlendDescription(); renderTargetDesc.IsBlendEnabled = true; renderTargetDesc.SourceBlend = BlendOption.SourceAlpha; renderTargetDesc.DestinationBlend = BlendOption.InverseSourceAlpha; renderTargetDesc.BlendOperation = BlendOperation.Add; renderTargetDesc.SourceAlphaBlend = BlendOption.One; renderTargetDesc.DestinationAlphaBlend = BlendOption.One; renderTargetDesc.AlphaBlendOperation = BlendOperation.Add; renderTargetDesc.RenderTargetWriteMask = ColorWriteMaskFlags.All; BlendStateDescription desc = new BlendStateDescription(); desc.AlphaToCoverageEnable = false; desc.IndependentBlendEnable = false; desc.RenderTarget[0] = renderTargetDesc; var blendStateEnabled = new BlendState(device, desc); device.ImmediateContext.OutputMerger.SetBlendState(blendStateEnabled); }
public static void Init(D3D11 d3d, DXElement dxElement) { ShaderManager.Instance.Init(d3d); _dxElement = dxElement; }
public void Init(D3D11 d3d) { _device = d3d.Device; #region BoundingRect using (var bytecode = ShaderBytecodeExtension.CompileFromResource("pack://application:,,,/Shader/BaseModel/BoundingRect.hlsl", "VS", "vs_5_0")) { _vertexShaderBoundingRect = ToDispose(new VertexShader(_device, bytecode)); _inputLayoutBoundingRect = ToDispose(new InputLayout(_device, bytecode, new[] { new InputElement("POSITION", 0, Format.R32G32B32_Float, 0, 0, InputClassification.PerVertexData, 0) })); } using (var bytecode = ShaderBytecodeExtension.CompileFromResource("pack://application:,,,/Shader/BaseModel/BoundingRect.hlsl", "PS", "ps_5_0")) { _pixelShaderBoundingRect = ToDispose(new PixelShader(_device, bytecode)); } _globalBufferBoundingRect = ToDispose(new Buffer(_device, Matrix.SizeInBytes + Vector4.SizeInBytes, ResourceUsage.Dynamic, BindFlags.ConstantBuffer, CpuAccessFlags.Write, ResourceOptionFlags.None, 0)); _colorBoundingRect = new Vector4(100.0f / 255.0f, 149.0f / 255.0f, 237.0f / 255.0f, 1.0f); using (var dataStream = new DataStream(Vector3.SizeInBytes * 5, true, true)) { dataStream.Write(new Vector3(0.0f, 0.0f, 0.0f)); dataStream.Write(new Vector3(0.0f, 1.0f, 0.0f)); dataStream.Write(new Vector3(1.0f, 1.0f, 0.0f)); dataStream.Write(new Vector3(1.0f, 0.0f, 0.0f)); dataStream.Write(new Vector3(0.0f, 0.0f, 0.0f)); dataStream.Position = 0; _bufferBoundingRect = ToDispose(new Buffer(_device, dataStream, Vector3.SizeInBytes * 5, ResourceUsage.Default, BindFlags.VertexBuffer, CpuAccessFlags.None, ResourceOptionFlags.None, 0)); _bufferBindingBoundingRect = new VertexBufferBinding(_bufferBoundingRect, Vector3.SizeInBytes, 0); } #endregion #region Nodes _colorNodesBorders = new Vector4(100.0f / 255.0f, 149.0f / 255.0f, 237.0f / 255.0f, 1.0f); _colorNodesFill = new Vector4(1.0f, 1.0f, 1.0f, 1.0f); using (var bytecode = ShaderBytecodeExtension.CompileFromResource("pack://application:,,,/Shader/BaseModel/BoundingNodes.hlsl", "VS", "vs_5_0")) { _vertexShaderNodes = ToDispose(new VertexShader(_device, bytecode)); _inputLayoutNodes = ToDispose(new InputLayout(_device, bytecode, new[] { new InputElement("POSITION", 0, Format.R32G32B32A32_Float, 0, 0, InputClassification.PerVertexData, 0) })); } using (var bytecode = ShaderBytecodeExtension.CompileFromResource("pack://application:,,,/Shader/BaseModel/BoundingNodes.hlsl", "PS", "ps_5_0")) { _pixelShaderNodes = ToDispose(new PixelShader(_device, bytecode)); } _globalBufferNodes = ToDispose(new Buffer(_device, 2 * Matrix.SizeInBytes + 3 * Vector4.SizeInBytes, ResourceUsage.Dynamic, BindFlags.ConstantBuffer, CpuAccessFlags.Write, ResourceOptionFlags.None, 0)); using (var dataStream = new DataStream(Vector4.SizeInBytes * 32, true, true)) { dataStream.Write(new Vector4(-0.5f, -0.5f, -0.5f, -0.5f)); dataStream.Write(new Vector4(-0.5f, +0.5f, -0.5f, -0.5f)); dataStream.Write(new Vector4(+0.5f, +0.5f, -0.5f, -0.5f)); dataStream.Write(new Vector4(+0.5f, -0.5f, -0.5f, -0.5f)); dataStream.Write(new Vector4(-0.5f, -0.5f, 0.0f, -0.5f)); dataStream.Write(new Vector4(-0.5f, +0.5f, 0.0f, -0.5f)); dataStream.Write(new Vector4(+0.5f, +0.5f, 0.0f, -0.5f)); dataStream.Write(new Vector4(+0.5f, -0.5f, 0.0f, -0.5f)); dataStream.Write(new Vector4(-0.5f, -0.5f, 0.5f, -0.5f)); dataStream.Write(new Vector4(-0.5f, +0.5f, 0.5f, -0.5f)); dataStream.Write(new Vector4(+0.5f, +0.5f, 0.5f, -0.5f)); dataStream.Write(new Vector4(+0.5f, -0.5f, 0.5f, -0.5f)); dataStream.Write(new Vector4(-0.5f, -0.5f, -0.5f, 0.0f)); dataStream.Write(new Vector4(-0.5f, +0.5f, -0.5f, 0.0f)); dataStream.Write(new Vector4(+0.5f, +0.5f, -0.5f, 0.0f)); dataStream.Write(new Vector4(+0.5f, -0.5f, -0.5f, 0.0f)); dataStream.Write(new Vector4(-0.5f, -0.5f, 0.5f, 0.0f)); dataStream.Write(new Vector4(-0.5f, +0.5f, 0.5f, 0.0f)); dataStream.Write(new Vector4(+0.5f, +0.5f, 0.5f, 0.0f)); dataStream.Write(new Vector4(+0.5f, -0.5f, 0.5f, 0.0f)); dataStream.Write(new Vector4(-0.5f, -0.5f, -0.5f, +0.5f)); dataStream.Write(new Vector4(-0.5f, +0.5f, -0.5f, +0.5f)); dataStream.Write(new Vector4(+0.5f, +0.5f, -0.5f, +0.5f)); dataStream.Write(new Vector4(+0.5f, -0.5f, -0.5f, +0.5f)); dataStream.Write(new Vector4(-0.5f, -0.5f, 0.0f, +0.5f)); dataStream.Write(new Vector4(-0.5f, +0.5f, 0.0f, +0.5f)); dataStream.Write(new Vector4(+0.5f, +0.5f, 0.0f, +0.5f)); dataStream.Write(new Vector4(+0.5f, -0.5f, 0.0f, +0.5f)); dataStream.Write(new Vector4(-0.5f, -0.5f, 0.5f, +0.5f)); dataStream.Write(new Vector4(-0.5f, +0.5f, 0.5f, +0.5f)); dataStream.Write(new Vector4(+0.5f, +0.5f, 0.5f, +0.5f)); dataStream.Write(new Vector4(+0.5f, -0.5f, 0.5f, +0.5f)); dataStream.Position = 0; _bufferNodes = ToDispose(new Buffer(_device, dataStream, Vector4.SizeInBytes * 32, ResourceUsage.Default, BindFlags.VertexBuffer, CpuAccessFlags.None, ResourceOptionFlags.None, 0)); _bufferBindingNodes = new VertexBufferBinding(_bufferNodes, Vector4.SizeInBytes, 0); } using (var dataStream = new DataStream(sizeof(int) * 64, true, true)) { dataStream.Write(0 + 0); dataStream.Write(1 + 0); dataStream.Write(1 + 0); dataStream.Write(2 + 0); dataStream.Write(2 + 0); dataStream.Write(3 + 0); dataStream.Write(3 + 0); dataStream.Write(0 + 0); dataStream.Write(0 + 4); dataStream.Write(1 + 4); dataStream.Write(1 + 4); dataStream.Write(2 + 4); dataStream.Write(2 + 4); dataStream.Write(3 + 4); dataStream.Write(3 + 4); dataStream.Write(0 + 4); dataStream.Write(0 + 8); dataStream.Write(1 + 8); dataStream.Write(1 + 8); dataStream.Write(2 + 8); dataStream.Write(2 + 8); dataStream.Write(3 + 8); dataStream.Write(3 + 8); dataStream.Write(0 + 8); dataStream.Write(0 + 12); dataStream.Write(1 + 12); dataStream.Write(1 + 12); dataStream.Write(2 + 12); dataStream.Write(2 + 12); dataStream.Write(3 + 12); dataStream.Write(3 + 12); dataStream.Write(0 + 12); dataStream.Write(0 + 16); dataStream.Write(1 + 16); dataStream.Write(1 + 16); dataStream.Write(2 + 16); dataStream.Write(2 + 16); dataStream.Write(3 + 16); dataStream.Write(3 + 16); dataStream.Write(0 + 16); dataStream.Write(0 + 20); dataStream.Write(1 + 20); dataStream.Write(1 + 20); dataStream.Write(2 + 20); dataStream.Write(2 + 20); dataStream.Write(3 + 20); dataStream.Write(3 + 20); dataStream.Write(0 + 20); dataStream.Write(0 + 24); dataStream.Write(1 + 24); dataStream.Write(1 + 24); dataStream.Write(2 + 24); dataStream.Write(2 + 24); dataStream.Write(3 + 24); dataStream.Write(3 + 24); dataStream.Write(0 + 24); dataStream.Write(0 + 28); dataStream.Write(1 + 28); dataStream.Write(1 + 28); dataStream.Write(2 + 28); dataStream.Write(2 + 28); dataStream.Write(3 + 28); dataStream.Write(3 + 28); dataStream.Write(0 + 28); dataStream.Position = 0; _indexBufferNodesLines = ToDispose(new Buffer(_device, dataStream, sizeof(int) * 64, ResourceUsage.Default, BindFlags.IndexBuffer, CpuAccessFlags.None, ResourceOptionFlags.None, 0)); } using (var dataStream = new DataStream(sizeof(int) * 6 * 8, true, true)) { dataStream.Write(0 + 0); dataStream.Write(1 + 0); dataStream.Write(2 + 0); dataStream.Write(2 + 0); dataStream.Write(3 + 0); dataStream.Write(0 + 0); dataStream.Write(0 + 4); dataStream.Write(1 + 4); dataStream.Write(2 + 4); dataStream.Write(2 + 4); dataStream.Write(3 + 4); dataStream.Write(0 + 4); dataStream.Write(0 + 8); dataStream.Write(1 + 8); dataStream.Write(2 + 8); dataStream.Write(2 + 8); dataStream.Write(3 + 8); dataStream.Write(0 + 8); dataStream.Write(0 + 12); dataStream.Write(1 + 12); dataStream.Write(2 + 12); dataStream.Write(2 + 12); dataStream.Write(3 + 12); dataStream.Write(0 + 12); dataStream.Write(0 + 16); dataStream.Write(1 + 16); dataStream.Write(2 + 16); dataStream.Write(2 + 16); dataStream.Write(3 + 16); dataStream.Write(0 + 16); dataStream.Write(0 + 20); dataStream.Write(1 + 20); dataStream.Write(2 + 20); dataStream.Write(2 + 20); dataStream.Write(3 + 20); dataStream.Write(0 + 20); dataStream.Write(0 + 24); dataStream.Write(1 + 24); dataStream.Write(2 + 24); dataStream.Write(2 + 24); dataStream.Write(3 + 24); dataStream.Write(0 + 24); dataStream.Write(0 + 28); dataStream.Write(1 + 28); dataStream.Write(2 + 28); dataStream.Write(2 + 28); dataStream.Write(3 + 28); dataStream.Write(0 + 28); dataStream.Position = 0; _indexBufferNodesTriangles = ToDispose(new Buffer(_device, dataStream, sizeof(int) * 6 * 8, ResourceUsage.Default, BindFlags.IndexBuffer, CpuAccessFlags.None, ResourceOptionFlags.None, 0)); } #endregion }
public static void Init(D3D11 d3d) { ShaderManager.Instance.Init(d3d); }
public static DesktopDuplicatorInternal CreateDesktopDuplicator(ILogger logger, int adapterIndex, int outputDeviceIndex) { var dd = new DesktopDuplicatorInternal { _outputDeviceIndex = outputDeviceIndex }; var createFactoryResult = DXGI.CreateDXGIFactory1(out IDXGIFactory1 factory); if (!createFactoryResult.Success) { throw new DesktopDuplicationException("Couldn't create a DXGI Factory."); } IDXGIAdapter1 adapter = null; IDXGIOutput output = null; try { var result = factory.EnumAdapters1(adapterIndex, out adapter); if (result.Failure) { throw new DesktopDuplicationException($"An error occurred attempting to retrieve the adapter at the specified index ({adapterIndex}): {result}"); } if (adapter == null) { throw new DesktopDuplicationException($"An adapter was not found at the specified index ({adapterIndex})."); } logger.LogInformation($"Using adapter at index {adapterIndex} - {adapter.Description.Description}"); var createD3dDeviceResult = D3D11.D3D11CreateDevice(adapter, DriverType.Unknown, DeviceCreationFlags.None, null, out dd._d3dDevice, out dd._immediateContext); if (!createD3dDeviceResult.Success) { throw new DesktopDuplicationException("Couldn't create a D3D device from the specified adapter."); } using var device = dd._d3dDevice.QueryInterface <IDXGIDevice>(); var outputResult = adapter.EnumOutputs(outputDeviceIndex, out output); if (outputResult.Failure) { throw new DesktopDuplicationException($"An error occurred attempting to retrieve the output device at the specified index ({outputDeviceIndex}): {outputResult}"); } if (output == null) { throw new DesktopDuplicationException($"An output was not found at the specified index ({outputDeviceIndex})."); } logger.LogInformation($"Using output device on adapter {adapterIndex} at index {outputDeviceIndex}."); var output6 = output.QueryInterface <IDXGIOutput6>(); try { // Copy the values to a new rect. var rectTemp = output6.Description.DesktopCoordinates; dd._desktopRect = new RawRect(rectTemp.Left, rectTemp.Top, rectTemp.Right, rectTemp.Bottom); dd._outputDuplication = output6.DuplicateOutput(device); var stagingTexture = new Texture2DDescription() { CpuAccessFlags = CpuAccessFlags.Read, BindFlags = BindFlags.None, Format = dd._outputDuplication.Description.ModeDescription.Format, Width = Math.Abs(dd._desktopRect.Right - dd._desktopRect.Left), Height = Math.Abs(dd._desktopRect.Bottom - dd._desktopRect.Top), OptionFlags = ResourceOptionFlags.None, MipLevels = 1, ArraySize = 1, SampleDescription = { Count = 1, Quality = 0 }, Usage = Usage.Staging // << can be read by CPU }; // Initialize the Output Duplication -- If this isn't done occassionally an 'Unsupported' result will occur with DuplicationOutput1 dd._desktopImageTexture = dd._d3dDevice.CreateTexture2D(stagingTexture); } catch (SharpGenException ex) { if (ex.Descriptor.NativeApiCode == "DXGI_ERROR_UNSUPPORTED") { throw new DesktopDuplicationException("Unsupported desktop mode or scenario."); } else if (ex.Descriptor.NativeApiCode == "DXGI_ERROR_NOT_CURRENTLY_AVAILABLE") { throw new DesktopDuplicationException("There is already the maximum number of applications using the Desktop Duplication API running, please close one of the applications and try again."); } else { throw; } } } finally { if (output != null) { output.Dispose(); } if (adapter != null) { adapter.Dispose(); } if (factory != null) { factory.Dispose(); } } return(dd); }
public bool Init(IntPtr WindowHandle) { var factory = DXGI.CreateDXGIFactory1 <IDXGIFactory1>(); var adapter = factory.GetAdapter1(0); var monitor = adapter.GetOutput(0); var modes = monitor.GetDisplayModeList(Format.R8G8B8A8_UNorm, DisplayModeEnumerationFlags.Interlaced); var rational = new Rational(0, 1); var adapterDescription = adapter.Description; //VideoCardMemory = adapterDescription.DedicatedVideoMemory >> 10 >> 10; //VideoCardDescription = adapterDescription.Description.Trim('\0'); monitor.Dispose(); adapter.Dispose(); var swapChainDesc = new SwapChainDescription() { BufferCount = 2, BufferDescription = new ModeDescription(1920, 1080, rational, Format.R8G8B8A8_UNorm), Usage = Usage.RenderTargetOutput, OutputWindow = WindowHandle, SampleDescription = new SampleDescription(1, 0), IsWindowed = true, Flags = SwapChainFlags.None, SwapEffect = SwapEffect.Discard }; // Create Device and DeviceContext ID3D11Device TempDevice = null; ID3D11DeviceContext TempDeviceContext = null; D3D11.D3D11CreateDevice(adapter, DriverType.Hardware, DeviceCreationFlags.None, null, out TempDevice, out TempDeviceContext); Device = TempDevice.QueryInterface <ID3D11Device1>(); DeviceContext = TempDeviceContext.QueryInterface <ID3D11DeviceContext1>(); TempDevice.Dispose(); TempDeviceContext.Dispose(); // Create SwapChain SwapChain = factory.CreateSwapChain(Device, swapChainDesc); factory.MakeWindowAssociation(WindowHandle, WindowAssociationFlags.IgnoreAltEnter); var backBuffer = SwapChain.GetBuffer <ID3D11Texture2D>(0); m_RenderTargetView = Device.CreateRenderTargetView(backBuffer); backBuffer.Dispose(); // Create blend state BlendDescription bsd = new BlendDescription() { AlphaToCoverageEnable = false,//true, IndependentBlendEnable = false, }; bsd.RenderTarget[0].BlendOperationAlpha = BlendOperation.Add; bsd.RenderTarget[0].BlendOperation = BlendOperation.Add; bsd.RenderTarget[0].DestinationBlendAlpha = Blend.One; bsd.RenderTarget[0].DestinationBlend = Blend.InverseSourceAlpha; bsd.RenderTarget[0].IsBlendEnabled = true; bsd.RenderTarget[0].RenderTargetWriteMask = ColorWriteEnable.All; bsd.RenderTarget[0].SourceBlendAlpha = Blend.Zero; bsd.RenderTarget[0].SourceBlend = Blend.SourceAlpha; bsd.AlphaToCoverageEnable = true; ID3D11BlendState bsAlpha = Device.CreateBlendState(bsd); // Set Blend State DeviceContext.OMSetBlendState(bsAlpha); BuildDepthStencilView(1920, 1080); // Create rasterizers m_RSDesc = new RasterizerDescription() { AntialiasedLineEnable = false, CullMode = CullMode.Back, DepthBias = 0, DepthBiasClamp = .0f, DepthClipEnable = false, FillMode = FillMode.Solid, FrontCounterClockwise = true, MultisampleEnable = true, ScissorEnable = false, SlopeScaledDepthBias = .0f }; m_RSCullSolid = Device.CreateRasterizerState(m_RSDesc); m_RSDesc.CullMode = CullMode.None; m_RSSolid = Device.CreateRasterizerState(m_RSDesc); m_RSDesc.FillMode = FillMode.Wireframe; m_RSWireFrame = Device.CreateRasterizerState(m_RSDesc); m_RSDesc.CullMode = CullMode.Back; m_RSCullWireFrame = Device.CreateRasterizerState(m_RSDesc); UpdateRasterizer(); return(true); }