using System; namespace UnityEngine.Rendering.HighDefinition.AMD { public static class AMDUnityPlugin { // TODO: allow dynamic switching between plugins (including shutdown of previous plugin) internal static readonly UpscalerPlugin ActivePlugin = new FSR2Wrapper.FSR2WrapperUpscaler(); public static bool Load() => ActivePlugin.Load(); public static bool IsLoaded() => ActivePlugin.IsLoaded(); } public abstract class UpscalerPlugin { public abstract bool Load(); public abstract bool IsLoaded(); public abstract GraphicsDevice CreateGraphicsDevice(); public abstract GraphicsDevice device { get; } public virtual uint version => 0x00; } public abstract class GraphicsDevice { public static GraphicsDevice device => AMDUnityPlugin.ActivePlugin.device; public static uint version => AMDUnityPlugin.ActivePlugin.version; public static GraphicsDevice CreateGraphicsDevice() { return AMDUnityPlugin.ActivePlugin.CreateGraphicsDevice(); } public abstract FSR2Context CreateFeature(CommandBuffer cmd, in FSR2CommandInitializationData initSettings); public abstract void DestroyFeature(CommandBuffer cmd, FSR2Context fsrContext); public abstract void ExecuteFSR2(CommandBuffer cmd, FSR2Context fsrContext, in FSR2TextureTable textures); public abstract bool GetRenderResolutionFromQualityMode(FSR2Quality qualityMode, uint displayWidth, uint displayHeight, out uint renderWidth, out uint renderHeight); public abstract float GetUpscaleRatioFromQualityMode(FSR2Quality qualityMode); } public abstract class FSR2Context { public abstract ref FSR2CommandInitializationData initData { get; } public abstract ref FSR2CommandExecutionData executeData { get; } } public struct FSR2CommandInitializationData { public uint displaySizeHeight; public uint displaySizeWidth; public FfxFsr2InitializationFlags ffxFsrFlags; public uint maxRenderSizeHeight; public uint maxRenderSizeWidth; public bool GetFlag(FfxFsr2InitializationFlags flag) { return (ffxFsrFlags & flag) == flag; } public void SetFlag(FfxFsr2InitializationFlags flag, bool value) { if (value) ffxFsrFlags |= flag; else ffxFsrFlags &= ~flag; } } [Flags] public enum FfxFsr2InitializationFlags { EnableHighDynamicRange = 1, EnableDisplayResolutionMotionVectors = 2, EnableMotionVectorsJitterCancellation = 4, DepthInverted = 8, EnableDepthInfinite = 16, // 0x00000010 EnableAutoExposure = 32, // 0x00000020 EnableDynamicResolution = 64, // 0x00000040 EnableTexture1DUsage = 128, // 0x00000080 } public struct FSR2TextureTable { public Texture biasColorMask; public Texture colorInput; public Texture colorOutput; public Texture depth; public Texture exposureTexture; public Texture motionVectors; public Texture reactiveMask; public Texture transparencyMask; } public enum FSR2Quality { NativeAA, UltraQuality, Quality, Balanced, Performance, UltraPerformance, } public struct FSR2CommandExecutionData { public float jitterOffsetX; public float jitterOffsetY; public float MVScaleX; public float MVScaleY; public uint renderSizeWidth; public uint renderSizeHeight; public int enableSharpening; public float sharpness; public float frameTimeDelta; public float preExposure; public int reset; public float cameraNear; public float cameraFar; public float cameraFovAngleVertical; } }