mirror of
https://github.com/ZuneDev/MicrosoftIris.git
synced 2026-07-27 13:13:29 -07:00
152 lines
6.4 KiB
C#
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;
|
|
}
|
|
}
|
|
}
|