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
32 void MutilBufferImage::resize(uint32_t width, uint32_t height)
33 {
34 if (m_width == width && m_height == height)
35 {
36 return;
37 }
38
39 Format currentFormat = m_format;
40 Samples currentSamples = m_samples;
41 ImageUsages currentUsage = m_usage;
42 uint32_t currentImageCount = m_imageCount;
43
44 for (auto img : m_images)
45 {
47 }
48 m_images.clear();
49
50 for (auto rtv : m_rtvs)
51 {
52 rtv->release();
53 }
54 m_rtvs.clear();
55
56 for (auto dsv : m_dsvs)
57 {
58 dsv->release();
59 }
60 m_dsvs.clear();
61 for (auto tv : m_tvs)
62 {
63 tv->release();
64 }
65 m_tvs.clear();
66
67 m_width = width;
69
70 for (uint32_t i = 0; i < currentImageCount; ++i)
71 {
72 auto image = m_ctx->createResource<RHI::Image>();
73 image->width(m_width);
74 image->height(m_height);
75 image->format(currentFormat);
76 image->samples(currentSamples);
77 image->usage(currentUsage);
78 image->create();
79 m_images.push_back(image);
80 }
81
82 as(currentUsage);
83
84 if (m_currentIndex >= m_images.size() && !m_images.empty())
85 {
87 }
88
89 }
90
92 {
93 for (uint32_t i = 0; i < m_imageCount; ++i)
94 {
95 auto image = m_ctx->createResource<RHI::Image>();
96 image->width(m_width);
97 image->height(m_height);
98 image->format(m_format);
99 image->samples(m_samples);
100 image->usage(m_usage);
101 image->create();
102 m_images.push_back(image);
103 }
104
105 delete m_behavior;
107
108 as(m_usage);
109
110 if (m_currentIndex >= m_images.size() && !m_images.empty())
111 {
112 m_currentIndex = 0;
113 }
114 }
115 void MutilBufferImage::create(std::vector<RHI::Image*> images)
116 {
117 m_imageCount = images.size();
118 for (auto img : m_images)
119 {
120 FCT_SAFE_RELEASE(img);
121 }
122 for (auto rtv : m_rtvs)
123 {
124 rtv->release();
125 }
126 for (auto dsv : m_dsvs)
127 {
128 dsv->release();
129 }
130 for (auto tv : m_tvs)
131 {
132 tv->release();
133 }
134 m_rtvs.clear();
135 m_dsvs.clear();
136 m_tvs.clear();
138 for (auto img : m_images)
139 {
140 FCT_SAFE_ADDREF(img);
141 }
142 m_width = images[0]->width();
143 m_height = images[0]->height();
144 delete m_behavior;
146 as(m_usage);
147 }
148
149 void MutilBufferImage::as(ImageUsages usage)
150 {
151 m_usage |= usage;
152 if (usage & ImageUsage::RenderTarget && m_rtvs.empty())
153 {
154 for (auto img : m_images)
155 {
156 auto rtv = m_ctx->createResource<RHI::RenderTargetView>();
157 rtv->image(img);
158 rtv->create();
159 m_rtvs.push_back(rtv);
160 }
161 }
162 if (usage & ImageUsage::DepthStencil && m_dsvs.empty())
163 {
164 for (auto img : m_images)
165 {
166 auto dsv = m_ctx->createResource<RHI::DepthStencilView>();
167 dsv->image(img);
168 while (!dsv->create());
169 m_dsvs.push_back(dsv);
170 }
171 }
172 if (usage & ImageUsage::Texture && m_tvs.empty())
173 {
174 for (auto img : m_images)
175 {
176 auto tv = m_ctx->createResource<RHI::TextureView>();
177 tv->image(img);
178 tv->create();
179 m_tvs.push_back(tv);
180 }
181 }
182 }
183
185 {
186 Image::bind(ctx);
187 }
188
190 {
191 if (m_rtvs.size()) {
192 return {this};
193 }
194 return {};
195 }
196
201
206
211
216
218 {
219 UpdateResult* res = new UpdateResult();
220 res->fence = m_ctx->createResource<RHI::Fence>();
221 m_images[m_ctx->currentFrameIndex()]->updateData(data,size,res->fence,&res->cleanUpCallback);
222 return res;
223 }
224
226 {
227 return reinterpret_cast<size_t>(m_tvs[0]);
228 }
229}
#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