public static void Fill(Renderer renderer, SharpDX.DXGI.Adapter adapter) { RendererInfo ri = new RendererInfo(); ri.AdapterDesc = adapter.Description.Description; ri.SystemMemory = (UInt64)((IntPtr)adapter.Description.DedicatedSystemMemory).ToPointer(); ri.VideoMemory = (UInt64)((IntPtr)adapter.Description.DedicatedVideoMemory).ToPointer(); ri.SharedMemory = (UInt64)((IntPtr)adapter.Description.SharedSystemMemory).ToPointer(); ri.Outputs = adapter.Outputs.Length; SharpDX.DXGI.Output output = adapter.Outputs[0]; var bounds = output.Description.DesktopBounds; ri.OutputName = output.Description.DeviceName; ri.ScreenBounds = new System.Drawing.Rectangle(new System.Drawing.Point(bounds.Top, bounds.Left), new System.Drawing.Size(bounds.Right - bounds.Left, bounds.Bottom - bounds.Top)); ri.ScreenWidth = output.Description.DesktopBounds.Right - output.Description.DesktopBounds.Left; ri.ScreenHeight = output.Description.DesktopBounds.Bottom - output.Description.DesktopBounds.Top; renderer.Info = ri; }
public Renderer(Player player) { this.player = player; this.player.Control.Resize += ResizeBuffers; /* [Enable Debug Layer] * * 1) Enable native code debugging in your main project properties * 2) Requires SDK * * https://docs.microsoft.com/en-us/windows/win32/direct3d11/overviews-direct3d-11-devices-layers * https://docs.microsoft.com/en-us/windows/win32/direct3d11/using-the-debug-layer-to-test-apps * * For Windows 7 with Platform Update for Windows 7 (KB2670838) or Windows 8.x, to create a device that supports the debug layer, install the Windows Software Development Kit (SDK) for Windows 8.x to get D3D11_1SDKLayers.dll * For Windows 10, to create a device that supports the debug layer, enable the "Graphics Tools" optional feature. Go to the Settings panel, under System, Apps & features, Manage optional Features, Add a feature, and then look for "Graphics Tools". */ //device = new Device(SharpDX.Direct3D.DriverType.Hardware, DeviceCreationFlags.VideoSupport | DeviceCreationFlags.BgraSupport | DeviceCreationFlags.Debug, ((SharpDX.Direct3D.FeatureLevel[]) Enum.GetValues(typeof(SharpDX.Direct3D.FeatureLevel))).Reverse().ToArray() ); //deviceDbg = new DeviceDebug(device); // To Report Live Objects if required device = new Device(SharpDX.Direct3D.DriverType.Hardware, DeviceCreationFlags.VideoSupport | DeviceCreationFlags.BgraSupport, ((SharpDX.Direct3D.FeatureLevel[])Enum.GetValues(typeof(SharpDX.Direct3D.FeatureLevel))).Reverse().ToArray()); using (var mthread = device.QueryInterface <Multithread>()) mthread.SetMultithreadProtected(true); using (var device2 = device.QueryInterface <SharpDX.DXGI.Device2>()) using (var adapter = device2.Adapter) using (var factory = adapter.GetParent <Factory2>()) { device2.MaximumFrameLatency = 1; // Dont queue more than 1 frame RendererInfo.Fill(this, adapter); Log("\r\n" + Info.ToString()); // Swap Chain (TODO: Backwards compatibility) var desc1 = new SwapChainDescription1() { BufferCount = device.FeatureLevel >= SharpDX.Direct3D.FeatureLevel.Level_11_0 ? 6 : 1, // Should be 1 for Win < 8 | HDR 60 fps requires 6 for non drops SwapEffect = device.FeatureLevel >= SharpDX.Direct3D.FeatureLevel.Level_12_0 ? SwapEffect.FlipSequential : SwapEffect.FlipDiscard, //Format = HDREnabled ? Format.R10G10B10A2_UNorm : Format.B8G8R8A8_UNorm, // Create always 10 bit and fallback to 8? Format = Format.B8G8R8A8_UNorm, //Format = Format.R16G16B16A16_Float, //Format = Format.R10G10B10A2_UNorm, Width = player.Control.Width, Height = player.Control.Height, AlphaMode = AlphaMode.Ignore, Usage = Usage.RenderTargetOutput, Scaling = Scaling.None, //Flags = SwapChainFlags.AllowModeSwitch, //Flags = 0 (or if already in fullscreen while recreating -> SwapChainFlags.AllowModeSwitch) SampleDescription = new SampleDescription() { Count = 1, Quality = 0 } }; swapChain = new SwapChain1(factory, device, this.player.Control.Handle, ref desc1); } backBuffer = Texture2D.FromSwapChain <Texture2D>(swapChain, 0); rtv = new RenderTargetView(device, backBuffer); context = device.ImmediateContext; vertexBuffer = Buffer.Create(device, BindFlags.VertexBuffer, vertexBufferData); SamplerState textureSampler = new SamplerState(device, new SamplerStateDescription() { AddressU = TextureAddressMode.Clamp, AddressV = TextureAddressMode.Clamp, AddressW = TextureAddressMode.Clamp, ComparisonFunction = Comparison.Never, Filter = Filter.MinMagMipLinear, MaximumLod = float.MaxValue }); // Load Shaders Byte Code Dictionary <string, byte[]> Shaders = Shaders_v5.Shaders; if (device.FeatureLevel < SharpDX.Direct3D.FeatureLevel.Level_11_0) { Shaders = Shaders_v4.Shaders; } pixelShaders = new Dictionary <string, PixelShader>(); foreach (var entry in Shaders) { if (entry.Key.ToString() == "VertexShader") { vertexLayout = new InputLayout(device, entry.Value, inputElements); vertexShader = new VertexShader(device, entry.Value); } else { pixelShaders.Add(entry.Key.ToString(), new PixelShader(device, entry.Value)); } } context.InputAssembler.InputLayout = vertexLayout; context.InputAssembler.PrimitiveTopology = SharpDX.Direct3D.PrimitiveTopology.TriangleList; context.InputAssembler.SetVertexBuffers(0, new VertexBufferBinding(vertexBuffer, Utilities.SizeOf <float>() * 5, 0)); context.VertexShader.Set(vertexShader); context.PixelShader.SetSampler(0, textureSampler); if (player.Status == Status.Stopped) { GetViewport = new Viewport(0, 0, player.Control.Width, player.Control.Height); context.Rasterizer.SetViewport(0, 0, player.Control.Width, player.Control.Height); } else { SetViewport(); } }