1 // Copyright 2001-2018 Crytek GmbH / Crytek Group. All rights reserved.
3 /*=============================================================================
4 RenderPipeline.h : Shaders pipeline declarations.
7 * Created by Honich Andrey
9 =============================================================================*/
11 #ifndef __RENDERPIPELINE_H__
12 #define __RENDERPIPELINE_H__
16 #include <CryThreading/CryThreadSafeRendererContainer.h>
17 #include <CryThreading/CryThreadSafeWorkerContainer.h>
18 #include "Shadow_Renderer.h"
20 #include "LightVolumeBuffer.h"
21 #include "ParticleBuffer.h"
23 #include "Common/Shaders/CShader.h" // CShaderMan
24 #include "Common/Shaders/ShaderResources.h" // CShaderResources
25 //====================================================================
33 #define MAX_REND_SHADERS 4096
34 #define MAX_REND_SHADER_RES 16384
36 struct CRY_ALIGN(32) SRendItem
45 SRendItemSorter rendItemSorter
;
48 CRenderObject
* pRenderObject
;
49 CCompiledRenderObject
* pCompiledObject
;
51 CRenderElement
* pElem
;
52 //uint32 nStencRef : 8;
54 static float EncodeDistanceSortingValue(CRenderObject
* pObj
)
56 return pObj
->m_fDistance
+ pObj
->m_fSort
;
59 static float EncodeCustomDistanceSortingValue(CRenderObject
* pObj
)
61 int nRenderAlways
= pObj
->m_pRenderNode
->GetRndFlags() & ERF_RENDER_ALWAYS
;
62 float comp
= pObj
->m_fDistance
+ pObj
->m_fSort
;
63 return nRenderAlways
? std::numeric_limits
<float>::lowest() + comp
: comp
;
66 static uint32
EncodeObjFlagsSortingValue(CRenderObject
* pObj
)
68 return (pObj
->m_ObjFlags
& ~0xFFFF) + (pObj
->m_nSort
& 0xFFFF);
71 static bool TestObjFlagsSortingValue(uint32 nFlag
, uint32 sortingValue
)
73 return (nFlag
& sortingValue
) != 0;
76 static inline void ExtractShaderItem(uint32 nVal
, SShaderItem
& sh
)
78 CShader
* pShader
= (CShader
*)(CShaderMan::s_pContainer
->m_RList
[CBaseResource::RListIndexFromId((nVal
>> 20) & (MAX_REND_SHADERS
- 1))]);
79 sh
.m_pShader
= static_cast<IShader
*>(pShader
);
80 uint32 nTechnique
= (nVal
& 0x3f);
81 if (nTechnique
== 0x3f)
83 sh
.m_nTechnique
= nTechnique
;
84 int nRes
= (nVal
>> 6) & (MAX_REND_SHADER_RES
- 1);
85 sh
.m_pShaderResources
= (IRenderShaderResources
*)((nRes
) ? CShader::s_ShaderResources_known
[nRes
] : nullptr);
88 static inline uint32
PackShaderItem(const SShaderItem
& shaderItem
)
90 uint32 nResID
= shaderItem
.m_pShaderResources
? ((CShaderResources
*)(shaderItem
.m_pShaderResources
))->m_Id
: 0;
91 uint32 nShaderId
= ((CShader
*)shaderItem
.m_pShader
)->mfGetID();
92 assert(nResID
< CShader::s_ShaderResources_known
.size());
93 assert(nShaderId
!= 0);
94 uint32 value
= (nResID
<< 6) | (nShaderId
<< 20) | (shaderItem
.m_nTechnique
& 0x3f);
98 // Sort by SortVal member of RI
99 static void mfSortPreprocess(SRendItem
* First
, int Num
);
101 static void mfSortByDist(SRendItem
* First
, int Num
, bool bDecals
, bool InvertedOrder
= false);
103 static void mfSortByLight(SRendItem
* First
, int Num
, bool bSort
, const bool bIgnoreRePtr
, bool bSortDecals
);
104 // Special sorting for ZPass (compromise between depth and batching)
105 static void mfSortForZPass(SRendItem
* First
, int Num
);
108 //==================================================================
111 //Note: If these are altered, g_StencilFuncLookup and g_StencilOpLookup arrays
112 // need to be updated in turn
113 enum EStencilStateFunction
115 FSS_STENCFUNC_ALWAYS
= 0x0,
116 FSS_STENCFUNC_NEVER
= 0x1,
117 FSS_STENCFUNC_LESS
= 0x2,
118 FSS_STENCFUNC_LEQUAL
= 0x3,
119 FSS_STENCFUNC_GREATER
= 0x4,
120 FSS_STENCFUNC_GEQUAL
= 0x5,
121 FSS_STENCFUNC_EQUAL
= 0x6,
122 FSS_STENCFUNC_NOTEQUAL
= 0x7,
123 FSS_STENCFUNC_MASK
= 0x7
126 #define FSS_STENCIL_TWOSIDED 0x8
128 #define FSS_CCW_SHIFT 16
132 FSS_STENCOP_KEEP
= 0x0,
133 FSS_STENCOP_REPLACE
= 0x1,
134 FSS_STENCOP_INCR
= 0x2,
135 FSS_STENCOP_DECR
= 0x3,
136 FSS_STENCOP_ZERO
= 0x4,
137 FSS_STENCOP_INCR_WRAP
= 0x5,
138 FSS_STENCOP_DECR_WRAP
= 0x6,
139 FSS_STENCOP_INVERT
= 0x7
142 #define FSS_STENCFAIL_SHIFT 4
143 #define FSS_STENCFAIL_MASK (0x7 << FSS_STENCFAIL_SHIFT)
145 #define FSS_STENCZFAIL_SHIFT 8
146 #define FSS_STENCZFAIL_MASK (0x7 << FSS_STENCZFAIL_SHIFT)
148 #define FSS_STENCPASS_SHIFT 12
149 #define FSS_STENCPASS_MASK (0x7 << FSS_STENCPASS_SHIFT)
151 #define STENC_FUNC(op) (op)
152 #define STENC_CCW_FUNC(op) (op << FSS_CCW_SHIFT)
153 #define STENCOP_FAIL(op) (op << FSS_STENCFAIL_SHIFT)
154 #define STENCOP_ZFAIL(op) (op << FSS_STENCZFAIL_SHIFT)
155 #define STENCOP_PASS(op) (op << FSS_STENCPASS_SHIFT)
156 #define STENCOP_CCW_FAIL(op) (op << (FSS_STENCFAIL_SHIFT + FSS_CCW_SHIFT))
157 #define STENCOP_CCW_ZFAIL(op) (op << (FSS_STENCZFAIL_SHIFT + FSS_CCW_SHIFT))
158 #define STENCOP_CCW_PASS(op) (op << (FSS_STENCPASS_SHIFT + FSS_CCW_SHIFT))
161 #define BIT_STENCIL_RESERVED 0x80
162 #define BIT_STENCIL_INSIDE_CLIPVOLUME 0x40
163 #define BIT_STENCIL_ALLOW_TERRAINLAYERBLEND 0x20
164 #define BIT_STENCIL_ALLOW_DECALBLEND 0x10
165 #define STENCIL_VALUE_OUTDOORS 0x0
167 #define STENC_VALID_BITS_NUM 7
168 #define STENC_MAX_REF ((1 << STENC_VALID_BITS_NUM) - 1)
174 FB_TRANSPARENT
= 0x2,
177 FB_BELOW_WATER
= 0x10,
179 FB_PREPROCESS
= 0x40,
180 FB_MOTIONBLUR
= 0x80,
181 FB_POST_3D_RENDER
= 0x100,
182 FB_MULTILAYERS
= 0x200,
183 FB_COMPILED_OBJECT
= 0x400,
184 FB_CUSTOM_RENDER
= 0x800,
185 FB_RESOLVE_FULL
= 0x1000,
186 FB_LAYER_EFFECT
= 0x2000,
187 FB_WATER_REFL
= 0x4000,
188 FB_WATER_CAUSTIC
= 0x8000,
190 FB_TILED_FORWARD
= 0x20000,
191 FB_REFRACTION
= 0x40000,
192 FB_EYE_OVERLAY
= 0x80000,
194 FB_MASK
= 0xfffff //! FB flags cannot exceed 0xfffff
197 enum SRenderShaderLightMaskFlags
202 SLMF_TYPE_MASK
= (SLMF_POINT
| SLMF_PROJECTED
)
205 #define SLMF_LTYPE_SHIFT 8
206 #define SLMF_LTYPE_BITS 4
213 SHAPE_CLIP_PROJECTOR
,
214 SHAPE_CLIP_PROJECTOR1
,
215 SHAPE_CLIP_PROJECTOR2
,
216 SHAPE_SIMPLE_PROJECTOR
,
223 #endif // __RENDERPIPELINE_H__