FCT
载入中...
搜索中...
未找到
Context.h
浏览该文件的文档.
1#pragma once
2#include "../ThirdParty.h"
3#include "../ToolDefine.h"
4#include "../Bases.h"
6#include "./RenderGraph.h"
8#include "./DataTypes.h"
10#include "../RHI/PixelShader.h"
11#include "../RHI/Swapcain.h"
12#include "./Material.h"
13#include "./DrawCall.h"
14#include "./ConstBuffer.h"
16#include "../Type/type.h"
17#include "./Image.h"
18#include "../RHI/CommandPool.h"
19#include "../RHI/Pass.h"
20#include "../RHI/Fence.h"
21#include "../RHI/Semaphore.h"
22#include "../RHI/Sampler.h"
23#include "../RHI/InputLayout.h"
25#include "./ShaderCompiler.h"
26#include "./ShaderGenerator.h"
28#include "./OldRenderGraph.h"
29#include "FencePool.h"
30#include "SemaphorePool.h"
31#include "./Device.h"
32#include "Mesh.h"
33#include "../Base/TokenGraph.h"
35#include "./ResourceManager.h"
36#include "./ContextEvent.h"
37#include "./RenderGraph.h"
40#include "./FlowControl.h"
41namespace FCT
42{
44
45 class BlendState;
46 class OldPass;
47 namespace RHI
48 {
49 class TextureView;
50 class ConstBuffer;
51 class IndexBuffer;
52 }
53
54 class VertexBuffer;
55 //class InputLayout;
56 class VertexShader;
57 class PixelShader;
58 class DrawCall;
59 class Window;
60 class SemaphorePool;
61 class FencePool;
62 class RenderGraph;
63
64 using TickerToken = uint32_t;
65 /*Context作用
66 *1.作为Context接口
67 *2.作为RenderGraph系统
68 *3.作为帧 管理器(合并在RenderGraph系统)
69 */
70 constexpr const char* RenderGraphSubmitTickerName = "RenderGraphSubmitTicker";
71 constexpr const char* RenderGraphExcutePassSubmitTickerName = "RenderGraphExcutePassSubmitTicker";
72 constexpr const char* SwapBufferSubmitTicker = "SwapBufferSubmitTicker";
73 constexpr const char* RenderGraphSyncTicker_SwapJobQueueName = "RenderGraphSyncTicker_SwapJobQueue";
74 namespace InnerSync
75 {
76 constexpr const char* CheckRecreateSwapchainSync = "CheckRecreateSwapchainSync";
77 constexpr const char* AdvanceFrameIndex = "AdvanceFrameIndex";
78 }
79 namespace ContextTicker
80 {
81
82 }
83
88 class Runtime;
97 class Context : public RefCount,public IEventSystem<EventSystemConfig::TriggerOnly>
98 {
99 protected:
100 protected:
101 Context(Runtime* runtime);
102 virtual ~Context();
103 virtual void createPlatform() = 0;
104 public:
108 void create(ContextCreateFlags flag = ContextCreateFlag::defaultConfig);
113 template <typename T>
114 void addModule();
115 template <typename T>
116 void removeModule();
117 template <typename T>
118 T* getModule();
120 // tools
121 template <typename T>
122 T* createResource();
124 StaticMesh<uint32_t>* createMesh(const ModelMesh* modelMesh, const VertexLayout& layout);
125 StaticMesh<uint32_t>* loadMesh(const std::string& filename,const std::string& meshName, const VertexLayout& layout);
126 Image* loadTexture(const std::string& filename);
137 auto& syncTickers() { return m_flowControl->syncTickers(); }
138 /*
139 * 初始化阶段 可以在flush前任意修改,因为提交线程一直在等待下一帧
140 * 运行阶段 不允许修改 或 拆分flush函数,在wait currentFlush和nextFrame之间修改
141 */
142 auto& submitTickers() { return m_flowControl->submitTickers(); }
143 void flush();
145 protected:
147 {
148 std::function<void()> task;
149 };
150 boost::lockfree::queue<LogicTaskData*,boost::lockfree::capacity<1024>> m_logicTask;
151 void postLogicTask(const std::function<void()>& task)
152 {
154 data->task = task;
155 m_logicTask.push(data);
156 }
157 public:
158
162 const std::vector<Window*>& getBindWindows() { return m_bindWindows; }
164 m_bindWindows.push_back(wnd);
166 }
167
168 public:
169 void submitThread();
173 void createCompiler();
177 public:
182 void _nextFrame();
183 void _currentFlush();
184 constexpr inline void _waitCurrentFlush()
185 {
187 }
188 constexpr inline void _waitForNextFrame()
189 {
191 }
200
201 protected:
202 // 模块组件
212 protected:
213 /*
214 TokenGraph<std::string, SubmitTicker>& m_submitTickers;
215 TokenGraph<std::string, SyncTicker>& m_syncTickers;
216 */
218 std::vector<Window*> m_bindWindows;
221 std::thread m_submitThread;
223 protected:
225 //std::map<Window*, RHI::DescriptorPool*> m_descriptorPools;
227 size_t m_frameIndex = 0;//submit帧index 区别在于是 swapBuffer更改的,而m_submitFrameIndex和m_logicFrameIndex都是在同步时候更改的
228 size_t m_logicFrameIndex = 0; //逻辑帧index
229 size_t m_submitFrameIndex = 0;//submit帧index
230 std::thread::id m_submitThreadId;
231 //todo:未分离线程时,m_submitThreadId = 逻辑and提交线程 所在id
232 public:
244 void maxFrameInFlight(uint32_t maxFrameInFlight);
245 uint32_t maxFrameInFlight() const { return m_maxFrameInFlight; }
246 uint32_t currentSubmitFrameIndex() const { return m_frameIndex; }
247 /*
248 *分离了submit线程
249 *逻辑线程返回逻辑帧index
250 *提交线程返回提交帧index
251 *未分离submit 线程
252 *逻辑部分返回提交帧 index
253 *提交帧部分返返回提交帧 index
254 */
256 {
257 if (m_submitThreadId == std::this_thread::get_id())
258 {
259 return m_frameIndex;
260 }
261 return m_logicFrameIndex;
262 }
263 RHI::DescriptorPool* getDescriptorPool();
264 //todo: 考虑可能要变更为 [IRenderTarget*]<->[DescriptorPool*] map
265 uint32_t currentLogicFrameIndex() const { return m_logicFrameIndex; }
266 protected:
267 public:
268 protected:
269 protected:
270 public:
271 };
272
273
274 template <typename T>
276 {
277 if constexpr (std::is_same_v<T, ResourceManager>)
278 {
280 }
281 else if constexpr (std::is_same_v<T, RenderGraph>)
282 {
284 }
285 else
286 {
287 ferr << "Unsupported module type: " << typeid(T).name() << std::endl;
288 }
289 }
290
291 template <typename T>
293 {
294 if constexpr (std::is_same_v<T, ResourceManager>)
295 {
297 } else
298 {
299 ferr << "Unsupported module type: " << typeid(T).name() << std::endl;
300 }
301
302 }
303
304 template <typename T>
306 {
307
308 if constexpr (std::is_same_v<T, ResourceManager>)
309 {
310 return m_resourceManager;
311 }
312 else if constexpr (std::is_same_v<T, Device>)
313 {
314 return m_resourceDevice;
315 }
316 else if constexpr (std::is_same_v<T, RenderGraph>)
317 {
318 return m_renderGraph;
319 }
320 else if constexpr (std::is_same_v<T, CommandBufferGraph>)
321 {
322 return m_cmdGraph;
323 }
324 else
325 {
326 ferr << "try to get undefined context module." << std::endl;
327 return nullptr;
328 }
329 }
330}
331#include "Mesh.hpp"
#define FCT_DECLARE_FLAGS(BitType)
#define FCT_NEW(type,...)
#define FCT_SAFE_DELETE(var)
#define FCT_SAFE_NEW(var, type,...)
#define FCT_WAIT_FOR(condition)
void postLogicTask(const std::function< void()> &task)
void removeModule()
uint32_t m_maxFrameInFlight
RenderGraph * m_renderGraph
ShaderCompiler * getCompiler()
size_t m_submitFrameIndex
void maxFrameInFlight(uint32_t maxFrameInFlight)
uint32_t currentLogicFrameIndex() const
RHI::DescriptorPool * m_descriptorPool
ShaderCompiler * m_compiler
ModelLoader * m_modelLoader
ShaderGenerator * getGenerator()
Image * loadTexture(const std::string &filename)
auto & syncTickers()
const std::vector< Window * > & getBindWindows()
uint32_t currentFrameIndex()
size_t m_logicFrameIndex
std::thread m_submitThread
ImageLoader * m_imageLoader
StaticMesh< uint32_t > * createMesh(const ModelMesh *modelMesh, const VertexLayout &layout)
uint32_t maxFrameInFlight() const
CommandBufferGraph * m_cmdGraph
constexpr void _waitCurrentFlush()
ResourceManager * m_resourceManager
virtual void createPlatform()=0
Device * m_resourceDevice
virtual RHI::RasterizationPipeline * createTraditionPipeline()=0
FlowControl * m_flowControl
void advanceLogicFrame()
constexpr void _waitForNextFrame()
std::vector< Window * > m_bindWindows
uint32_t currentSubmitFrameIndex() const
ShaderGenerator * m_generator
void create(ContextCreateFlags flag=ContextCreateFlag::defaultConfig)
Context(Runtime *runtime)
void advanceSubmitFrame()
size_t m_frameIndex
void onWindowBound(Window *wnd)
StaticMesh< uint32_t > * loadMesh(const std::string &filename, const std::string &meshName, const VertexLayout &layout)
auto & submitTickers()
std::thread::id m_submitThreadId
boost::lockfree::queue< LogicTaskData *, boost::lockfree::capacity< 1024 > > m_logicTask
SubmitTicker m_ticker
constexpr const char * CheckRecreateSwapchainSync
constexpr const char * AdvanceFrameIndex
ContextCreateFlag
constexpr const char * RenderGraphSyncTicker_SwapJobQueueName
std::ostream & ferr
constexpr const char * RenderGraphExcutePassSubmitTickerName
uint32_t TickerToken
constexpr const char * SwapBufferSubmitTicker
constexpr const char * RenderGraphSubmitTickerName
std::function< void()> SubmitTicker
std::function< void()> task