diff --git a/VDash/Overlay/WindowOverlay.cs b/VDash/Overlay/WindowOverlay.cs index 26a7cc4..61b292b 100644 --- a/VDash/Overlay/WindowOverlay.cs +++ b/VDash/Overlay/WindowOverlay.cs @@ -65,35 +65,14 @@ namespace VDash.Overlay var adapter = factory.GetAdapter1(0); //Get device from adapter var device = new SharpDX.Direct3D11.Device(adapter); - //Get front buffer of the adapter - var output = adapter.GetOutput(0); - var output1 = output.QueryInterface(); - // Width/Height of desktop to capture - int width = output.Description.DesktopBounds.Right; - int height = output.Description.DesktopBounds.Bottom; - - // Create Staging texture CPU-accessible - var textureDesc = new Texture2DDescription - { - CpuAccessFlags = CpuAccessFlags.Read, - BindFlags = BindFlags.None, - Format = Format.B8G8R8A8_UNorm, - Width = width, - Height = height, - OptionFlags = ResourceOptionFlags.None, - MipLevels = 1, - ArraySize = 1, - SampleDescription = { Count = 1, Quality = 0 }, - Usage = ResourceUsage.Staging - }; - var screenTexture = new Texture2D(device, textureDesc); #endregion int frames = 0; DateTime lastFps = DateTime.MinValue; while (m_Running) { + #region VR Events VREvent_t vrEvent = new VREvent_t(); while (OpenVR.Overlay.PollNextOverlayEvent(m_Handle, ref vrEvent, (uint)Marshal.SizeOf(vrEvent))) @@ -126,49 +105,43 @@ namespace VDash.Overlay } } - + #endregion #region Acutally Render - using (var duplicatedOutput = output1.DuplicateOutput(device)) + var proc = Process.GetProcessesByName("discord")[1]; + var rect = new User32.Rect(); + User32.GetWindowRect(proc.MainWindowHandle, ref rect); + + int width = rect.right - rect.left; + int height = rect.bottom - rect.top; + + using (var bmp = new Bitmap(width, height, PixelFormat.Format32bppArgb)) { - SharpDX.DXGI.Resource screenResource = null; - try + using (Graphics graphics = Graphics.FromImage(bmp)) { - OutputDuplicateFrameInformation duplicateFrameInformation; - + graphics.CopyFromScreen(rect.left, rect.top, 0, 0, new Size(width, height), CopyPixelOperation.SourceCopy); - // Try to get duplicated frame within given time is ms + var data = bmp.LockBits(new Rectangle(0, 0, width, height), ImageLockMode.ReadOnly, PixelFormat.Format32bppArgb); - - duplicatedOutput.AcquireNextFrame(10000, out duplicateFrameInformation, out screenResource); - - - - #region junk - // copy resource into memory that can be accessed by the CPU - //using (var screenTexture2D = screenResource.QueryInterface()) - //{ - // device.ImmediateContext.CopyResource(screenTexture2D, screenTexture); - //} - - // Get the desktop capture texture - var mapSource = device.ImmediateContext.MapSubresource(screenTexture, 0, MapMode.Read, SharpDX.Direct3D11.MapFlags.None); - - // Create Drawing.Bitmap - //using (var bitmap = new Bitmap(width, height, PixelFormat.Format32bppArgb)) - //{ - // var boundsRect = new Rectangle(0, 0, width, height); - - // // Copy pixels from screen capture Texture to GDI bitmap - // var mapDest = bitmap.LockBits(boundsRect, ImageLockMode.WriteOnly, bitmap.PixelFormat); - // var sourcePtr = mapSource.DataPointer; - // var destPtr = mapDest.Scan0; - - - if (duplicateFrameInformation.AccumulatedFrames > 0) + // Create Staging texture CPU-accessible + var textureDesc = new Texture2DDescription + { + CpuAccessFlags = CpuAccessFlags.Read, + BindFlags = BindFlags.None, + Format = Format.B8G8R8A8_UNorm, + Width = width, + Height = height, + OptionFlags = ResourceOptionFlags.None, + MipLevels = 1, + ArraySize = 1, + SampleDescription = { Count = 1, Quality = 0 }, + Usage = ResourceUsage.Staging + }; + + using (var screenTexture = new Texture2D(device, textureDesc, new SharpDX.DataRectangle(data.Scan0, data.Stride))) + //using (var screenTexture = new Texture2D(device, textureDesc)) { - //Console.WriteLine($"Frames: {duplicateFrameInformation.AccumulatedFrames}"); var texture = new Texture_t(); texture.handle = screenTexture.NativePointer; texture.eType = ETextureType.DirectX; @@ -178,51 +151,21 @@ namespace VDash.Overlay { Console.WriteLine($"Error rendering: {result}"); } - + frames++; + + bmp.UnlockBits(data); } - - //for (int y = 0; y < height; y++) - //{ - // Copy a single line - // Utilities.CopyMemory(destPtr, sourcePtr, width * 4); - - // Advance pointers - // sourcePtr = IntPtr.Add(sourcePtr, mapSource.RowPitch); - // destPtr = IntPtr.Add(destPtr, mapDest.Stride); - //} - - //// // Release source and dest locks - //bitmap.UnlockBits(mapDest); - device.ImmediateContext.UnmapSubresource(screenTexture, 0); - - //using (var ms = new FileStream(@"C:\Users\jrhodnik\Desktop\ss.bmp", FileMode.Create)) - //{ - // bitmap.Save(ms, ImageFormat.Bmp); - //} - - //} - #endregion - - } - catch (Exception ex) - { - Console.WriteLine(ex.ToString()); - } - finally - { - if (screenResource != null) - { - screenResource.Dispose(); - } - duplicatedOutput.ReleaseFrame(); + //Dispose not freeing screenTexture: https://gamedev.stackexchange.com/questions/93311/freeing-texture-memory-in-sharpdx-what-am-i-missing + device.ImmediateContext.ClearState(); + device.ImmediateContext.Flush(); } } #endregion - //Thread.Sleep(20); + Thread.Sleep(10); - if(DateTime.Now.Subtract(lastFps).TotalMilliseconds > 1000) + if (DateTime.Now.Subtract(lastFps).TotalMilliseconds > 1000) { Console.WriteLine($"{frames} fps."); frames = 0;