143 lines
5.9 KiB
C
143 lines
5.9 KiB
C
// This file is part of the FidelityFX SDK.
|
|
//
|
|
// Copyright (C) 2024 Advanced Micro Devices, Inc.
|
|
//
|
|
// Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
// of this software and associated documentation files(the "Software"), to deal
|
|
// in the Software without restriction, including without limitation the rights
|
|
// to use, copy, modify, merge, publish, distribute, sublicense, and /or sell
|
|
// copies of the Software, and to permit persons to whom the Software is
|
|
// furnished to do so, subject to the following conditions :
|
|
//
|
|
// The above copyright notice and this permission notice shall be included in
|
|
// all copies or substantial portions of the Software.
|
|
//
|
|
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
// THE SOFTWARE.
|
|
|
|
#ifndef FFX_DOF_COMMON_H
|
|
#define FFX_DOF_COMMON_H
|
|
|
|
/// @defgroup FfxGPUDof FidelityFX DOF
|
|
/// FidelityFX Depth of Field GPU documentation
|
|
///
|
|
/// @ingroup FfxGPUEffects
|
|
|
|
// Constants - these are fixed magic numbers. Changes likely require changing code.
|
|
|
|
/// The width/height of tiles storing per-tile min and max CoC. The blur pass needs to run
|
|
/// at a compatible tile size, so that the assumption that min/max CoC is uniform for all threads in
|
|
/// a thread group holds.
|
|
///
|
|
/// @ingroup FfxGPUDof
|
|
FFX_STATIC const FfxUInt32 FFX_DOF_DEPTH_TILE_SIZE = 8;
|
|
|
|
// Default settings
|
|
#ifndef FFX_DOF_OPTION_MAX_MIP
|
|
/// The number of mips that should be generated in the color downsample pass
|
|
///
|
|
/// @ingroup FfxGPUDof
|
|
#define FFX_DOF_OPTION_MAX_MIP 4
|
|
#endif
|
|
|
|
#ifndef FFX_DOF_OPTION_MAX_RING_MERGE_LOG
|
|
/// The base-2 logarithm of the number of blur kernel rings that may be merged, if possible.
|
|
///
|
|
/// Setting this to zero disables ring merging.
|
|
///
|
|
/// Values above 1 are technically valid, but are known to cause a visible quality drop.
|
|
///
|
|
/// @ingroup FfxGPUDof
|
|
#define FFX_DOF_OPTION_MAX_RING_MERGE_LOG 1
|
|
#endif
|
|
|
|
#define FFX_DOF_MAX_RING_MERGE (1 << FFX_DOF_OPTION_MAX_RING_MERGE_LOG)
|
|
|
|
// optional 16-bit types
|
|
#if FFX_HLSL
|
|
#if FFX_HALF
|
|
typedef FfxFloat16 FfxHalfOpt;
|
|
typedef FfxFloat16x2 FfxHalfOpt2;
|
|
typedef FfxFloat16x3 FfxHalfOpt3;
|
|
typedef FfxFloat16x4 FfxHalfOpt4;
|
|
#else
|
|
typedef FfxFloat32 FfxHalfOpt;
|
|
typedef FfxFloat32x2 FfxHalfOpt2;
|
|
typedef FfxFloat32x3 FfxHalfOpt3;
|
|
typedef FfxFloat32x4 FfxHalfOpt4;
|
|
#endif
|
|
#elif FFX_GLSL
|
|
#if FFX_HALF
|
|
#define FfxHalfOpt FfxFloat16
|
|
#define FfxHalfOpt2 FfxFloat16x2
|
|
#define FfxHalfOpt3 FfxFloat16x3
|
|
#define FfxHalfOpt4 FfxFloat16x4
|
|
#else
|
|
#define FfxHalfOpt FfxFloat32
|
|
#define FfxHalfOpt2 FfxFloat32x2
|
|
#define FfxHalfOpt3 FfxFloat32x3
|
|
#define FfxHalfOpt4 FfxFloat32x4
|
|
#endif
|
|
#endif
|
|
|
|
// unroll macros with count argument
|
|
#if FFX_HLSL
|
|
#define FFX_DOF_UNROLL_N(_n) [unroll(_n)]
|
|
#define FFX_DOF_UNROLL [unroll]
|
|
#elif FFX_GLSL // #if FFX_HLSL
|
|
#define FFX_DOF_UNROLL_N(_n)
|
|
// enable unrolling loops
|
|
#extension GL_EXT_control_flow_attributes : enable
|
|
|
|
#if GL_EXT_control_flow_attributes
|
|
#define FFX_DOF_UNROLL [[unroll]]
|
|
#else
|
|
#define FFX_DOF_UNROLL
|
|
#endif // #if GL_EXT_control_flow_attributes
|
|
#endif // #if FFX_HLSL #elif FFX_GLSL
|
|
|
|
// ReadLaneFirst
|
|
#if FFX_HLSL
|
|
#define ffxWaveReadLaneFirst WaveReadLaneFirst
|
|
#elif FFX_GLSL
|
|
#define ffxWaveReadLaneFirst subgroupBroadcastFirst
|
|
#endif // #if FFX_GLSL
|
|
|
|
// Callback declarations
|
|
FfxFloat32 FfxDofGetCoc(FfxFloat32 depth); // returns circle of confusion radius in pixels (at half-res). Sign indicates near-field (positive) or far-field (negative).
|
|
void FfxDofStoreDilatedRadius(FfxUInt32x2 coord, FfxFloat32x2 dilatedMinMax);
|
|
FfxFloat32x2 FfxDofSampleDilatedRadius(FfxUInt32x2 coord); // returns the dilated min and max depth for a pixel coordinate. Should be bilinearly interpolated!
|
|
FfxFloat32x2 FfxDofLoadDilatedRadius(FfxUInt32x2 coord); // returns the dilated depth for a *tile* coordinate without interpolation
|
|
FfxHalfOpt4 FfxDofLoadInput(FfxUInt32x2 coord); // returns input rgb and (in alpha) CoC in pixels from the most detailed mip (which is half-res)
|
|
FfxHalfOpt4 FfxDofSampleInput(FfxFloat32x2 coord, FfxUInt32 mip); // returns input rgb and (in alpha) CoC in pixels.
|
|
FfxFloat32x4 FfxDofGatherDepth(FfxFloat32x2 coord); // returns 4 input depth values in a quad, must use sampler with coordinate clamping
|
|
void FfxDofStoreNear(FfxUInt32x2 coord, FfxHalfOpt4 color); // stores the near color output from the blur pass
|
|
void FfxDofStoreFar(FfxUInt32x2 coord, FfxHalfOpt4 color); // stores the far color output from the blur pass
|
|
FfxHalfOpt4 FfxDofLoadNear(FfxUInt32x2 coord); // loads the near color value
|
|
FfxHalfOpt4 FfxDofLoadFar(FfxUInt32x2 coord); // loads the far color value
|
|
void FfxDofAccumMaxTileRadius(FfxUInt32 radius); // stores the global maximum dilation radius using an atomic max operation
|
|
FfxUInt32 FfxDofGetMaxTileRadius(); // gets the global maximum dilation radius
|
|
void FfxDofResetMaxTileRadius(); // sets max dilation radius back to zero
|
|
void FfxDofStoreTileRadius(FfxUInt32x2 tile, FfxFloat32x2 radius); // stores the min/max signed radius for a tile in the tile map
|
|
FfxFloat32x2 FfxDofLoadTileRadius(FfxUInt32x2 tile); // loads the min/max depth for a tile
|
|
FfxFloat32x4 FfxDofLoadFullInput(FfxUInt32x2 coord); // returns full resultion input rgba (alpha is ignored)
|
|
FfxFloat32 FfxDofLoadFullDepth(FfxUInt32x2 coord); // returns full resolution depth
|
|
void FfxDofStoreOutput(FfxUInt32x2 coord, FfxFloat32x4 color); // writes the final output
|
|
|
|
// Common helper functions
|
|
FfxUInt32x2 FfxDofPxRadToTiles(FfxFloat32x2 rPx)
|
|
{
|
|
return FfxUInt32x2(ceil(rPx / (FFX_DOF_DEPTH_TILE_SIZE / 2))) + 1; // +1 to handle diagonals & bilinear
|
|
}
|
|
|
|
FfxFloat32x2 FfxDofGetCoc2(FfxFloat32x2 depths)
|
|
{
|
|
return FfxFloat32x2(FfxDofGetCoc(depths.x), FfxDofGetCoc(depths.y));
|
|
}
|
|
#endif // #ifndef FFX_DOF_COMMON_H
|