2024-12-12 17:41:33 +08:00

396 lines
14 KiB
C

/*******************************************************************************
* Copyright (C) 2021 Intel Corporation
*
* This software and the related documents are Intel copyrighted materials, and
* your use of them is governed by the express license under which they were
* provided to you ("License"). Unless the License provides otherwise, you may
* not use, modify, copy, publish, distribute, disclose or transmit this
* software or the related documents without Intel's prior written permission.
*
* This software and the related documents are provided as is, with no express
* or implied warranties, other than those that are expressly stated in the
* License.
******************************************************************************/
#ifndef XESS_H
#define XESS_H
#ifdef XESS_SHARED_LIB
#ifdef _WIN32
#ifdef XESS_EXPORT_API
#define XESS_API __declspec(dllexport)
#else
#define XESS_API __declspec(dllimport)
#endif
#else
#define XESS_API __attribute__((visibility("default")))
#endif
#else
#define XESS_API
#endif
#if !defined _MSC_VER || (_MSC_VER >= 1929)
#define XESS_PRAGMA(x) _Pragma(#x)
#else
#define XESS_PRAGMA(x) __pragma(x)
#endif
#define XESS_PACK_B_X(x) XESS_PRAGMA(pack(push, x))
#define XESS_PACK_E() XESS_PRAGMA(pack(pop))
#define XESS_PACK_B() XESS_PACK_B_X(8)
#include <stdint.h>
#ifdef __cplusplus
extern "C" {
#endif
typedef struct _xess_context_handle_t* xess_context_handle_t;
XESS_PACK_B()
/**
* @brief X<sup>e</sup>SS version.
*
* X<sup>e</sup>SS uses major.minor.patch version format and Numeric 90+ scheme for development stage builds.
*/
typedef struct _xess_version_t
{
/** A major version increment indicates a new API and potentially a
* break in functionality. */
uint16_t major;
/** A minor version increment indicates incremental changes such as
* optional inputs or flags. This does not break existing functionality. */
uint16_t minor;
/** A patch version increment may include performance or quality tweaks or fixes for known issues.
* There's no change in the interfaces.
* Versions beyond 90 used for development builds to change the interface for the next release.
*/
uint16_t patch;
/** Reserved for future use. */
uint16_t reserved;
} xess_version_t;
XESS_PACK_E()
XESS_PACK_B()
/**
* @brief 2D variable.
*/
typedef struct _xess_2d_t
{
uint32_t x;
uint32_t y;
} xess_2d_t;
XESS_PACK_E()
/**
* @brief 2D coordinates.
*/
typedef xess_2d_t xess_coord_t;
/**
* @brief X<sup>e</sup>SS quality settings.
*/
typedef enum _xess_quality_settings_t
{
XESS_QUALITY_SETTING_ULTRA_PERFORMANCE = 100,
XESS_QUALITY_SETTING_PERFORMANCE = 101,
XESS_QUALITY_SETTING_BALANCED = 102,
XESS_QUALITY_SETTING_QUALITY = 103,
XESS_QUALITY_SETTING_ULTRA_QUALITY = 104,
XESS_QUALITY_SETTING_ULTRA_QUALITY_PLUS = 105,
XESS_QUALITY_SETTING_AA = 106,
} xess_quality_settings_t;
/**
* @brief X<sup>e</sup>SS initialization flags.
*/
typedef enum _xess_init_flags_t
{
XESS_INIT_FLAG_NONE = 0,
/** Use motion vectors at target resolution. */
XESS_INIT_FLAG_HIGH_RES_MV = 1 << 0,
/** Use inverted (increased precision) depth encoding */
XESS_INIT_FLAG_INVERTED_DEPTH = 1 << 1,
/** Use exposure texture to scale input color. */
XESS_INIT_FLAG_EXPOSURE_SCALE_TEXTURE = 1 << 2,
/** Use responsive pixel mask texture. */
XESS_INIT_FLAG_RESPONSIVE_PIXEL_MASK = 1 << 3,
/** Use velocity in NDC */
XESS_INIT_FLAG_USE_NDC_VELOCITY = 1 << 4,
/** Use external descriptor heap */
XESS_INIT_FLAG_EXTERNAL_DESCRIPTOR_HEAP = 1 << 5,
/** Disable tonemapping for input and output */
XESS_INIT_FLAG_LDR_INPUT_COLOR = 1 << 6,
/** Remove jitter from input velocity*/
XESS_INIT_FLAG_JITTERED_MV = 1 << 7,
/** Enable automatic exposure calculation. */
XESS_INIT_FLAG_ENABLE_AUTOEXPOSURE = 1 << 8
} xess_init_flags_t;
XESS_PACK_B()
/**
* @brief Properties for internal X<sup>e</sup>SS resources.
*/
typedef struct _xess_properties_t
{
/** Required amount of descriptors for X<sup>e</sup>SS */
uint32_t requiredDescriptorCount;
/** The heap size required by X<sup>e</sup>SS for temporary buffer storage. */
uint64_t tempBufferHeapSize;
/** The heap size required by X<sup>e</sup>SS for temporary texture storage. */
uint64_t tempTextureHeapSize;
} xess_properties_t;
XESS_PACK_E()
/**
* @brief X<sup>e</sup>SS return codes.
*/
typedef enum _xess_result_t
{
/** Warning. Folder to store dump data doesn't exist. Write operation skipped.*/
XESS_RESULT_WARNING_NONEXISTING_FOLDER = 1,
/** An old or outdated driver. */
XESS_RESULT_WARNING_OLD_DRIVER = 2,
/** X<sup>e</sup>SS operation was successful. */
XESS_RESULT_SUCCESS = 0,
/** X<sup>e</sup>SS not supported on the GPU. An SM 6.4 capable GPU is required. */
XESS_RESULT_ERROR_UNSUPPORTED_DEVICE = -1,
/** An unsupported driver. */
XESS_RESULT_ERROR_UNSUPPORTED_DRIVER = -2,
/** Execute called without initialization. */
XESS_RESULT_ERROR_UNINITIALIZED = -3,
/** Invalid argument such as descriptor handles. */
XESS_RESULT_ERROR_INVALID_ARGUMENT = -4,
/** Not enough available GPU memory. */
XESS_RESULT_ERROR_DEVICE_OUT_OF_MEMORY = -5,
/** Device function such as resource or descriptor creation. */
XESS_RESULT_ERROR_DEVICE = -6,
/** The function is not implemented */
XESS_RESULT_ERROR_NOT_IMPLEMENTED = -7,
/** Invalid context. */
XESS_RESULT_ERROR_INVALID_CONTEXT = -8,
/** Operation not finished yet. */
XESS_RESULT_ERROR_OPERATION_IN_PROGRESS = -9,
/** Operation not supported in current configuration. */
XESS_RESULT_ERROR_UNSUPPORTED = -10,
/** The library cannot be loaded. */
XESS_RESULT_ERROR_CANT_LOAD_LIBRARY = -11,
/** Unknown internal failure */
XESS_RESULT_ERROR_UNKNOWN = -1000,
} xess_result_t;
/**
* @brief X<sup>e</sup>SS logging level
*/
typedef enum _xess_logging_level_t
{
XESS_LOGGING_LEVEL_DEBUG = 0,
XESS_LOGGING_LEVEL_INFO = 1,
XESS_LOGGING_LEVEL_WARNING = 2,
XESS_LOGGING_LEVEL_ERROR = 3
} xess_logging_level_t;
/**
* A logging callback provided by the application. This callback can be called from other threads.
* Message pointer are only valid inside function and may be invalid right after return call.
* Message is a null-terminated utf-8 string
*/
typedef void (*xess_app_log_callback_t)(const char *message, xess_logging_level_t loggingLevel);
#ifndef XESS_TYPES_ONLY
/** @addtogroup xess XeSS API exports
* @{
*/
/**
* @brief Gets the X<sup>e</sup>SS version. This is baked into the X<sup>e</sup>SS SDK release.
* @param[out] pVersion Returned X<sup>e</sup>SS version.
* @return X<sup>e</sup>SS return status code.
*/
XESS_API xess_result_t xessGetVersion(xess_version_t* pVersion);
/**
* @brief Gets the version of the loaded Intel XeFX library. When running on Intel platforms
* this function will return the version of the loaded Intel XeFX library, for other
* platforms 0.0.0 will be returned.
* @param hContext The X<sup>e</sup>SS context handle.
* @param[out] pVersion Returned Intel XeFX library version.
* @return X<sup>e</sup>SS return status code.
*/
XESS_API xess_result_t xessGetIntelXeFXVersion(xess_context_handle_t hContext,
xess_version_t* pVersion);
/**
* @brief Gets X<sup>e</sup>SS internal resources properties.
* @param hContext The X<sup>e</sup>SS context handle.
* @param pOutputResolution Output resolution to calculate properties for.
* @param[out] pBindingProperties Returned properties.
* @return X<sup>e</sup>SS return status code.
*/
XESS_API xess_result_t xessGetProperties(xess_context_handle_t hContext,
const xess_2d_t* pOutputResolution, xess_properties_t* pBindingProperties);
/**
* @brief Get the input resolution for a specified output resolution for a given quality setting.
* X<sup>e</sup>SS expects all the input buffers except motion vectors to be in the returned resolution.
* Motion vectors can be either in output resolution (XESS_INIT_FLAG_HIGH_RES_MV) or
* returned resolution (default).
*
* @param hContext The X<sup>e</sup>SS context handle.
* @param pOutputResolution Output resolution to calculate input resolution for.
* @param qualitySettings Desired quality setting.
* @param[out] pInputResolution Required input resolution.
* @return X<sup>e</sup>SS return status code.
*/
XESS_API xess_result_t xessGetInputResolution(xess_context_handle_t hContext,
const xess_2d_t* pOutputResolution, xess_quality_settings_t qualitySettings,
xess_2d_t* pInputResolution);
/**
* @brief Get the optimal input resolution and possible range for a specified output resolution for a given quality setting.
* X<sup>e</sup>SS expects all the input buffers except motion vectors to be in the returned resolution range
* and all input buffers to be in the same resolution.
* Motion vectors can be either in output resolution (XESS_INIT_FLAG_HIGH_RES_MV) or
* in the same resolution as other input buffers (by default).
*
* @note Aspect ratio of the input resolution must be the same as for the output resolution.
*
* @param hContext The X<sup>e</sup>SS context handle.
* @param pOutputResolution Output resolution to calculate input resolution for.
* @param qualitySettings Desired quality setting.
* @param[out] pInputResolutionOptimal Optimal input resolution.
* @param[out] pInputResolutionMin Required minimal input resolution.
* @param[out] pInputResolutionMax Required maximal input resolution.
* @return X<sup>e</sup>SS return status code.
*/
XESS_API xess_result_t xessGetOptimalInputResolution(xess_context_handle_t hContext,
const xess_2d_t* pOutputResolution, xess_quality_settings_t qualitySettings,
xess_2d_t* pInputResolutionOptimal, xess_2d_t* pInputResolutionMin, xess_2d_t* pInputResolutionMax);
/**
* @brief Gets jitter scale value.
* @param hContext The X<sup>e</sup>SS context handle.
* @param[out] pX Jitter scale pointer for the X axis.
* @param[out] pY Jitter scale pointer for the Y axis.
* @return X<sup>e</sup>SS return status code.
*/
XESS_API xess_result_t xessGetJitterScale(xess_context_handle_t hContext, float* pX, float* pY);
/**
* @brief Gets velocity scale value.
* @param hContext The X<sup>e</sup>SS context handle.
* @param[out] pX Velocity scale pointer for the X axis.
* @param[out] pY Velocity scale pointer for the Y axis.
* @return X<sup>e</sup>SS return status code.
*/
XESS_API xess_result_t xessGetVelocityScale(xess_context_handle_t hContext, float* pX, float* pY);
/**
* @brief Destroys the X<sup>e</sup>SS context.
* The user must ensure that any pending command lists are completed before destroying the context.
* @param hContext: The X<sup>e</sup>SS context handle.
* @return X<sup>e</sup>SS return status code.
*/
XESS_API xess_result_t xessDestroyContext(xess_context_handle_t hContext);
/**
* @brief Sets jitter scale value
*
* @param hContext The X<sup>e</sup>SS context handle.
* @param x scale for the X axis
* @param y scale for the Y axis
* @return X<sup>e</sup>SS return status code.
*/
XESS_API xess_result_t xessSetJitterScale(xess_context_handle_t hContext, float x, float y);
/**
* @brief Sets velocity scale value
*
* @param hContext The X<sup>e</sup>SS context handle.
* @param x scale for the X axis
* @param y scale for the Y axis
* @return X<sup>e</sup>SS return status code.
*/
XESS_API xess_result_t xessSetVelocityScale(xess_context_handle_t hContext, float x, float y);
/**
* @brief Sets exposure scale value
*
* This value will be applied on top of any passed exposure value or automatically calculated exposure.
*
* @param hContext The X<sup>e</sup>SS context handle.
* @param scale scale value.
* @return X<sup>e</sup>SS return status code.
*/
XESS_API xess_result_t xessSetExposureMultiplier(xess_context_handle_t hContext, float scale);
/**
* @brief Gets exposure scale value
*
* @param hContext The X<sup>e</sup>SS context handle.
* @param[out] pScale Exposure scale pointer.
* @return X<sup>e</sup>SS return status code.
*/
XESS_API xess_result_t xessGetExposureMultiplier(xess_context_handle_t hContext, float *pScale);
/**
* @brief Sets logging callback
*
* @param hContext The X<sup>e</sup>SS context handle.
* @param loggingLevel Minimum logging level for logging callback.
* @param loggingCallback Logging callback
* @return X<sup>e</sup>SS return status code.
*/
XESS_API xess_result_t xessSetLoggingCallback(xess_context_handle_t hContext,
xess_logging_level_t loggingLevel, xess_app_log_callback_t loggingCallback);
/**
* @brief Indicates if the installed driver supports best X<sup>e</sup>SS experience.
*
* @param hContext The X<sup>e</sup>SS context handle.
* @return xessIsOptimalDriver returns XESS_RESULT_SUCCESS, or XESS_RESULT_WARNING_OLD_DRIVER
* if installed driver may result in degraded performance or visual quality.
* xessD3D12CreateContext(..) will return XESS_RESULT_ERROR_UNSUPPORTED_DRIVER if driver does
* not support X<sup>e</sup>SS at all.
*/
XESS_API xess_result_t xessIsOptimalDriver(xess_context_handle_t hContext);
/**
* @brief Forces usage of legacy (pre 1.3.0) scale factors
*
* Following scale factors will be appied:
* @li XESS_QUALITY_SETTING_ULTRA_PERFORMANCE: 3.0
* @li XESS_QUALITY_SETTING_PERFORMANCE: 2.0
* @li XESS_QUALITY_SETTING_BALANCED: 1.7
* @li XESS_QUALITY_SETTING_QUALITY: 1.5
* @li XESS_QUALITY_SETTING_ULTRA_QUALITY: 1.3
* @li XESS_QUALITY_SETTING_AA: 1.0
* In order to apply new scale factors application should call xessGetOptimalInputResolution and
* initialization function (xess*Init)
*
* @param hContext The X<sup>e</sup>SS context handle.
* @param force if set to true legacy scale factors will be forced, if set to false - scale factors
* will be selected by X<sup>e</sup>SS
*
* @return X<sup>e</sup>SS return status code.
*/
XESS_API xess_result_t xessForceLegacyScaleFactors(xess_context_handle_t hContext, bool force);
/** @}*/
#endif
// Enum size checks. All enums must be 4 bytes
typedef char sizecheck__LINE__[ (sizeof(xess_quality_settings_t) == 4) ? 1 : -1];
typedef char sizecheck__LINE__[ (sizeof(xess_init_flags_t) == 4) ? 1 : -1];
typedef char sizecheck__LINE__[ (sizeof(xess_result_t) == 4) ? 1 : -1];
typedef char sizecheck__LINE__[ (sizeof(xess_logging_level_t) == 4) ? 1 : -1];
#ifdef __cplusplus
}
#endif
#endif