FCT
载入中...
搜索中...
未找到
Context.cpp
浏览该文件的文档.
1//
2// Created by Administrator on 2025/3/16.
3//
4#include "../FCTAPI.h"
5#include "./Context.h"
6#include "RenderGraph.h"
8
9
10namespace FCT {
12 m_nextFrame = true;
13 }
14
16 m_currentFlush = true;
17 }
18
19
20 Image* Context::loadTexture(const std::string& filename)
21 {
22 auto data = m_imageLoader->load(filename);
23 SingleBufferImage* image = new SingleBufferImage(this);
24 image->width(data.width);
25 image->height(data.height);
26
27 bool isSRGB = true;
28
29
30 Format format;
31 switch (data.channels) {
32 case 1:
33 format = Format::R8_UNORM;
34 break;
35 case 2:
36 format = Format::R8G8_UNORM;
37 break;
38 case 3:
40 break;
41 case 4:
43 break;
44 default:
45 ferr << "Unsupported number of channels: " << data.channels << std::endl;
47 break;
48 }
49
50 image->format(format);
51 image->as(ImageUsage::Texture);
52 image->initData(data.data.data(), data.data.size());
53 image->create();
54 return image;
55 }
56
57 Image* Context::loadTexture(const unsigned char* memData, size_t size)
58 {
59
60 auto data = m_imageLoader->loadFromMemory(memData, size);
61 SingleBufferImage* image = new SingleBufferImage(this);
62 image->width(data.width);
63 image->height(data.height);
64
65 bool isSRGB = true;
66
67
68 Format format;
69 switch (data.channels) {
70 case 1:
71 format = Format::R8_UNORM;
72 break;
73 case 2:
74 format = Format::R8G8_UNORM;
75 break;
76 case 3:
78 break;
79 case 4:
81 break;
82 default:
83 ferr << "Unsupported number of channels: " << data.channels << std::endl;
85 break;
86 }
87
88 image->format(format);
89 image->as(ImageUsage::Texture);
90 image->initData(data.data.data(), data.data.size());
91 image->create();
92 return image;
93 }
94
95
97 {
98 m_runtime = runtime;
100 auto& m_submitTickers = m_flowControl->submitTickers();
101 auto& m_syncTickers = m_flowControl->syncTickers();
102
103 m_cmdGraph = nullptr;
104 m_renderGraph = nullptr;
105 m_resourceManager = nullptr;
106 m_compiler = nullptr;
107 m_ctxRunning = true;
108 //m_flushWnd = nullptr;
109 m_nextFrame = false;
110 m_currentFlush = true;
111 bool isInited = false;
112 m_submitThread = std::thread([this,&isInited]
113 {
114 m_submitThreadId = std::this_thread::get_id();
115 isInited = true;
116 submitThread();
117 });
118 FCT_WAIT_FOR(isInited);
121 m_frameIndex = 0;
123 m_imageLoader = runtime->createImageLoader();
124 m_modelLoader = runtime->createModelLoader();
125 m_submitTickers[SwapBufferSubmitTicker] = {
126 [this]()
127 {
128 std::this_thread::yield();
129 {
130 ScopeTimer waitGpuTimer("waitGpu");
131 m_cmdGraph->swapBuffer();
132 //swapBuffers();
133 }
134 },
135 {},
136 {}
137 };
138 m_submitTickers.update();
140 {
141 [this]()
142 {
143 for (auto& window : m_bindWindows)
144 {
145 window->swapchain()->sync();
146 }
147 },
148 {},
150 };
151 m_syncTickers[InnerSync::AdvanceFrameIndex] =
152 {
153 [this]()
154 {
157 },
158 {},
159 {}
160 };
161 m_syncTickers.update();
162 }
163
169
171 {
172 return m_runtime->pipeHub();
173 }
174
192
194 {
195 if (!modelMesh) {
196 return nullptr;
197 }
198
199 StaticMesh<uint32_t>* mesh = new StaticMesh<uint32_t>(this, layout);
200 VertexBuffer* vertexBuffer = mesh->getVertexBuffer();
201 vertexBuffer->resize(modelMesh->vertices.size());
202 for (uint32_t i = 0; i < modelMesh->vertices.size(); ++i) {
203 const auto& modelVertex = modelMesh->vertices[i];
204 Vertex vertex = (*vertexBuffer)[i];
205
206 for (size_t j = 0; j < layout.getElementCount(); ++j) {
207 const VertexElement& element = layout.getElement(j);
208 setVertexAttributeFromModel(vertex, j, element, modelVertex);
209 }
210 }
211
212 std::vector<uint32_t> indices = modelMesh->indices;
213 mesh->setIndices(indices);
214
215 mesh->create();
216
217 return mesh;
218 }
219
220 StaticMesh<uint32_t>* Context::loadMesh(const std::string& filename, const std::string& meshName,
221 const VertexLayout& layout)
222 {
223 auto md = m_modelLoader->loadModel(filename);
224 auto mMesh = md->findMesh(meshName);
225 return createMesh(mMesh,layout);
226 }
227}
#define FCT_SAFE_DELETE(var)
#define FCT_WAIT_FOR(condition)
Runtime * m_runtime
uint32_t m_maxFrameInFlight
RenderGraph * m_renderGraph
void submitThread()
RHI::DescriptorPool * m_descriptorPool
ShaderCompiler * m_compiler
ModelLoader * m_modelLoader
Image * loadTexture(const std::string &filename)
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
ResourceManager * m_resourceManager
virtual void createPlatform()=0
Device * m_resourceDevice
void createCompiler()
FlowControl * m_flowControl
void advanceLogicFrame()
std::vector< Window * > m_bindWindows
ShaderGenerator * m_generator
void create(ContextCreateFlags flag=ContextCreateFlag::defaultConfig)
virtual ~Context()
PipeHub & pipeHub()
Context(Runtime *runtime)
void advanceSubmitFrame()
size_t m_frameIndex
StaticMesh< uint32_t > * loadMesh(const std::string &filename, const std::string &meshName, const VertexLayout &layout)
std::thread::id m_submitThreadId
Format format() const
定义 Image.h:64
int height() const
定义 Image.h:76
int width() const
定义 Image.h:75
ModelLoader * createModelLoader()
ImageLoader * createImageLoader()
void initData(void *data, int size)
void as(ImageUsages usage) override
void setIndices(const std::vector< IndexType > &indices)
定义 Mesh.h:43
VertexBuffer * getVertexBuffer() const
定义 Mesh.h:84
void resize(size_t vertexCount)
constexpr size_t getElementCount() const noexcept
constexpr const VertexElement & getElement(size_t index) const noexcept
constexpr const char * CheckRecreateSwapchainSync
constexpr const char * AdvanceFrameIndex
std::ostream & ferr
constexpr const char * SwapBufferSubmitTicker
void setVertexAttributeFromModel(Vertex &vertex, size_t elementIndex, const VertexElement &element, const ModelVertex &modelVertex)
std::vector< uint32_t > indices
std::vector< ModelVertex > vertices