FCT
载入中...
搜索中...
未找到
MutilBufferImage.cpp
浏览该文件的文档.
1//
2// Created by Administrator on 2025/3/30.
3//
4
5#include "../FCTAPI.h"
7#include "../RHI/Image.h"
9#include "./Context.h"
10namespace FCT
11{
16
18 {
19 return static_cast<MutilBufferImage*>(m_image)->m_images[0]->format();
20 }
21
23 {
24 return static_cast<MutilBufferImage*>(m_image)->m_images[0]->samples();
25 }
26
31
33 {
34 for (auto img : m_images)
35 {
37 }
38 for (auto rtv : m_rtvs)
39 {
40 rtv->release();
41 }
42 for (auto dsv : m_dsvs)
43 {
44 dsv->release();
45 }
46 for (auto tv : m_tvs)
47 {
48 tv->release();
49 }
50 }
51
52 void MutilBufferImage::resize(uint32_t width, uint32_t height)
53 {
54 if (m_width == width && m_height == height)
55 {
56 return;
57 }
58
59 Format currentFormat = m_format;
60 Samples currentSamples = m_samples;
61 ImageUsages currentUsage = m_usage;
62 uint32_t currentImageCount = m_imageCount;
63
64 for (auto img : m_images)
65 {
67 }
68 m_images.clear();
69
70 for (auto rtv : m_rtvs)
71 {
72 rtv->release();
73 }
74 m_rtvs.clear();
75
76 for (auto dsv : m_dsvs)
77 {
78 dsv->release();
79 }
80 m_dsvs.clear();
81 for (auto tv : m_tvs)
82 {
83 tv->release();
84 }
85 m_tvs.clear();
86
87 m_width = width;
89
90 for (uint32_t i = 0; i < currentImageCount; ++i)
91 {
92 auto image = m_ctx->createResource<RHI::Image>();
93 image->width(m_width);
94 image->height(m_height);
95 image->format(currentFormat);
96 image->samples(currentSamples);
97 image->usage(currentUsage);
98 image->create();
99 m_images.push_back(image);
100 }
101
102 as(currentUsage);
103
104 if (m_currentIndex >= m_images.size() && !m_images.empty())
105 {
106 m_currentIndex = 0;
107 }
108
109 }
110
112 {
113 for (uint32_t i = 0; i < m_imageCount; ++i)
114 {
115 auto image = m_ctx->createResource<RHI::Image>();
116 image->width(m_width);
117 image->height(m_height);
118 image->format(m_format);
119 image->samples(m_samples);
120 image->usage(m_usage);
121 image->create();
122 m_images.push_back(image);
123 }
124
125 delete m_behavior;
127
128 as(m_usage);
129
130 if (m_currentIndex >= m_images.size() && !m_images.empty())
131 {
132 m_currentIndex = 0;
133 }
134 }
135 void MutilBufferImage::create(std::vector<RHI::Image*> images)
136 {
137 m_imageCount = images.size();
138 for (auto img : m_images)
139 {
140 FCT_SAFE_RELEASE(img);
141 }
142 for (auto rtv : m_rtvs)
143 {
144 rtv->release();
145 }
146 for (auto dsv : m_dsvs)
147 {
148 dsv->release();
149 }
150 for (auto tv : m_tvs)
151 {
152 tv->release();
153 }
154 m_rtvs.clear();
155 m_dsvs.clear();
156 m_tvs.clear();
158 for (auto img : m_images)
159 {
160 FCT_SAFE_ADDREF(img);
161 }
162 m_width = images[0]->width();
163 m_height = images[0]->height();
164 delete m_behavior;
166 as(m_usage);
167 }
168
169 void MutilBufferImage::as(ImageUsages usage)
170 {
171 m_usage |= usage;
172 if (usage & ImageUsage::RenderTarget && m_rtvs.empty())
173 {
174 for (auto img : m_images)
175 {
176 auto rtv = m_ctx->createResource<RHI::RenderTargetView>();
177 rtv->image(img);
178 rtv->create();
179 m_rtvs.push_back(rtv);
180 }
181 }
182 if (usage & ImageUsage::DepthStencil && m_dsvs.empty())
183 {
184 for (auto img : m_images)
185 {
186 auto dsv = m_ctx->createResource<RHI::DepthStencilView>();
187 dsv->image(img);
188 while (!dsv->create());
189 m_dsvs.push_back(dsv);
190 }
191 }
192 if (usage & ImageUsage::Texture && m_tvs.empty())
193 {
194 for (auto img : m_images)
195 {
196 auto tv = m_ctx->createResource<RHI::TextureView>();
197 tv->image(img);
198 tv->create();
199 m_tvs.push_back(tv);
200 }
201 }
202 }
203
205 {
206 Image::bind(ctx);
207 }
208
210 {
211 if (m_rtvs.size()) {
212 return {this};
213 }
214 return {};
215 }
216
221
226
231
236
238 {
239 UpdateResult* res = new UpdateResult();
240 res->fence = m_ctx->createResource<RHI::Fence>();
241 m_images[m_ctx->currentFrameIndex()]->updateData(data,size,res->fence,&res->cleanUpCallback);
242 return res;
243 }
244
246 {
247 return reinterpret_cast<size_t>(m_tvs[0]);
248 }
249}
#define FCT_SAFE_ADDREF(p)
#define FCT_SAFE_RELEASE(obj)
ImageBehavior * m_behavior
定义 Image.h:87
virtual void bind(Context *ctx)
定义 Image.h:62
Context * m_ctx
定义 Image.h:88
Image(Context *ctx)
Samples m_samples
定义 Image.h:92
friend class BeforeCreateImageBehavior
定义 Image.h:51
Format m_format
定义 Image.h:91
int height() const
定义 Image.h:76
int width() const
定义 Image.h:75
MutilBufferAffterCreateImageBehavior(MutilBufferImage *image)
size_t textureViewHash() const override
std::vector< RHI::RenderTargetView * > m_rtvs
std::vector< RHI::DepthStencilView * > m_dsvs
RHI::RenderTargetView * currentTargetView() override
void bind(Context *ctx) override
UpdateResult * updateToCurrent(void *data, size_t size) override
std::vector< Image * > getTargetImages() override
void as(ImageUsages usage) override
RHI::TextureView * currentTextureView() override
RHI::DepthStencilView * currentDepthStencilView() override
std::vector< RHI::Image * > m_images
std::vector< RHI::TextureView * > m_tvs
void resize(uint32_t width, uint32_t height)
RHI::Image * currentImage() override
std::vector< RHI::Image * > images() const
friend class MutilBufferAffterCreateImageBehavior
void image(RHI::Image *image)
void width(uint32_t width)
定义 Image.h:41
void image(RHI::Image *image)
void image(RHI::Image *image)
RHI::Fence * fence
定义 Image.h:44
std::function< void()> cleanUpCallback
定义 Image.h:45