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;
99 class Context : public RefCount,public IEventSystem<EventSystemConfig::TriggerOnly>
100 {
101 protected:
103 protected:
104 Context(Runtime* runtime);
105 virtual ~Context();
106 virtual void createPlatform() = 0;
107 public:
108 virtual bool isIntegrateGpu() = 0;
109 PipeHub& pipeHub();
113 void create(ContextCreateFlags flag = ContextCreateFlag::defaultConfig);
118 template <typename T>
119 void addModule();
120 template <typename T>
121 void removeModule();
122 template <typename T>
123 T* getModule();
125 // tools
126 template <typename T>
127 T* createResource();
129 StaticMesh<uint32_t>* createMesh(const ModelMesh* modelMesh, const VertexLayout& layout);
130 StaticMesh<uint32_t>* loadMesh(const std::string& filename,const std::string& meshName, const VertexLayout& layout);
131 Image* loadTexture(const std::string& filename);
138 Image* loadTexture(const unsigned char* data, size_t size);
149 auto& syncTickers() { return m_flowControl->syncTickers(); }
150 /*
151 * 初始化阶段 可以在flush前任意修改,因为提交线程一直在等待下一帧
152 * 运行阶段 不允许修改 或 拆分flush函数,在wait currentFlush和nextFrame之间修改
153 */
154 auto& submitTickers() { return m_flowControl->submitTickers(); }
155 void flush();
157 protected:
159 {
160 std::function<void()> task;
161 };
162 boost::lockfree::queue<LogicTaskData*,boost::lockfree::capacity<1024>> m_logicTask;
163 void postLogicTask(const std::function<void()>& task)
164 {
166 data->task = task;
167 m_logicTask.push(data);
168 }
169 public:
170
174 const std::vector<Window*>& getBindWindows() { return m_bindWindows; }
176 m_bindWindows.push_back(wnd);
178 }
179
180 public:
181 void submitThread();
185 void createCompiler();
189 public:
194 void _nextFrame();
195 void _currentFlush();
196 constexpr inline void _waitCurrentFlush()
197 {
199 }
200 constexpr inline void _waitForNextFrame()
201 {
203 }
212
213 protected:
214 // 模块组件
224 protected:
225 /*
226 TokenGraph<std::string, SubmitTicker>& m_submitTickers;
227 TokenGraph<std::string, SyncTicker>& m_syncTickers;
228 */
230 std::vector<Window*> m_bindWindows;
233 std::thread m_submitThread;
235 protected:
237 //std::map<Window*, RHI::DescriptorPool*> m_descriptorPools;
239 size_t m_frameIndex = 0;//submit帧index 区别在于是 swapBuffer更改的,而m_submitFrameIndex和m_logicFrameIndex都是在同步时候更改的
240 size_t m_logicFrameIndex = 0; //逻辑帧index
241 size_t m_submitFrameIndex = 0;//submit帧index
242 std::thread::id m_submitThreadId;
243 //todo:未分离线程时,m_submitThreadId = 逻辑and提交线程 所在id
244 public:
256 void maxFrameInFlight(uint32_t maxFrameInFlight);
257 uint32_t maxFrameInFlight() const { return m_maxFrameInFlight; }
258 uint32_t currentSubmitFrameIndex() const { return m_frameIndex; }
259 /*
260 *分离了submit线程
261 *逻辑线程返回逻辑帧index
262 *提交线程返回提交帧index
263 *未分离submit 线程
264 *逻辑部分返回提交帧 index
265 *提交帧部分返返回提交帧 index
266 */
268 {
269 if (m_submitThreadId == std::this_thread::get_id())
270 {
271 return m_frameIndex;
272 }
273 return m_logicFrameIndex;
274 }
275 RHI::DescriptorPool* getDescriptorPool();
276 //todo: 考虑可能要变更为 [IRenderTarget*]<->[DescriptorPool*] map
277 uint32_t currentLogicFrameIndex() const { return m_logicFrameIndex; }
278 protected:
279 public:
280 protected:
281 protected:
282 public:
283 };
284
285
286 template <typename T>
288 {
289 if constexpr (std::is_same_v<T, ResourceManager>)
290 {
292 }
293 else if constexpr (std::is_same_v<T, RenderGraph>)
294 {
296 }
297 else
298 {
299 ferr << "Unsupported module type: " << typeid(T).name() << std::endl;
300 }
301 }
302
303 template <typename T>
305 {
306 if constexpr (std::is_same_v<T, ResourceManager>)
307 {
309 } else
310 {
311 ferr << "Unsupported module type: " << typeid(T).name() << std::endl;
312 }
313
314 }
315
316 template <typename T>
318 {
319
320 if constexpr (std::is_same_v<T, ResourceManager>)
321 {
322 return m_resourceManager;
323 }
324 else if constexpr (std::is_same_v<T, Device>)
325 {
326 return m_resourceDevice;
327 }
328 else if constexpr (std::is_same_v<T, RenderGraph>)
329 {
330 return m_renderGraph;
331 }
332 else if constexpr (std::is_same_v<T, CommandBufferGraph>)
333 {
334 return m_cmdGraph;
335 }
336 else
337 {
338 ferr << "try to get undefined context module." << std::endl;
339 return nullptr;
340 }
341 }
342}
343#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)
#define FCT_WAIT_FOR_WITH_TERM(condition, termCondition)
void postLogicTask(const std::function< void()> &task)
void removeModule()
Runtime * m_runtime
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
virtual bool isIntegrateGpu()=0
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)
PipeHub & pipeHub()
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