using UnityEngine;
using UnityEngine.Rendering;
using UnityEngine.Rendering.HighDefinition;
using UnityEngine.AMD;
// Example HDRP custom pass
public class CustomFSRPass : CustomPass
{
public static bool EnsureAMDPluginLoaded()
{
if (!AMDUnityPlugin.IsLoaded())
{
Debug.Log("AMDUnityPlugin is not loaded!");
if (!AMDUnityPlugin.Load())
{
Debug.LogError("Unable to load AMDUnityPlugin");
return false;
}
}
Debug.Log("AMDUnityPlugin is successfully loaded!");
return true;
}
void InitializeAMDDevice()
{
if (!EnsureAMDPluginLoaded())
return;
// AMDUnityPlugin initialization will handle device creation for us.
// In case the device is not created, we call the static method GraphicsDevice.CreateGraphicsDevice().
amdDevice = GraphicsDevice.device == null ? GraphicsDevice.CreateGraphicsDevice() : GraphicsDevice.device;
Debug.LogFormat("AMD.GraphicsDevice initialized w/ version {0}", GraphicsDevice.version);
}
protected override void Setup(ScriptableRenderContext renderContext, CommandBuffer cmd)
{
if (amdDevice == null)
{
InitializeAMDDevice();
}
float scalingRatio = fsr2Context == null ? 1.0f : amdDevice.GetUpscaleRatioFromQualityMode(m_Quality);
fsr2OutputColorBuffer = RTHandles.Alloc(
new Vector2(scalingRatio, scalingRatio),
dimension: TextureDimension.Tex2D,
colorFormat: GraphicsFormat.R16G16B16A16_SFloat,
name: "fsr2OutputColorBuffer",
enableRandomWrite: true
);
// other pass setup code
}
protected override void Execute(CustomPassContext ctx)
{
bool initializeFsr2Context = fsr2Context == null || HasInputResolutionChanged(ctx) || HasOutputResolutionChanged(ctx);
if (initializeFsr2Context)
{
if (fsr2Context != null)
{
amdDevice.DestroyFeature(ctx.cmd, fsr2Context);
fsr2Context = null;
}
FSR2CommandInitializationData initData = new FSR2CommandInitializationData();
// populate initData
fsr2Context = amdDevice.CreateFeature(ctx.cmd, initData);
}
fsr2Context.executeData.enableSharpening = m_EnableSharpening ? 1 : 0;
// populate rest of fsr2Context.executeData
FSR2TextureTable fsr2TextureTable = new FSR2TextureTable()
{
// populate texture table
};
amdDevice.ExecuteFSR2(ctx.cmd, fsr2Context, fsr2TextureTable);
}
protected override void Cleanup()
{
// pass cleanup code
// No explicit clean up is necessary for AMD.GraphicsDevice, all handled internally
}
private GraphicsDevice amdDevice = null;
private FSR2Context fsr2Context = null;
private RTHandle fsr2OutputColorBuffer;
// other member variables
}