!XI Integrating missing CL 1716485 from hunt_engine_stabilization to hunt_dev_engine...
[CRYENGINE.git] / Code / CryEngine / RenderDll / Common / RenderPipeline.h
blob73f5f492a23773fa2476f9459845561c96d0af2f
1 // Copyright 2001-2018 Crytek GmbH / Crytek Group. All rights reserved.
3 /*=============================================================================
4 RenderPipeline.h : Shaders pipeline declarations.
6 Revision history:
7 * Created by Honich Andrey
9 =============================================================================*/
11 #ifndef __RENDERPIPELINE_H__
12 #define __RENDERPIPELINE_H__
14 #pragma once
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 //====================================================================
29 class CRenderView;
30 struct IRenderNode;
31 struct IRenderMesh;
33 #define MAX_REND_SHADERS 4096
34 #define MAX_REND_SHADER_RES 16384
36 struct CRY_ALIGN(32) SRendItem
38 uint32 SortVal;
39 uint32 nBatchFlags;
40 union
42 uint32 ObjSort;
43 float fDist;
45 SRendItemSorter rendItemSorter;
46 union
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)
82 nTechnique = -1;
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);
95 return value;
98 // Sort by SortVal member of RI
99 static void mfSortPreprocess(SRendItem* First, int Num);
100 // Sort by distance
101 static void mfSortByDist(SRendItem* First, int Num, bool bDecals, bool InvertedOrder = false);
102 // Sort by light
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 //==================================================================
109 // StencilStates
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
130 enum EStencilStateOp
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))
160 //Stencil masks
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)
170 //Batch flags.
171 enum EBatchFlags
173 FB_GENERAL = 0x1,
174 FB_TRANSPARENT = 0x2,
175 FB_SKIN = 0x4,
176 FB_Z = 0x8,
177 FB_BELOW_WATER = 0x10,
178 FB_ZPREPASS = 0x20,
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,
189 FB_DEBUG = 0x10000,
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
199 SLMF_DIRECT = 0,
200 SLMF_POINT = 1,
201 SLMF_PROJECTED = 2,
202 SLMF_TYPE_MASK = (SLMF_POINT | SLMF_PROJECTED)
205 #define SLMF_LTYPE_SHIFT 8
206 #define SLMF_LTYPE_BITS 4
208 enum EShapeMeshType
210 SHAPE_PROJECTOR = 0,
211 SHAPE_PROJECTOR1,
212 SHAPE_PROJECTOR2,
213 SHAPE_CLIP_PROJECTOR,
214 SHAPE_CLIP_PROJECTOR1,
215 SHAPE_CLIP_PROJECTOR2,
216 SHAPE_SIMPLE_PROJECTOR,
217 SHAPE_SPHERE,
218 SHAPE_BOX,
219 SHAPE_MAX,
223 #endif // __RENDERPIPELINE_H__