Files
o3de/Code/CryEngine/RenderDll/XRenderD3D9/D3D_SVO.h
T
2021-03-08 14:30:57 -08:00

151 lines
5.4 KiB
C++

/*
* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
* its licensors.
*
* For complete copyright and license terms please see the LICENSE at the root of this
* distribution (the "License"). All use of this software is governed by the License,
* or, if provided, by the license below or the license accompanying this file. Do not
* remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
*
*/
// Original file Copyright Crytek GMBH or its affiliates, used under license.
#ifndef __D3D_SVO__H__
#define __D3D_SVO__H__
#if defined(FEATURE_SVO_GI)
struct SSvoTargetsSet
{
SSvoTargetsSet() { ZeroStruct(*this); }
void Release();
CTexture
// tracing targets
*pRT_RGB_0, *pRT_ALD_0,
*pRT_RGB_1, *pRT_ALD_1,
// de-mosaic targets
*pRT_RGB_DEM_MIN_0, *pRT_ALD_DEM_MIN_0,
*pRT_RGB_DEM_MAX_0, *pRT_ALD_DEM_MAX_0,
*pRT_RGB_DEM_MIN_1, *pRT_ALD_DEM_MIN_1,
*pRT_RGB_DEM_MAX_1, *pRT_ALD_DEM_MAX_1,
// output
*pRT_FIN_OUT_0,
*pRT_FIN_OUT_1;
};
class CSvoRenderer
: public ISvoRenderer
{
public:
static Vec4 GetDisabledPerFrameShaderParameters();
static CSvoRenderer* GetInstance(bool bCheckAlloce = false);
void Release();
static bool IsActive();
void UpdateCompute();
void UpdateRender();
int GetIntegratioMode();
Vec4 GetPerFrameShaderParameters() const;
void DebugDrawStats(const RPProfilerStats* pBasicStats, float& ypos, const float ystep, float xposms);
static bool SetSamplers(int nCustomID, EHWShaderClass eSHClass, int nTUnit, int nTState, int nTexMaterialSlot, int nSUnit);
CTexture* GetDiffuseFinRT();
CTexture* GetSpecularFinRT();
static CTexture* GetRsmColorMap(ShadowMapFrustum& rFr, bool bCheckUpdate = false);
static CTexture* GetRsmNormlMap(ShadowMapFrustum& rFr, bool bCheckUpdate = false);
float GetSsaoAmount() { return IsActive() ? gEnv->pConsole->GetCVar("e_svoTI_SSAOAmount")->GetFVal() : 1.f; }
CTexture* GetRsmPoolCol() { return IsActive() ? m_pRsmPoolCol : NULL; }
CTexture* GetRsmPoolNor() { return IsActive() ? m_pRsmPoolNor : NULL; }
void Lock() { m_renderMutex.lock(); }
void Unlock() { m_renderMutex.unlock(); }
protected:
CSvoRenderer();
virtual ~CSvoRenderer();
bool IsShaderItemUsedForVoxelization(SShaderItem& rShaderItem, IRenderNode* pRN);
static CTexture* GetGBuffer(int nId);
void UpScalePass(SSvoTargetsSet* pTS);
void DemosaicPass(SSvoTargetsSet* pTS);
void ConeTracePass(SSvoTargetsSet* pTS);
void SetupRsmSun(const EHWShaderClass eShClass);
void SetShaderFloat(const EHWShaderClass eShClass, const CCryNameR& NameParam, const Vec4* fParams, int nParams);
void CheckCreateUpdateRT(CTexture*& pTex, int nWidth, int nHeight, ETEX_Format eTF, ETEX_Type eTT, int nTexFlags, const char* szName);
enum EComputeStages
{
eCS_ClearBricks,
eCS_InjectDynamicLights,
eCS_InjectStaticLights,
eCS_PropagateLighting_1to2,
eCS_PropagateLighting_2to3,
};
void ExecuteComputeShader(CShader* pSH, const char* szTechFinalName, EComputeStages etiStage, int* nNodesForUpdateStartIndex, int nObjPassId, PodArray<I3DEngine::SSvoNodeInfo>& arrNodesForUpdate);
void SetShaderFlags(bool bDiffuseMode = true, bool bPixelShader = true);
void SetupSvoTexturesForRead(I3DEngine::SSvoStaticTexInfo& texInfo, EHWShaderClass eShaderClass, int nStage, int nStageOpa = 0, int nStageNorm = 0);
void SetupNodesForUpdate(int& nNodesForUpdateStartIndex, PodArray<I3DEngine::SSvoNodeInfo>& arrNodesForUpdate);
void CheckAllocateRT(bool bSpecPass);
void SetupLightSources(PodArray<I3DEngine::SLightTI>& lightsTI, CShader* pShader, bool bPS);
void BindTiledLights(PodArray<I3DEngine::SLightTI>& lightsTI, EHWShaderClass shaderType);
void DrawPonts(PodArray<SVF_P3F_C4B_T2F>& arrVerts);
void UpdatePassConstantBuffer();
SSvoTargetsSet m_tsDiff, m_tsSpec;
CTexture
*m_pRT_NID_0,
*m_pRT_AIR_MIN,
*m_pRT_AIR_MAX,
*m_pRT_AIR_SHAD;
int m_nTexStateTrilinear, m_nTexStateLinear, m_nTexStatePoint, m_nTexStateLinearWrap;
Matrix44A m_matReproj;
Matrix44A m_matViewProjPrev;
CShader* m_pShader;
CTexture* m_pNoiseTex;
CTexture* m_pRsmColorMap;
CTexture* m_pRsmNormlMap;
CTexture* m_pRsmPoolCol;
CTexture* m_pRsmPoolNor;
AzRHI::ConstantBufferPtr m_PassConstantBuffer;
struct SVoxPool
{
SVoxPool() { nTexId = 0; pUAV = 0; }
void Init(ITexture* pTex);
int nTexId;
ID3D11UnorderedAccessView* pUAV;
};
SVoxPool vp_OPAC;
SVoxPool vp_RGB0;
SVoxPool vp_RGB1;
SVoxPool vp_DYNL;
SVoxPool vp_RGB2;
SVoxPool vp_RGB3;
SVoxPool vp_NORM;
SVoxPool vp_ALDI;
PodArray<I3DEngine::SSvoNodeInfo> m_nodesForStaticUpdate;
PodArray<I3DEngine::SSvoNodeInfo> m_nodesForDynamicUpdate;
PodArray<I3DEngine::SLightTI> m_arrLightsStatic;
PodArray<I3DEngine::SLightTI> m_arrLightsDynamic;
static const int SVO_MAX_NODE_GROUPS = 4;
float m_arrNodesForUpdate[SVO_MAX_NODE_GROUPS][4][4];
int m_nCurPropagationPassID;
I3DEngine::SSvoStaticTexInfo m_texInfo;
static CSvoRenderer* s_pInstance;
PodArray<I3DEngine::SSvoNodeInfo> m_arrNodeInfo;
AZStd::mutex m_renderMutex;
};
#endif
#endif