Files
UnrealEngine/Engine/Plugins/Experimental/OptiXDenoise/Source/ThirdParty/OptiXDenoiseBase/Public/OptiXDenoiseBase.h
2025-05-18 13:04:45 +08:00

90 lines
3.6 KiB
C++

// Copyright Epic Games, Inc. All Rights Reserved.
#pragma once
// Minimal OptiX Wrapper header for OptiX Denoise Plugin
#ifndef OPTIXDENOISEBASE
#define OPTIXDENOISEBASE_API __declspec( dllimport )
#else
#define OPTIXDENOISEBASE_API __declspec( dllexport )
#endif
#include "cuda.h"
#include "OptiXCudaFunctionList.h"
typedef CUsurfObject TSurfaceObject;
typedef enum EOptiXDenoiseAlphaMode
{
COPY,
ALPHA_AS_AOV,
FULL_DENOISE_PASS
}EOptiXDenoiseAlphaMode;
typedef unsigned int EOptiXDenoiseResult;
class FOptiXDenoiseContextImpl;
class FOpticalFlowContextImpl;
class OPTIXDENOISEBASE_API FOpticalFlowContext
{
public:
FOpticalFlowContext();
~FOpticalFlowContext();
EOptiXDenoiseResult Init(CUcontext Context, CUstream Stream, unsigned int Width, unsigned int Height);
EOptiXDenoiseResult ComputeFlow( FOptiXImageData& Flow, const FOptiXImageData* Input);
void Destroy();
private:
FOpticalFlowContextImpl* OpticalFlowContextImpl = nullptr;
};
typedef void (*OptiXDenoiseLogCallback)(unsigned int level, const char* tag, const char* message, void* cbdata);
class OPTIXDENOISEBASE_API FOptiXDenoiseContext
{
public:
FOptiXDenoiseContext();
~FOptiXDenoiseContext();
EOptiXDenoiseResult InitOptiX();
EOptiXDenoiseResult CreateContext(CUcontext CudaContext, OptiXDenoiseLogCallback LogCallBackFunction, int logCallbackLevel);
EOptiXDenoiseResult InitializeDenoiser(bool GuildNormal, bool GuildAlbedo, bool TemporalMode);
EOptiXDenoiseResult ComputeMemoryResource(uint32_t OutputWidth, uint32_t OutputHeight);
size_t GetWithoutOverlapScratchSizeInBytes() const;
size_t GetWithOverlapScratchSizeInBytes() const;
size_t GetOverlapWindowSizeInPixels() const;
size_t GetStateSizeInBytes() const;
size_t GetInternalGuideLayerPixelSizeInBytes() const;
void SetPreviousOutputInternalGuideLayer(const FOptiXImageData& OptiXImageData);
void SetOutputInternalGuideLayer(const FOptiXImageData& OptiXImageData);
EOptiXDenoiseResult SetupDenoiser(CUstream CudaStream, uint32_t InputWidth, uint32_t InputHeight, CUdeviceptr State, size_t StateSizeInBytes, CUdeviceptr Scratch, size_t ScratchSizeInBytes);
FOptiXDenoiseContext& SetDenoiseAlpha(EOptiXDenoiseAlphaMode Mode);
FOptiXDenoiseContext& SetHdrIntensity(CUdeviceptr Intensity);
FOptiXDenoiseContext& SetHdrAverageColor(CUdeviceptr AverageColor);
FOptiXDenoiseContext& SetBlendFactor(float BlendFactor);
FOptiXDenoiseContext& SetTemporalModeUsePreviousLayers(bool Use);
FOptiXDenoiseContext& SetLayerInput(const FOptiXImageData& OptiXImageData);
FOptiXDenoiseContext& SetLayerOutput(const FOptiXImageData& OptiXImageData);
FOptiXDenoiseContext& SetLayerPreviousOutput(const FOptiXImageData& OptiXImageData);
FOptiXDenoiseContext& SetGuideLayerNormal(const FOptiXImageData& OptiXImageData);
FOptiXDenoiseContext& SetGuideLayerAlbedo(const FOptiXImageData& OptiXImageData);
FOptiXDenoiseContext& SetGuideLayerFlow(const FOptiXImageData& OptiXImageData);
EOptiXDenoiseResult ComputeIntensity(CUstream CudaStream, CUdeviceptr Intensity, CUdeviceptr CudaScratch, size_t CudaScratchSize);
EOptiXDenoiseResult ComputeAverageColor(CUstream CudaStream, CUdeviceptr AverageColor, CUdeviceptr CudaScratch, size_t CudaScratchSize);
EOptiXDenoiseResult InvokeOptiXDenoise(CUstream CudaStream, CUdeviceptr CudaState, size_t CudaStateSize, uint32_t OffsetX, uint32_t OffsetY, CUdeviceptr CudaScratch, size_t CudaScratchSize);
EOptiXDenoiseResult InvokeOptiXDenoise(CUstream CudaStream, CUdeviceptr CudaState, size_t CudaStateSize, CUdeviceptr CudaScratch, size_t CudaScratchSize, uint32_t CudaOverlap, uint32_t TileWidth, uint32_t TileHeight);
void Destroy();
private:
FOptiXDenoiseContextImpl* OptiXDenoiseContextImpl = nullptr;
};