FCT
载入中...
搜索中...
未找到
ResourceManager.cpp
浏览该文件的文档.
1//
2// Created by Administrator on 2025/7/28.
3//
4#include "ResourceManager.h"
5
6#include "MutilBufferImage.h"
7#include "SingleBufferImage.h"
8
9#include "./Context.h"
10#include "../Base/TokenGraph.h"
11#include "../RHI/Swapcain.h"
12#include "../UI/Window.h"
13
14namespace FCT {
15 std::string WindowToToken(Window* wnd)
16 {
17 return SwapchainToToken(wnd->swapchain());
18 }
19
20 std::string SwapchainToToken(RHI::Swapchain* swapchain)
21 {
22 return "Swapchain_" + std::to_string(reinterpret_cast<uintptr_t>(swapchain));
23 }
24
26 {
27 img = swapchain->image();
28 autoIndex = false;
29 }
30
32 {
33 mutilBuffer = denpendency->mutilBuffer;
34 autoIndex = true;
35 }
36
38 {
40 m_context = ctx;
42 {
43 registerWindow(env.window);
44 });
45 auto& tickerGraph = m_context->submitTickers();
47 [this]()
48 {
49 for (auto image : m_needChangeIndexImages)
50 {
51 auto img = dynamic_cast<MutilBufferImage*>(image.img);
52 img->changeCurrentIndex(m_context->currentLogicFrameIndex());
53 }
54 },
56 {}
57 };
58 for (auto wnd : m_context->getBindWindows())
59 {
60 registerWindow(wnd);
61 }
62 }
63
64 Image* ResourceManager::allocateImage(std::string name, Window* dependency,ImageDesc desc)
65 {
66 return allocateImage(name, WindowToToken(dependency),desc);
67 }
68
69 Image* ResourceManager::allocateImage(std::string name, std::string dependency,ImageDesc desc)
70 {
71 auto saved = m_dependencyGraph[dependency]->value;
72 auto ret = ImageSaved(saved);
73 if (ret.mutilBuffer)
74 {
75 auto savedImg = dynamic_cast<MutilBufferImage*>(saved.img);
76 auto img = m_resourceDevice->createResource<MutilBufferImage>();
77 img->samples(savedImg->samples());
78 img->format(desc.format);
79 img->width(savedImg->width());
80 img->height(savedImg->height());
81 img->imageCount(savedImg->imageCount());
82 img->as(desc.usage);
83 img->create();
84 ret.img = img;
85 } else
86 {
87 auto savedImg = dynamic_cast<SingleBufferImage*>(saved.img);
88 auto img = m_resourceDevice->createResource<SingleBufferImage>();
89 img->samples(savedImg->samples());
90 img->format(desc.format);
91 img->width(savedImg->width());
92 img->height(savedImg->height());
93 img->as(desc.usage);
94 img->create();
95 ret.img = img;
96 }
97 m_dependencyGraph[name] = {
98 ret,
99 {dependency},
100 {},
101 };
102 updateGraph();
103 return ret.img;
104 }
105
107 {
108 m_dependencyGraph.update();
109 m_needChangeIndexImages = m_dependencyGraph.computeOrder([](const ImageSaved& saved)
110 {
111 return saved.mutilBuffer && saved.autoIndex;
112 });
113 }
114
116 {
117 std::string token = WindowToToken(wnd);
118 RHI::Swapchain* swapchain = wnd->swapchain();
119 swapchain->subscribe<SwapchainEvent::Recreate>([this](const SwapchainEvent::Recreate& env)
120 {
121 resizeSub(
122 SwapchainToToken(env.swapchain),
123 env.width,
124 env.height);
125 });
126 m_dependencyGraph[token] = {
127 ImageSaved(swapchain),
128 {},
129 {},
130 };
131 updateGraph();
132 }
133
134 void ResourceManager::resizeSub(std::string token, int width, int height)
135 {
136 m_dependencyGraph.visitBFS(token,[width,height](ImageSaved img)
137 {
138 img.img->resize(width,height);
139 },false);
140 }
141
142 void ResourceManager::resize(std::string token, int width, int height)
143 {
144 m_dependencyGraph.visitBFS(token,[width,height](ImageSaved img)
145 {
146 img.img->resize(width,height);
147 },true);
148 }
149
150
151}
152//todo:
153namespace FCT
154{
155 void ResourceManager::resizeImage(std::string name, int width, int height)
156 {
157
158 }
160 {
161 auto ret = ImageSaved();
162 auto img = m_resourceDevice->createResource<MutilBufferImage>();
163 img->samples(desc.samples);
164 img->format(desc.format);
165 img->width(desc.width);
166 img->height(desc.height);
167 img->imageCount(m_context->maxFrameInFlight());
168 img->as(desc.usage);
169 img->create();
170 ret.img = img;
171 m_dependencyGraph[name] = {
172 ret,
173 {},
174 {},
175 };
176 updateGraph();
177 return ret.img;
178 }
179}
SubscribeId subscribe(Func &&func)
Samples samples() const
定义 Image.h:65
virtual void resize(uint32_t width, uint32_t height)=0
virtual FCT::Image * image() const =0
void resizeSub(std::string token, int width, int height)
void resize(std::string token, int width, int height)
TokenGraph< std::string, ImageSaved > m_dependencyGraph
void resizeImage(std::string name, int width, int height)
挂起resize一个image
Image * allocateTarget(std::string name, TargetDesc desc)
分配的是独立的Target,例如窗口一类的就算为独立Target
std::vector< ImageSaved > m_needChangeIndexImages
Image * allocateImage(std::string name, Window *dependency, ImageDesc desc)
分配中间Target / 图像
RHI::Swapchain * swapchain() const
constexpr const char * ImageGraph_ChangeIndex
std::string WindowToToken(Window *wnd)
constexpr const char * SwapBufferSubmitTicker
std::string SwapchainToToken(RHI::Swapchain *swapchain)
ImageSaved(RHI::Swapchain *swapchain)