Working screen capture, but not with hidden windows. Need to make that a priority.
This commit is contained in:
parent
d07a2d5adc
commit
0c220316e8
|
|
@ -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<Output1>();
|
||||
|
||||
// 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);
|
||||
|
||||
var data = bmp.LockBits(new Rectangle(0, 0, width, height), ImageLockMode.ReadOnly, PixelFormat.Format32bppArgb);
|
||||
|
||||
// Try to get duplicated frame within given time is ms
|
||||
|
||||
|
||||
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<Texture2D>())
|
||||
//{
|
||||
// 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;
|
||||
|
|
@ -180,49 +153,19 @@ namespace VDash.Overlay
|
|||
}
|
||||
|
||||
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;
|
||||
|
|
|
|||
Loading…
Reference in New Issue