Files
MicrosoftIris/UIX.RenderApi/Microsoft/Iris/Render/Graphics/NtGraphicsDevice.cs
T
2022-03-03 08:40:19 -06:00

152 lines
6.4 KiB
C#

// Decompiled with JetBrains decompiler
// Type: Microsoft.Iris.Render.Graphics.NtGraphicsDevice
// Assembly: UIX.RenderApi, Version=4.8.0.0, Culture=neutral, PublicKeyToken=ddd0da4d3e678217
// MVID: D47658B8-A8EA-43D6-8837-ECE823BFFFC1
// Assembly location: C:\Program Files\Zune\UIX.RenderApi.dll
using Microsoft.Iris.Render.Common;
using Microsoft.Iris.Render.Internal;
using Microsoft.Iris.Render.Protocol;
using Microsoft.Iris.Render.Protocols.Splash.Rendering;
using Microsoft.Iris.Render.Protocols.Splash.Rendering.Nt;
using System;
namespace Microsoft.Iris.Render.Graphics
{
internal sealed class NtGraphicsDevice : Dx9GraphicsDevice, IRenderHandleOwner
{
private RemoteNtDevice m_remoteDevice;
private float m_flDisplayOverscan;
private float m_flMaxOverscan;
internal NtGraphicsDevice(RenderSession session, GraphicsRenderingQuality renderingQuality)
: base(session, "Nt Dx9", GraphicsDeviceType.Direct3D9, renderingQuality)
=> this.m_remoteDevice = session.BuildRemoteNtDevice(this);
protected override void Dispose(bool fInDispose)
{
try
{
if (fInDispose && this.m_remoteDevice != null)
this.m_remoteDevice.Dispose();
this.m_remoteDevice = null;
}
finally
{
base.Dispose(fInDispose);
}
}
RENDERHANDLE IRenderHandleOwner.RenderHandle => this.m_remoteDevice.RenderHandle;
void IRenderHandleOwner.OnDisconnect() => this.m_remoteDevice = null;
internal RemoteNtDevice RemoteStub => this.m_remoteDevice;
internal override RemoteDevice RemoteDevice => m_remoteDevice;
public Size EstimatedMaxPerformantResolution
{
get
{
Debug2.Validate(this.SurfaceManager != null, typeof(InvalidOperationException), "Dx9 driver must be fully initialized before querying resolution performance");
return this.SurfaceManager.EstimatedMaxPerformantResolution;
}
}
public float DisplayOverscan
{
get => this.m_flDisplayOverscan;
set
{
if (Math2.WithinEpsilon(this.m_flDisplayOverscan, value))
return;
this.m_flDisplayOverscan = value;
this.m_remoteDevice.SendSetDisplayOverscan(value);
}
}
public float MaxOverscan
{
get => this.m_flMaxOverscan;
set
{
if (Math2.WithinEpsilon(this.m_flMaxOverscan, value))
return;
this.m_flMaxOverscan = value;
this.m_remoteDevice.SendSetMaxOverscan(value);
}
}
public override void PostCreate()
{
base.PostCreate();
SurfaceFormat nFormat = SurfaceFormat.ARGB32;
this.m_remoteDevice.SendCreateTransferBuffer(new Size(2048, 512), nFormat);
for (int index = 0; index < 2; ++index)
this.m_remoteDevice.SendCreateTransferBuffer(new Size(1024, 256), nFormat);
for (int index = 0; index < 4; ++index)
this.m_remoteDevice.SendCreateTransferBuffer(new Size(256, 256), nFormat);
for (int index = 0; index < 8; ++index)
this.m_remoteDevice.SendCreateTransferBuffer(new Size(128, 64), nFormat);
}
internal override bool IsSurfaceFormatSupported(SurfaceFormat nFormat)
{
switch (nFormat)
{
case SurfaceFormat.A8:
case SurfaceFormat.RGB24:
case SurfaceFormat.RGB32:
case SurfaceFormat.ARGB32:
return true;
case SurfaceFormat.External:
return true;
default:
return false;
}
}
protected override void CreateSurfacePoolWorker(
object oSurfacePool,
object oHandle,
SurfaceFormat nFormat)
{
this.m_remoteDevice.SendCreateSurfacePool((RENDERHANDLE)oHandle, nFormat);
}
internal override void CreateVideoPoolWorker(object oSurfacePool, object oHandle) => this.m_remoteDevice.SendCreateVideoPool(this.m_session.RenderingProtocol.LocalVideoPoolCallbackHandle, (RENDERHANDLE)oHandle);
protected override void RestartRendering(uint nRenderGeneration) => this.m_remoteDevice.SendRestart(nRenderGeneration);
public override void RenderNowIfPossible() => this.m_remoteDevice.SendRenderNowIfPossible();
private static uint GetPixelCB(Size sizeSurfacePxl) => (uint)(Math2.FindPowerOf2(sizeSurfacePxl.Width) * Math2.FindPowerOf2(sizeSurfacePxl.Height) * 4);
protected override object InternalComputeBreakdown()
{
SurfaceManager.VideoMemoryBreakdown videoMemoryBreakdown = new SurfaceManager.VideoMemoryBreakdown();
ulong totalVideoMemory = this.m_graphicsCaps.TotalVideoMemory;
ulong dedicatedVideoMemory = this.m_graphicsCaps.DedicatedVideoMemory;
ulong num1 = totalVideoMemory;
videoMemoryBreakdown.sizeBuffersPxl = new Size(Win32Api.GetSystemMetrics(0), Win32Api.GetSystemMetrics(1));
Size sizeSurfacePxl = new Size(1280, 1024);
if (totalVideoMemory > 67108864UL)
sizeSurfacePxl = totalVideoMemory <= 134217728UL ? new Size(1920, 1280) : new Size(2048, 1600);
videoMemoryBreakdown.sizeLargeBuffersPxl = sizeSurfacePxl;
uint num2 = GetPixelCB(sizeSurfacePxl) * 3U;
ulong num3 = num1 - num2;
videoMemoryBreakdown.cbVideo = 16777216U;
ulong num4 = num3 - videoMemoryBreakdown.cbVideo;
videoMemoryBreakdown.sizeBackgroundPxl = new Size(1024, 768);
uint pixelCb = GetPixelCB(videoMemoryBreakdown.sizeBackgroundPxl);
ulong num5 = num4 - pixelCb - totalVideoMemory / 20UL;
videoMemoryBreakdown.sizeDynamicPoolPxl = dedicatedVideoMemory >= 121634816UL ? new Size(2048, 2048) : new Size(1920, 548);
uint num6 = (uint)(videoMemoryBreakdown.sizeDynamicPoolPxl.Width * videoMemoryBreakdown.sizeDynamicPoolPxl.Height * 4);
for (uint index = 33554432; videoMemoryBreakdown.cbMinimumPool < index && num5 > num6; num5 -= num6)
videoMemoryBreakdown.cbMinimumPool += num6;
return videoMemoryBreakdown;
}
}
}