using System.Collections.Generic; namespace UnityEngine.Rendering.HighDefinition.AMD.FSR3 { public class FSR3Upscaler: UpscalerPlugin { private static FSR3GraphicsDevice sGraphicsDeviceInstance; public override bool Load() => true; public override bool IsLoaded() => true; public override GraphicsDevice CreateGraphicsDevice() { if (sGraphicsDeviceInstance != null) { sGraphicsDeviceInstance.Shutdown(); sGraphicsDeviceInstance.Initialize(); return sGraphicsDeviceInstance; } var graphicsDevice = new FSR3GraphicsDevice(); if (graphicsDevice.Initialize()) { sGraphicsDeviceInstance = graphicsDevice; return graphicsDevice; } Debug.LogWarning("Failed to initialize FSR3 Graphics Device"); return null; } public override GraphicsDevice device => sGraphicsDeviceInstance; } public class FSR3GraphicsDevice : GraphicsDevice { private static readonly Stack sContextPool = new(); internal bool Initialize() { // TODO return false; } internal void Shutdown() { // TODO } public override FSR2Context CreateFeature(CommandBuffer cmd, in FSR2CommandInitializationData initSettings) { var context = sContextPool.Count != 0 ? sContextPool.Pop() : new FSR3Context(); context.Init(initSettings); // TODO might need some way to distinguish between contexts (see featureSlot) return context; } public override void DestroyFeature(CommandBuffer cmd, FSR2Context fsrContext) { var context = (FSR3Context)fsrContext; context.Reset(); sContextPool.Push(context); } public override void ExecuteFSR2(CommandBuffer cmd, FSR2Context fsrContext, in FSR2TextureTable textures) { ((FSR3Context)fsrContext).Draw(cmd, in textures); } public override bool GetRenderResolutionFromQualityMode(FSR2Quality qualityMode, uint displayWidth, uint displayHeight, out uint renderWidth, out uint renderHeight) { throw new System.NotImplementedException(); } public override float GetUpscaleRatioFromQualityMode(FSR2Quality qualityMode) { throw new System.NotImplementedException(); } } public class FSR3Context : FSR2Context { private FSR2CommandInitializationData _initData; public override ref FSR2CommandInitializationData initData => ref _initData; private FSR2CommandExecutionData _executeData; public override ref FSR2CommandExecutionData executeData => ref _executeData; internal void Init(in FSR2CommandInitializationData initSettings) { // TODO: create internal context data _initData = initSettings; } internal void Reset() { // TODO: destroy internal context data _initData = new FSR2CommandInitializationData(); _executeData = new FSR2CommandExecutionData(); } internal void Draw(CommandBuffer cmd, in FSR2TextureTable textures) { } } }